云切图

CSS

CSS属性复习,帮你快速掌握CSS,助推学生快速完成网页作业

首页 > 前端笔记 > CSS

熟练掌握CSS3中变形效果[下]

作者:admin 发布时间:2022-10-01 点击数:
<p>本章主要探讨 HTML5 中 CSS3 的变形效果,主要接着上节课的 2D 平面变形转换到 3D立体变形。</p><h2>一.3D 变形简介</h2><p>之前我们学习了元素的平移、旋转、缩放和倾斜等功能。这些效果只是单纯在二维平面图上的,我们称之为 2D。那么其实 CSS3 也提供了三维立体的一些功能效果,并且目前较新的主流浏览器都比较支持,只不过比 2D 晚一些,对浏览器的版本要求也要高一些。</p><p>由于 3D 是立体三维,在 x、y 轴的基础上一般会多出一个 z 轴,深入跃出轴。以下是3D 变形的属性值表,如下:</p><table><tbody><tr class="firstRow"><td width="592" valign="top" style="word-break: break-all;">属性值</td><td width="592" valign="top" style="word-break: break-all;">说明</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">translate3d(x,y,z)</td><td width="592" valign="top" style="word-break: break-all;">3D 方式平移元素,设置 x、y 和 z 轴</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">translateZ(z)</td><td width="592" valign="top" style="word-break: break-all;">设置 3D 方式平移元素的 z 轴</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">scale3d(x,y,z)</td><td width="592" valign="top" style="word-break: break-all;">3D 方式缩放一个元素</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">scaleZ(z)</td><td width="592" valign="top" style="word-break: break-all;">设置 3D 方式缩放元素的 z 轴</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">rotate3d(x,y,z,a)</td><td width="592" valign="top" style="word-break: break-all;">3d 方式旋转元素</td></tr><tr><td width="592" valign="top" style="word-break: break-all;"><p>rotateX(a)</p><p>rotateY(a)</p><p>rotateZ(a</p></td><td width="592" valign="top" style="word-break: break-all;">分别设置 3D 方式的旋转元素的 x、y 和 z 轴</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">perspective(长度值)</td><td width="592" valign="top" style="word-break: break-all;">设置一个透视投影矩阵</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">matrix3d(多个值)</td><td width="592" valign="top" style="word-break: break-all;">定义一个矩阵</td></tr></tbody></table><p>3D 变形比 2D 变形出来的要晚一些,所以如果需要兼容旧版本浏览器,可以对照这个表。具体如下:</p><table><tbody><tr class="firstRow"><td width="183" valign="top"><br/></td><td width="183" valign="top" style="word-break: break-all;">Opera</td><td width="183" valign="top" style="word-break: break-all;">Firefox</td><td width="183" valign="top" style="word-break: break-all;">Chrome</td><td width="183" valign="top" style="word-break: break-all;">Safari</td><td width="183" valign="top" style="word-break: break-all;">IE</td></tr><tr><td width="183" valign="top" style="word-break: break-all;">支持需带前缀</td><td width="183" valign="top" style="word-break: break-all;">15 ~ 22</td><td width="183" valign="top" style="word-break: break-all;">10 ~ 15</td><td width="183" valign="top" style="word-break: break-all;">12 ~ 35</td><td width="183" valign="top" style="word-break: break-all;">4 ~ 8</td><td width="183" valign="top" style="word-break: break-all;">无</td></tr><tr><td width="183" valign="top" style="word-break: break-all;">支持不带前缀</td><td width="183" valign="top" style="word-break: break-all;">23+</td><td width="183" valign="top" style="word-break: break-all;">16+<span style="white-space: pre;"> </span></td><td width="183" valign="top" style="word-break: break-all;">26+<span style="white-space: pre;"> </span></td><td width="183" valign="top" style="word-break: break-all;">无</td><td width="183" valign="top" style="word-break: break-all;">&nbsp;10.0+</td></tr></tbody></table><p>&nbsp;兼容版本完整形式</p><p>&nbsp;-webkit-transform: translateZ(200px);</p><p>&nbsp;-moz-transform: translateZ(200px);</p><p>&nbsp;-o-transform: translateZ(200px);</p><p>&nbsp;-ms-transform: translateZ(200px);</p><p>&nbsp;transform: translateZ(200px);</p><h2>&nbsp;二.transform-style</h2><p>&nbsp;transform-style 属性是指定嵌套元素如何在 3D 空间中呈现。</p><table><tbody><tr class="firstRow"><td width="592" valign="top" style="word-break: break-all;">&nbsp;属性值</td><td width="592" valign="top" style="word-break: break-all;">说明</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">&nbsp;flat</td><td width="592" valign="top" style="word-break: break-all;">默认值,表示所有子元素在 2D 平面呈现。</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">&nbsp;preserve-3d</td><td width="592" valign="top" style="word-break: break-all;">表示子元素在 3D 空间中呈现。</td></tr></tbody></table><p><strong>&nbsp;一般设置到当前元素的父元素</strong></p><p><span style="color: rgb(192, 0, 0);">&nbsp;transform-style: preserve-3d;</span></p><p>&nbsp;需要再配合后面的功能属性和变形配置,才能看到效果。同样,这个属性也需要加上各种厂商前缀。</p><h2>三.perspective</h2><p>perspective 是 3D 变形的重要属性,该属性会设置查看者的位置,并将可视内容映射到一个视锥上,继而投放到一个 2D 平面上。</p><table><tbody><tr class="firstRow"><td width="592" valign="top" style="word-break: break-all;">属性值</td><td width="592" valign="top" style="word-break: break-all;">说明</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">none</td><td width="592" valign="top" style="word-break: break-all;">默认值,表示无限的角度来看 3D 物体,但看上去是平的。</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">长度值</td><td width="592" valign="top" style="word-break: break-all;">接受一个长度单位大于 0 的值,其单位不能为百分比。值越大,角度出现的越远,就好比你离远一点看物体。值越小,正相反。</td></tr></tbody></table><p><strong>设置查看者的距离位置,一般设置在元素的父元素上</strong></p><p><span style="color: rgb(192, 0, 0);">perspective: 1000px;</span></p><p>需要再配合后面的功能属性和变形配置,才能看到效果。同样,这个属性也需要加上各种厂商前缀。</p><h2>四.3D 变形属性</h2><p>我们运用前面 3D 功能属性 transform-style 和 perspective 来构建 3D 变形效果。</p><p><strong>1.translate3d(x,y,z)</strong></p><p>需要 3D 位移的 HTML 结构,必须有父元素包含</p><p><span style="color: rgb(192, 0, 0);"><div id="a"><img src="img.png" alt=""/></div></span></p><p>CSS 部分,父元素设置 3D 呈现且设置透视距离;z轴可以是负值</p><p><span style="color: rgb(192, 0, 0);">#a {perspective: 1000px; transform-style: preserve-3d;}</span></p><p><span style="color: rgb(192, 0, 0);">img {transform: translate3d(300px,100px,240px);}</span></p><p><strong>2.translateZ(z)</strong></p><p>可以单独设置 z 轴,z 轴可以是负值</p><p><span style="color: rgb(192, 0, 0);">img {transform: translateZ(240px);}</span></p><p><strong>3.scale3d(x,y,z)</strong></p><p>3D 缩放,单独设置无效,需要配合角度</p><p><span style="color: rgb(192, 0, 0);">img {transform: scale3d(1,1,1.5) rotateX(45deg);}</span></p><p><strong>4.scaleZ(z)</strong></p><p>单独设置 z 轴,x 和 y 轴默认为 1</p><p><span style="color: rgb(192, 0, 0);">img {transform: scaleZ(1.5) rotateX(45deg);}</span></p><p><strong>5.rotate3d(x,y,z,a)</strong></p><p>设置 3D 旋转,a 表示角度,xyz 是 0 或 1 之间的数值</p><p><span style="color: rgb(192, 0, 0);">transform: rotate3d(1,0,0,45deg);</span></p><p><strong>6.rotateX(a)、rotateY(a)、rotateZ(a)</strong></p><p>单独设置 3D 旋转</p><p><span style="color: rgb(192, 0, 0);">transform: rotateX(45deg);</span></p><p><span style="color: rgb(192, 0, 0);">transform: rotateY(45deg);</span></p><p><span style="color: rgb(192, 0, 0);">transform: rotateZ(45deg);</span></p><p><span style="color: rgb(192, 0, 0);">transform: rotateX(45deg) rotateY(45deg) rotateZ(45deg);</span></p><p><img style="max-width:100%!important;height:auto!important;" src="/uploads/allimg/20221001/1-2210012146255T.jpg" title="熟练掌握CSS3中变形效果[下](图1)" alt="1.jpg"/></p><p>最后一个 matrix3d 就不多说了,忽略。CSS3 还提供了 perspective-origin 属性来设置 3D 变形中的源点角度。该属性默认值为 50% 50%也就是 center center。</p><table><tbody><tr class="firstRow"><td width="592" valign="top" style="word-break: break-all;">属性值</td><td width="592" valign="top" style="word-break: break-all;">说明</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">百分数值</td><td width="592" valign="top" style="word-break: break-all;">指定元素 x 轴或 y 轴的起点</td></tr><tr><td width="592" valign="top" style="word-break: break-all;">长度值</td><td width="592" valign="top" style="word-break: break-all;">指定距离</td></tr><tr><td width="592" valign="top" style="word-break: break-all;"><p>left</p><p>center</p><p>right</p></td><td width="592" valign="top" style="word-break: break-all;">指定 x 轴的位置</td></tr><tr><td width="592" valign="top" style="word-break: break-all;"><p>top</p><p>center</p><p>bottom</p></td><td width="592" valign="top" style="word-break: break-all;">指定 y 轴的位置</td></tr></tbody></table><p><strong>源点设置为右上方变形</strong></p><p><span style="color: rgb(192, 0, 0);">perspective-origin: top right;</span></p><p>CSS3 还提供了一个在元素中设置透视的值 perspective(长度值),但它还是和在父元素设置有一定不同。因为父元素整个作为透视,而元素自己作为透视,导致不同。</p><p><strong>具体测试看透视的距离</strong></p><p><span style="color: rgb(192, 0, 0);">img {transform: perspective(1000px) rotateY(45deg);}</span></p>

关注我们共同进步

  • 扣扣交流群

  • 微信公众号

  • 私技术顾问

嘿,我来帮您!