当前位置: 首页 > Web前端 > CSS

几行CSS让你的页面立体起来

时间:2023-03-30 16:54:21 CSS

几行CSS,让你的页面立体化返回稿收到了字节跳动的“米兰小铁匠”。几行CSS将使您的页面立体化。文章由浅入深,有示例代码可以借鉴。先看一个我们在产品中使用的简单例子:这种类似于翻牌的动画完全是通过CSS实现的,真正核心的部分只涉及三个简单的属性perspective、transform、backface-visibility,在下面的文章中部分,我会通过例子,一步步解释清楚。1.普通旋转众所周知,css3的transform属性可以对元素进行视觉上的变形操作,包括旋转操作(Rotate):@keyframesrotateX{0%{transform:rotateX(0)}100%{transform:rotateX(360deg)}}@keyframesrotateY{0%{transform:rotateY(0)}100%{transform:rotateY(360deg)}}@keyframesrotateZ{0%{transform:rotateZ(0)}100%{transform:rotateZ(360deg)}}.container{.z-rotateX{animation:rotateX10slinearinfinite;}.z-rotateY{动画:rotateY10s线性无限;}.z-rotateZ{动画:rotateZ10s线性无限;}}不掉帧的demo和源码可以看这里:https://codepen.io/mongooseso...下面是RotateX,RotateY,RotateZ旋转360°的动画效果,但是效果是只是平坦的,可能不容易理解。下面结合三维动态效果进行详细描述。2、三维旋转只是在效果上加了一行CSS:.container{perspective:800px;//......}不丢帧的demo和源码可以看这里:https://codepen.io/mongooseso......其实我们只加了perspective:800px这行代码。那么远景是什么意思呢?官方的解释是:perspective指定了观察者与z=0平面之间的距离,使得具有三维位置变换的元素产生透视效果。我们可以很简单的理解为屏幕视角到3D元素容器的距离。透视设置越小,感觉离屏幕上的3D越近,设置越大,感觉越远。当该属性存在时,表示该元素下的所有子元素都是三维的。默认情况下,元素的中心用作立足点。可以理解为你在看元素的中心。如果需要改变视角,可以使用perspective-origin属性。3、关于浏览器坐标系不得不问的一个问题是,RotateX、Y、Z是如何旋转的?在浏览器坐标系中,水平向右为X轴正向,垂直向下为Y轴正向,垂直向外为Z轴正向。例如transform:rotateX(45deg)表示旋转中心为X轴,顺时针旋转45度。如果参数为负数,则为逆时针旋转。识别时,我们可以使用左手定则,即左手大拇指指向对应轴的正方向,其他手指弯曲的方向为顺时针方向。为了方便理解,我找了两张图,表示我们的左手朝向X轴正方向,手指弯曲的方向朝向Y轴正方向。可以推断出旋转45度的效果是:友情提示:不要面对你我的同事和左手定则无关。如果做手势,一定不能用Y轴方向。如果您确实使用它,请告诉我医院的Wi-Fi有多好。所以上面动画中用到的RotateX、Y、Z就可以理解了,RotateZ不能产生3D效果的原因也就可以理解了。4.翻牌效果就像开头说的翻牌效果,是怎么实现的?上面说了透视是对子元素有效的,所以我们需要多一个卡片容器,两个div分别代表正面和背面。

卡片的公共属性很明显,卡片的两边都必须指定position:absolute,这样卡片才能叠在一起。另外,需要特别说明一下,就是本文的第二个重要属性backface-visibility:hidden,这个非常好理解。当一个元素指定rotateY(180deg)时,根据左手法则,元素的正面朝内,背面朝向我们。如果我们指定此属性,则背对我们的元素不再需要可见。.card{位置:绝对;顶部:0;backface-visibility:hidden;}Cardfront卡片的正面不需要任何特殊处理。只需在卡片背面指定transform:rotateY(180deg)即可。.backface{transform:rotateY(180deg);}cardsblock很明显,我们需要在cardsblock中添加transition:transform属性来增加动画效果,同时还需要用到第三个属性transform-style:preserve-3d在本文中。该属性值表示该元素下的所有子元素都在三维空间中,存在三维层次和覆盖关系。如果您的容器元素中有多个元素涉及重叠的3D变换,则此属性值是必需的。的。.cards{transition:transform1s;transform-style:preserve-3d;}container块的最后,作为最外层的容器,只需要设置perspective让子元素变成三维旋转,还需要设置position:relativeto使内部的绝对元素产生参考定位。.container{perspective:800px;position:relative;}一个简单的例子,详细的源码和demo在这里:https://codepen.io/mongooseso...5.你可能已经找到了3D魔方,标志在webpack官网其实是用CSS手写的,所以最后说一下如何结合已有的属性实现立方体的旋转。先上传完整的代码和demo:https://codepen.io/mongooseso...HTML格式类似卡片效果,我们的HTML格式大致如下
父组件的样式与卡片相同,需要为外层的cubes容器设置3D透视属性,最外面的容器container.cubes{transform-style:preserve-3d;transition:transform1s;width:100%;height:100%;}.container{position:relative;perspective:400px;width:200px;height:200px;}这里我们设置立方体的边长为200px,以400px的观察距离观察绘制六个面。玩过魔方的同学可能知道,为了记录魔方的转动,我们通常将魔方的六个面命名为前、后、左、右、上、下:不需要修改,其他边可以认为是向前侧各种旋转的结果:沿Y轴顺时针旋转180deg.back{transform:rotateY(180deg)}left:沿Y轴逆时针旋转90deg(你可以想想为什么是逆时针)。left{transform:rotateY(-90deg)}Right:沿Y轴顺时针旋转90deg.right{transform:rotateY(90deg)}Top:沿X轴顺时针旋转90deg.top{transform:rotateX(90deg)}Bottom:沿X轴逆时针旋转90deg.bottom{transform:rotateX(-90deg)}我们可以给不同的人脸标签加上背景色和图案来区分。而此时,六张面孔依旧交错。我们还需要调整“位置”来组合六个面在Demo中,我们将立方体的边长设置为200px,六个面的重叠中心仍然在立方体的中心,所以我们需要通过为每个面设置translateZ(100px)来正确调整立方体的位置,例如添加背面后,就会变成这样。back{transform:rotateY(180deg)translateZ(100px);}画动画很简单,我们可以画任何立方体的动画,有兴趣的还可以进一步画,比如魔方的打乱和还原过程6.实际场景使用CSS实现3D效果对于浏览器来说已经不是什么新技术了,但是在实际产品中还是很少用到。适当的动效可以提升产品体验,但复杂的动效会带来审美疲劳和开发负担。WebGL和D3.js确实是好东西,但是学习成本和开发成本非常高,需要付出很大的努力才能看到??实际的回报,而且应??用场景很少。所以如果你想摆脱2B场景下无聊的增删改查,2C场景下无聊的H5交互,不妨大胆使用成本极低的CSS3DTheEnd。如果您觉得这篇文章对您有帮助和启发,我想请您帮我两个小忙:1、点“赞”,让更多人看到这篇文章的内容;2.关注公众号“抖皮饭儿”,公众号后台回复“进群”加入我们一起学习;关注公众号的福利持续更新,公众号后台送学习资料:1.公众号后台回复“vis”,您还可以获得更多可视化免费学习资料。2.公众号后台回复“webgl”,还可以获得免费的webgl学习资料。3.公众号后台回复“算法”,还可以获得算法的学习资料。4.公众号后台回复“招聘”获取各种推荐。