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

如何用CSS3画出懂你的3D立方体?

时间:2023-04-03 00:10:19 HTML

作者:首席填孔官?苏楠公众号:honeyBadger8,群:912594095,本文为原创,版权归作者所有,转载请注明原文链接和出处。前言  最近在写《每周动画点点系列》文章。上一期分享了<教你画跑车>。本期为大家带来一个用CSS3绘制的三维3D魔方。结合js制作想转就转,这里是@IT·平头哥联盟,我是首席填坑官?苏楠(南·苏),先看看效果,再破解下其实施过程。绘制过程:  好吧,gif看起来有点不清楚。想要在线预览的同学可以点击OnlinePreview?,话不多说,我们先来分析一下,看看这个功能是如何实现的。?API预热:这个例子是一个三维正方形。既然有立体效果,那么CSS3中就必须有-webkit-perspective-透视和preserve-3d-三维空间。这两个是重点,当然还有transform-Origin,transition,transform等。我们先来回说说API是怎样的:perspectivevalue:none:不指定透视;length:指定观察者与“z=0”平面的距离,使具有三维位置变换的元素产生透视效果。“z>0”的三维元素大于normal,当“z<0”小于normal时,大小由该属性值决定,不允许负值。transform-stylevalue:flat:指定子元素位于元素的平面内;preserve-3d:指定子元素定位在三维空间中,当属性值为preserve-3d时,该元素将创建一个局部堆叠上下文;summary:判断一个变形后的元素是出现在三维空间还是平面,元素的父元素需要定义<'transform-style'>属性。也就是说,如果一个元素想要有立体的效果,它的parent需要设置有preserve-3d。transform-originvalue:percentage:以百分比指定坐标值。它可以是负值;length:使用长度值指定坐标值。可以是负值;left:指定原点的横坐标为左;center①:指定原点横坐标为中心;右:指定原点的横坐标为右;top:指定原点的纵坐标为top;center②:指定原点的横坐标,纵坐标为center;bottom:指定原点的垂直坐标为bottom;transform、transition等,不再介绍/*perspective使用示例:*/div{-webkit-perspective:600px;perspective:600px;}/*transform-样式用法示例:*/.preserve{transform-style:preserve-3d;-webkit-transform-style:preserve-3d;}/*transform-origin用法示例:*/.preserve{-webkit-transform-origin:50%50%-100px;或-webkit-transform-origin:bottom;或-webkit-transform-origin:top;………}?画6个面:是的,我没记错,6个面:上、前、下、后、左、右,上面的API说了这么多,我们试试看,写6个div,结构大概是这样,也是下一个魔方需要的结构:

了解

of跨度>

魔法

