DigitalOcean 为您的旅程的每个阶段提供云产品。 立即开始使用 价值 200 美元的免费积分!
transform
属性允许您通过倾斜、旋转、平移或缩放来视觉上操作元素
.element {
width: 20px;
height: 20px;
transform: scale(20);
}
即使声明了高度和宽度,此元素现在也将被缩放为其原始大小的二十倍
为该函数提供两个值将使它在水平方向上按第一个值拉伸,在垂直方向上按第二个值拉伸。 在以下示例中,该元素现在将是原始元素宽度的两倍,但高度是原始元素的一半
.element {
transform: scale(2, .5);
}
或者,您可以更具体地进行操作,而无需使用速记函数
transform: scaleX(2);
transform: scaleY(.5);
但是 scale()
只是许多可用的转换函数之一。
值
scale()
: 影响元素的大小。 这也适用于元素的font-size
、padding
、height
和width
。 它也是scaleX
和scaleY
函数的速记函数。skewX()
和skewY()
: 将元素向左或向右倾斜,就像将矩形变成平行四边形一样。skew()
是一个速记,它通过接受两个值来组合skewX()
和skewY
。translate()
: 将元素向侧面或上下移动。rotate()
: 从其当前位置顺时针旋转元素。matrix()
: 一个可能不是用手写的函数,但将所有转换组合成一个。perspective()
: 不影响元素本身,但影响后代元素的 3D 转换,使它们都具有一致的深度透视。
倾斜
/* Skew points along the x-axis */
.element {
transform: skewX(25deg);
}
/* Skew point along the y-axis */
.element {
transform: skewY(25deg);
}
/* Skew points along the x- and y-axis */
.element {
transform: skew(25deg, 25deg);
}
skewX
和 skewY
转换函数将元素向一个方向或另一个方向倾斜。 请记住:没有用于倾斜元素的速记属性,因此您需要使用这两个函数。 在下面的示例中,我们可以使用 skewX
将一个 100px x 100px 的正方形向左和向右倾斜
而在本示例中,我们可以使用 skewY
在垂直方向上倾斜元素
现在让我们使用 skew()
来组合这两个函数
旋转
.element {
transform: rotate(25deg);
}
这将从其原始位置顺时针旋转元素,而负值则会将其朝相反方向旋转。 这是一个简单的动画示例,其中一个正方形每三秒钟持续旋转 360 度
我们还可以使用 rotateX
、rotateY
和 rotateZ
函数,如下所示
平移
.element {
transform: translate(20px, 10px);
}
此转换函数将元素向侧面或上下移动。 为什么不直接使用 top/left/bottom/right? 嗯,有时会有点混乱。 我会认为它们是布局/定位(它们有更好的浏览器支持),而这个方法是将这些东西作为过渡或动画的一部分移动。
这些值可以是任何长度值,例如 10px 或 2.4em。 一个值将元素向右移动(负值向左移动)。 如果提供第二个值,则第二个值将将其向下移动(负值向上移动)。 或者,您可以更具体地进行操作
transform: translateX(value);
transform: translateY(value);
需要注意的是,使用 transform
的元素不会导致其他元素围绕它流动。 通过使用下面的 translate
函数并将绿色正方形从其原始位置 nudged 出来,我们将注意到周围的文本将保持固定,就好像正方形是一个块元素一样
还需要注意的是,如果您想对该属性进行动画处理,translate
将被硬件加速,而 position: absolute
则不会。
多个值
使用空格分隔的列表,您可以向 transform
属性添加多个值
.element {
width: 20px;
height: 20px;
transform: scale(20) skew(-20deg);
}
需要注意的是,这些转换将按照一定的顺序执行,在上面的示例中,将先执行 skew
,然后缩放元素。
矩阵
matrix
变换函数可以用来将所有变换组合成一个。它有点像变换简写,只是我不认为它真的打算手动编写。市面上有一些工具,比如 The Matrix Resolutions,可以将一组变换转换为单个矩阵声明。也许在某些情况下,这可以减少文件大小,尽管作者不友好的微优化可能不值得你花时间。
出于好奇,这个
rotate(45deg) translate(24px, 25px)
…也可以表示为
matrix(0.7071067811865475, 0.7071067811865476, -0.7071067811865476, 0.7071067811865475, -0.7071067811865497, 34.648232278140824)
3D 变换
上面大多数属性都有它们的 3D 版本。
translate3d(x, y, z)
translateZ(z)
translate3d
中的第三个值或 translateZ
中的值将元素移向观察者,负值则移开。
scale3d(sx, sy, sz)
scaleZ(sz)
scale3d
中的第三个值或 scaleZ
中的值会影响沿 z 轴的缩放(例如,从屏幕上直接出来的虚线)。
rotateX(value)
rotateY(value)
rotate3d(x, y, z)
rotateX
和 rotateY
会在 3D 空间中围绕这些轴旋转元素。rotate3d
允许你指定 3D 空间中的一点,围绕该点旋转元素。
matrix3d(…)
一种以编程方式在 4×4 网格中描述 3D 变换的方法。没有人会手动编写这些,永远不会。
perspective(value)
此值不会影响元素本身,但会影响后代元素的 3D 变换,使它们都具有一致的深度透视。
更多信息
- MDN 文档关于 transform 和 用法.
- David DeSandro 关于 3D 变换 的文档
- Surfin' Safari: 3D 变换
- W3C 关于 CSS3 变换的规范
- CSS 3D 变换简介
- 使用 CSS
translateZ()
和perspective()
的技巧(DigitalOcean)
相关属性
backface-visibility
.element { backface-visibility: hidden; }
perspective
.element { perspective: 1000px; }
perspective-origin
.element { perspective-origin: 25% 75%; }
transform-origin
.element { transform-origin: top left; }
transform-style
.element { transform-style: preserve-3d; }
will-change
.element { will-change: transform; }
随机事实: transform 创建了一个定位上下文,就像 position: relative;
一样。
浏览器支持
支持 2D 变换
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器从该版本开始支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
4* | 3.5* | 9* | 12 | 3.1* |
移动/平板
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 2.1* | 3.2* |
支持 3D 变换
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。数字表示浏览器从该版本开始支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
12* | 10* | 11 | 12 | 4* |
移动/平板
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 3* | 3.2* |
非常感谢。
3D 变换将很有用…
https://codepen.io/uiswarup/full/WPEZqd
3d 旋转
嗨,我不明白 transform 中的 ScaleZ。如果你更改 scaleX(2),它将缩放宽度,但我们没有元素的深度值,所以 scaleZ(3) 表示 3 * 0 = 0
所以 scaleZ 对元素没有影响
scalez(3) 等同于 z-index:3
快速说明
rotate3d()
实际上采用 4 个参数,如下所示其中前三个参数描述了您希望围绕其旋转的 3d 空间中的一个点;第四个参数是旋转元素的角度。
实际上,前三个参数是一个向量,描述了旋转轴。即它们采用无单位的
<number>
,而不是<length>
哇,谢谢
http://www.ituto.org
垃圾邮件…
垃圾邮件发送者
-webkit-transform: rotate(-2deg);
这不会在 Webkit 浏览器中占据其原始空间… 对我来说造成了一些问题
有没有办法也缩放该框内的文本?
是的,我们可以只取一个元素,比如 p。然后生成代码。
p{
-moz-transform: skewX(12deg) skewY(32deg);
-webkit-transform: skewX(12deg) skewY(32deg);
-o-transform: skewX(12deg) skewY(32deg);
-ms-transform: skewX(12deg) skewY(32deg);
transform: skewX(12deg) skewY(32deg);
}
在按钮:hover 上应用 transform(平移)时遇到问题 ?? 有人有解决方案或遇到类似问题。??
这是我的 css 文件的编码
Transform 在并非所有浏览器中都可用,因为它是一个新的 css 属性。因此您必须跨浏览器执行此操作。
对 Mozila FireFox 使用 -moz-transform,对 Safari、Chrome… 使用 -webkit-transform。
你的代码前面有一个“`”,这就是原因。
为什么这两段代码相同?我同意两者中的 rotate,但 matrix 中的 tanslate 必须是 24,25 而不是 -0.7071067811865497, 34.648232278140824。
1) rotate(45deg) translate(24px, 25px)
2) matrix(0.7071067811865475, 0.7071067811865476, -0.7071067811865476, 0.7071067811865475, -0.7071067811865497, 34.648232278140824)
matrix 函数将接受这些值,这些值代表其他值,如下所示。
matrix( x 缩放, y 倾斜, x 倾斜, y 缩放, x 平移 (位置), y 平移 (位置) )
额外
如果您想下载免费徽标,这里就是地方。
http://www.bestfreelogo.com/vector-logos/abstract/
2D 变换在 IE 9+ 中有效,通过前缀 -ms- 有效
你能告诉我如何在 Adobe Flash CS3 中进行 3D 旋转吗?可以是代码或其他方式。
真的很酷!
感谢您的时间。
看起来 skewX 的正值是逆时针方向,而 rotateX 的值是顺时针方向。我认为这很奇怪,所以你的 skewX(25deg) 示例是错误的。
你好 Ruud,你知道为什么 skewX 的正值是逆时针而不是顺时针吗?我一直不明白为什么它会那样工作。还有 Chris,希望能得到你的解答。
在理解了所有逻辑后,我也得出了这个结论。有人知道原因吗?这似乎是一个例外,让人很难理解应用某些值后会发生什么。
scale 属性使图像从宽度和高度为零的地方进行缩放。
我正在使用滚动来放大或缩小图像。但当我开始滚动时,图像会缩小到可能只有一个像素,并根据该像素进行缩放。
是否有 0 到 100 的属性来操作 “scale” 使其像 100 到 110 那样?
值得注意的是,现在有一个
skew
简写,类似于skew(10deg, 10deg)
。如上文 Skew 部分所示,skewX(25deg) 将其向右倾斜。对我来说这是有道理的(但实际上我们都错了,Chris)。因为它实际上是向左倾斜。我无法将其与坐标系联系起来,正度数应该实际上是向右倾斜。
你好..
其实我的问题有点离题,但你能帮我看看你的活动菜单中的那个箭头吗?
当 HTML 或 SCSS 或 Result 处于活动状态时,那个向下的箭头...
请帮忙...
提前感谢... :)
skewX()
和skewY()
: 将元素向左或向右倾斜,就像将三角形变成平行四边形。=> 将正方形变成平行四边形,而不是三角形(或者我不明白)。
或者实际上是一个矩形。
哇
没错,就是这样。应该是正方形变成平行四边形,而不是三角形。
如果以错误的顺序添加 scale 和 translate,scale 会如何影响 translate 真是奇怪。
如果我写
transform: scale(.05, .05) translateX(100px);
…它只移动了 5 个像素。
就像距离增加了,或者 translate 像素也被缩放了一样。
然而,如果我这样写
transform: translateZ(-2000px) translateX(400px);
…它会变小,但仍然从屏幕深处的原始位置移动 400 像素。
在第二种情况下,如果 translateX 是相对于屏幕新距离的水平移动,我会理解,但 scale 与透视无关,对吧?
既然这个帖子还在,我可能会再尝试一次,看看是否有人能对上面的问题给出合乎逻辑的解释。
为什么当我先缩小元素再平移时,translate 值会“缩放”,但当我将其向 Z 轴后移时却不会?
我试着解答一下。我认为,在第一种情况下,这是因为你缩小到 5%,然后应用了 100px 的变换。所以 5% 的它就是 5px。如果你改变这两个变换的顺序,你就会得到你想要的效果。
我非常确定这与变换的顺序有关。他们在上面的文章中简要地提到了这一点,但只说明了 skew 是在 scale 之前应用的。我认为顺序是 [skew -> scale -> translate]。
好的。感谢 Scott 和 Carry 的回答。我意识到这就是造成这种情况的原因。我猜只需要记住它就行了。
Cary,我不认为有一个确定的顺序,它取决于哪个指令先写。我今天才学到 ‘translate (x, y) scale(z)’ != ‘scale(z) translate(x, y)’
一个非常有用的 npm 插件 gulp-autoprefixer,gulp-autoprefixer 可以为你节省手动将特定于浏览器的属性添加到 CSS 的时间。
嘿,伙计们!有谁愿意告诉我为什么它不像默认规范所说的那样从中心旋转……我卡住了
http://codepen.io/icommstudios/pen/eZpgEB
FYI,更改 transform-origin 也没有效果……
只是猜测,它可能先应用缩放,然后再旋转。缩放的改变可能会改变旋转中心。
这很奇怪,Opera 基于 Chrome,为什么没有 3D 支持呢?
我遇到了一个奇怪的问题。在 Edge 中,我发现我的一个 Kendo 窗口出现了不必要的滚动条。奇怪的是,在窗口中的图标上使用 -webkit-transform 可以消除滚动条。我不确定这是否是正确的解决方案。我遗漏了什么?
使用
Scale3d(transform(rotateY: ): 20px): 10px);
对我来说似乎不起作用。有什么想法吗?
如果我想删除 transform 属性,该怎么做呢?
你当然可以手动编写矩阵。所有其他变换只是矩阵的简写。学习矩阵数学将教会你为什么不同顺序的变换会以它们的方式工作。
4×4 矩阵有 3 部分
左上角的 3×3 矩阵描述线性变换
右侧是平移量
底部用于透视。(通常你希望底部只有 0 0 0 1,它什么也不做。)
线性变换矩阵包含三个垂直的 3D 向量。它们分别描述了 x、y 和 z 轴如何变换。想象一下抓住每个轴并旋转和拉伸它,直到它成为相应的向量,并想象一下轴之间的空间是与轴相连的橡胶。想要更详细的解释,请观看此视频:https://www.youtube.com/watch?v=kYB8IZa5AuE
大家好,
是否必须使用以下内容来支持所有浏览器?
-webkit-transform: value;
-moz-transform: value;
-ms-transform: value;
-o-transform: value;
transform: value;
我相信值得一提的是,transform 仅适用于某些
display
类型。我阅读了这篇文章,并写下了这段简单的代码和
它看起来没问题,但它不起作用,因为
<span>
是一个内联元素。这个问题可以通过理解这一点来解决,只需在.close
规则中添加display: inline-block
即可。因此,我相信如果这篇文章提到了哪些元素可以被每个变换函数目标化,它将得到改进。Transform 似乎会破坏元素内的效果/操作。例如,background-attachement:fixed; 或 :hover 在应用了变换的 div 或其子元素中不起作用(未完全测试)。
你以三种不同的方式提到了变换函数
1) “但 scale() 只是许多可用的变换 函数 之一:”
2) “使用以空格分隔的列表,你可以向 transform 属性添加多个 值:”
3) “大多数上述 属性 都有它们的 3D 版本。”
正确的术语只是函数吗?
这篇文章需要更新吗?有一个倾斜的简写属性!
https://mdn.org.cn/en-US/docs/Web/CSS/transform-function/skew
感谢提醒!我把它加进去了。:)
你没有提到 CSS 变换在列表中激活的顺序。
“值得注意的是,这些变换的执行顺序,在上面的例子中,
skew
将首先执行,然后元素将被缩放。”有一个情况你需要使用 position:top 动画——当你想要向下滑动内容并且有一个固定的头部时,因为 https://stackoverflow.com/a/15256339/452587.
为什么使用 JavaScript 从 0 度旋转到 360 度不起作用?
您好,感谢您的文章
我使用“transform”来使标题字体(没有缩写版本)更加紧凑。
但我遇到了调整整个容器大小的问题。
如何只指示文本压缩,同时保持容器的正常自适应大小?
h3.name-class {
transform: scale(0.8,1);
transform-origin: left;
}
谢谢
刚刚发现 SkewJS:https://github.com/wiserim/Skew
任何曾经寻找可靠像素倾斜元素的方法的人应该看看。
我不知道为什么这个仓库如此不出名。使用 deg-values 处理倾斜的内容在地球上简直是地狱,尤其是在响应式设计中。希望 CSS 未来会支持像素值。