!!!发生了什么??你惊喜吗??约定的是值越大透视效果越强?明明背后藏着一个女孩子,怎么就看不透呢?一开始我和你一样惊讶,但我瞬间意识到了。缺少旋转,所以我们添加它看看效果:.cube{width:200px;高度:200px;边距:10px自动;填充:260px;职位:相对;-webkit-perspective:600px;视角:600px;过渡:.5s;}.cube-inner{宽度:200px;高度:200px;职位:相对;-webkit-transform-style:preserve-3d;.3秒;-webkit-transform-origin:50%50%-100px;transform:rotateX(45deg);}.cube:hover{/*鼠标经过时将视角转换为100*/-webkit-perspective:100px;perspective:100px;}既然API是有效的,那么我们先下拉绘制6张脸,并按照顺序设置:上、前、下、后、左、右;首先,我们需要指定它们在3D空间中的preserve-3d,即6个面的parent需要设置transform-style样式;上面设置好之后,我们来看看6个面。为了区分它们,每一个都设置了不同的颜色(使用css3的渐变radial-gradient)——不想手写的同学推荐一个网站给你设置在线要获得所需的效果,只需复制样式即可。我们先来看看。为了方便观察,整体角度旋转了10deg:说到渐变,无意中发现了一个有趣的东西,叫hue-rotate,可以根据你的初始颜色。旋转元素的色调和它的内容来实现不同的效果了解有关hue-rotate的更多信息:hue-rotate()CSS函数可旋转元素及其内容的色调。它的结果是一个。上-“最”:.cube-inner.single-side。s1{/*s1顶部*/left:0;top:-200px;背景:径向渐变(圆形,rgba(255,255,255,.88),#00adff);背景:-webkit-radial-gradient(circle,rgba(255,255,255,.88),#00adff);变换原点:底部;-webkit-transform-origin:底部;变换:旋转X(90度);-webkit-transform:rotateX(90deg);}Front-"understand":below是默认的,什么都不用设置,所以不会显示;below-“you”:底部,底部设置与顶部恰好相反,一个原点以底部为坐标,另一个原点以顶部为坐标;.cube-inner.single-side.s3{/*s3bottom*/left:0;top:200px;背景:径向渐变(圆形,rgba(255,255,255,.88),#100067);背景:-webkit-径向渐变(圆形,rgba(255,255,255,.88),#100067);变换原点:顶部;-webkit-transform-origin:top;变换:旋转X(-90度);-webkit-transform:rotateX(-90deg);}back-"of":正面的背面,整体旋转135度,让背面看的更直观;translateZ和rotateX同时移动,形成透视关系,使其向后看前面;下图第二张,设置默认正面的透明度,可以看到背面的透视效果;.cube-inner.single-side.s4{/*s4back*/z-index:2;左:0;上:0;背景:径向渐变(圆形,rgba(255,255,255,.88),#F0C);背景:-webkit-径向渐变(圆形,rgba(255,255,255,.88),#F0C);变换:translateZ(-200px)rotateX(180deg);-webkit-transform:translateZ(-200px)rotateX(180deg);/*rotateZ(-180deg)左右旋转时,Z轴旋转180°,因为字符是倒置的*/}Leftside-“magic”:原点是基于右、左负元素宽度,rotateY轴旋转90度;.cube-inner.single-side.s5{/*s5左侧*/left:-200px;top:0;背景:径向渐变(圆形,rgba(255,255,255,.88),rgba(33,33,33,1));背景:-webkit-径向渐变(圆形,rgba(255,255,255,.88),rgba(33,33,33,1));变换原点:对;-webkit-transform-origin:right;transform:rotateY(-90deg)-webkit-transform:rotateY(-90deg)}Rightside-“square”:与右侧相同,与左侧相对;.立方体内部。single-side.s6{/*s6右侧*/right:-200像素;顶部:0;变换原点:左;-webkit-transform-origin:left;背景:径向渐变(圆形,rgba(255,255,255,.88),#f00);背景:-webkit-径向渐变(圆形,rgba(255,255,255,.88),#f00);变换:旋转Y(90度);-webkit-transform:rotateY(90deg);}总结:好了,上面魔方6个面的绘制过程基本完成了,主要在于transform-origin、rotate、translate等属性的应用,但是为了让它更酷一些,我们还需要在角落里加点光?添加亮点:细心的宝贝,之前的布局应该已经被发现了。在每一行布局的p标签中,多了一层span,这是高亮轻盈感的伏笔。一个平面正方形有四个边,只有前后两个,所以你必须再加一层。当然方法有很多,比如直接用border,但是比较麻烦。设置一个线性渐变,中间是白色,两个break过渡到透明,这样高光就在那里。来看一组图:?CSS360°rotation:上面是鼠标经过时的过渡动画,可以看到立体效果已经有了,那就写个CSSanimation动画吧,让它旋转360度,每一个角都能看到,所以看起来很666;动画与关键帧一起使用,请看代码示例:.cube.cube-inner{/*-webkit-transform:rotateX(180deg)rotateY(0deg);*/animation:elfCube10sinfiniteease-in-out;-webkit-animation:elfCube10s无限轻松交替;}@keyframeselfCube{0%{transform:rotateX(0deg)rotateY(0deg);}50%{变换:rotateX(360deg)rotateY(360deg);}100%{变换:rotateX(0deg)rotateY(0deg);}}@-webkit-keyframeselfCube{0%{-webkit-transform:rotateX(0deg)rotateY(0deg);}50%{-webkit-transform:rotateX(360deg)rotateY(360deg);}100%{变换:rotateX(0deg)rotateY(0deg);}}?用鼠标旋转:用鼠标旋转怎么样??不要惊慌,下一步是告诉你如何假装。飞行时,首先要了解鼠标在容器中的位置,X=e.pageX-ele.offsetLeft,Y=e.pageY-ele.offsetTop;同时需要知道元素中的中心点:centerX=width/2,centerY=height/2;然后取值:axisX=X-centerX,axisY=Y-centerY;PS:一开始试着想着鼠标从哪个方向进入,得到它的角度,但是发现旋转效果不明显,有兴趣的同学可以试试:(((Math.atan2(Y,X)*(180/Math.PI))+180)/90),参考司徒大神的JS判断鼠标从哪个方向进入容器;最后给容器绑定事件:mouseover、mousemove、mouseout,当鼠标进入时,暂停CSS动画,否则会互相打架!...getAxisX(e){让左=this.cubeEle.offsetLeft;返回e.pageX-左-(this.cubeW/2)*(this.cubeW>this.cubeH?this.cubeH/this.cubeW:1);}getAxisY(e){lettop=this.cubeEle.offsetTop;returne.pageY-top-(this.cubeH/2)*(this.cubeH>this.cubeW?this.cubeW/this.cubeH:1);}……………………run(){this.cubeEle.addEventListener('mouseover',(e)=>this.hoverOut(e),false);this.cubeEle.addEventListener('mousemove',(e)=>this.move(e),false);this.cubeEle.addEventListener('mouseout',(e)=>this.hoverOut(e),false);}hoverOut(e){//进入/离开e.preventDefault();this.axisX=this.getAxisX(e),this.axisY=this.getAxisY(e);if(e.type=='mouseout'){//离开this.axisX=0;这个.axisY=0;console.log("leave")this.cubeInner.className="cube-innerrunning";}else{this.cubeInner.className="立方体内部";console.log("回车")};letrotate=`rotateX(${-this.axisY}deg)rotateY(${-this.axisX}deg)`;this.cubeInner.style.WebkitTransform=this.cubeInner.style.transform=rotate;}...结束:-webkit-perspective,-webkit-transform-style,-webkit-transform-origin,radial-gradient,linear-gradient,transform:rotate,translate,scale,transition,animation;以上就是我今天给大家带来的分享,以及用到的知识点API。如果文章有不对的地方,请指正。想要学习更多前端知识记得关注我的获取文章源码->blog-resource?想直接在线预览?作者:苏南-首席填坑官交流群:912594095,公众号:honeyBadger8本文为原创,版权归作者所有,商业转载请联系@IT·平头哥联盟获得授权,转载请注明原文链接及非商业转载来源。