教你玩转CSS3的3D效果

css33d起步

要玩转css3的3d,就必须了解几个词汇,便是透视(perspective)、旋转(rotate)和移动(translate)。透视即是以现实的视角来看屏幕上的2d事物,从而展现3d的效果。旋转则不再是2d平面上的旋转,而是三维坐标系的旋转,就包括x轴,y轴,z轴旋转。平移同理。

当然用理论来说明,估计你还不明白。下面是3个gif:

沿着X轴旋转
教你玩转CSS3的3D效果

沿着Y轴旋转
教你玩转CSS3的3D效果

沿着Z轴旋转
教你玩转CSS3的3D效果

立即学习“前端免费学习笔记(深入)”;

旋转应该没问题了,那理解平移起来就比较容易了,就是在在X轴、Y轴、z轴移动。

你可能会说透视比较不好理解,下面我介绍一下透视的几个属性。

perspective

perspective英文名便是透视,没有这东西就没办法形成3D效果,但是这个东西是怎么让我们浏览器形成3D 效果的呢,可以看下面这张图,其实学过绘画的应该知道透视关系,而这里就是这个道理。

教你玩转CSS3的3D效果

但是在css里它是有数值的,例如perspective: 1000px这个代表什么呢?我们可以这样理解,如果我们直接眼睛靠着物体看,物体就超大占满我们的视线,我们离它距离越来越大,它在变小,立体感也就出来了是不是,其实这个数值构造了一个我们眼睛离屏幕的距离,也就构造了一个虚拟3D假象。

perspective-origin

由上面我们了解了perspective,而加上了这个origin是什么,我们前面说的这个是眼睛离物体的距离,而这个就是眼睛的视线,我们的视点的不同位置就决定了我们看到的不同景象,默认是中心,为perspectice-origin: 50% 50%,第一个数值是 3D 元素所基于的 X 轴,第二个定义在 y 轴上的位置

当为元素定义 perspective-origin 属性时,其子元素会获得透视效果,而不是元素本身。必须与 perspective 属性一同使用,而且只影响 3D 转换元素。(W3school)

教你玩转CSS3的3D效果

transform-style

perspective又来了,没错,它是css中3D的关键,transform-style默认是flat,如果你要在元素上视线3D效果的话,就必须用上transform-style: preserve-3d,否则就只是平面的变换,而不是3D的变换

手把手带你玩转css3-3d

以上我们稍微了解概念,下面就开始实战吧!

我们看一个效果,是不是很酷炫~

教你玩转CSS3的3D效果

如果图片加载不出来,就直接访问https://bupt-hjm.github.io/css3-3d/,觉得可以的话记得给star咯hh

第一步:html结构

很简单的一个容器包裹着一个装了6个piecepiece-box

第二步: 加上必要的3D属性,进入3D世界

通过上面的讲解,应该对perspective比较熟悉了吧,

/*容器*/.container {    -webkit-perspective: 1000px;    -moz-perspective: 1000px;    -ms-perspective: 1000px;    perspective: 1000px;}/*piece盒子*/ .piece-box {        perspective-origin: 50% 50%;        -webkit-transform-style: preserve-3d;        -moz-transform-style: preserve-3d;        -ms-transform-style: preserve-3d;        transform-style: preserve-3d;}

第三步:加入必要的样式

/*容器*/.container {    -webkit-perspective: 1000px;    -moz-perspective: 1000px;    -ms-perspective: 1000px;    perspective: 1000px;}/*piece盒子*/.piece-box {    position: relative;    width: 200px;    height: 200px;    margin: 300px auto;    perspective-origin: 50% 50%;    -webkit-transform-style: preserve-3d;    -moz-transform-style: preserve-3d;    -ms-transform-style: preserve-3d;    transform-style: preserve-3d;}/*piece通用样式*/.piece {    position: absolute;    width: 200px;    height: 200px;    background: red;    opacity: 0.5;}.piece-1 {    background: #FF6666;}.piece-2 {    background: #FFFF00;}.piece-3 {    background: #006699;}.piece-4 {    background: #009999;}.piece-5 {    background: #FF0033;}.piece-6 {    background: #FF6600;}

当然,在你完成这步之后你还是只看到一个正方形,也就是我们的piece-6,因为我们的3Dtransform还没开始

教你玩转CSS3的3D效果

第四步:3D变换来袭

首先是实现走马灯,我们先不要让它走,先实现灯部分。

如何实现呢?因为要构成一个圆,圆是360度,而我们有6个piece,那么,很容易想到,我们需要把每一个piece以递增60度的方式rotateY,就变成如下

教你玩转CSS3的3D效果
如何把他们从中心拉开呢?

这里我们还要注意一点,在我们使元素绕Y轴旋转以后,其实X轴和Z轴也会跟着旋转,所所以正方体的每个面的垂直线还是Z轴,我们就只需要改变下translateZ的值,而当translateZ为正的时候,就朝着我们的方向走来,这样就可以拉开了

但是拉开的距离如何衡量?

教你玩转CSS3的3D效果

是不是一目了然了~

下面我们再修改下css

.piece-1 {    background: #FF6666;    -webkit-transform: rotateY(0deg) translateZ(173.2px);    -ms-transform: rotateY(0deg) translateZ(173.2px);    -o-transform: rotateY(0deg) translateZ(173.2px);    transform: rotateY(0deg) translateZ(173.2px);}.piece-2 {    background: #FFFF00;    -webkit-transform: rotateY(60deg) translateZ(173.2px);    -ms-transform: rotateY(60deg) translateZ(173.2px);    -o-transform: rotateY(60deg) translateZ(173.2px);    transform: rotateY(60deg) translateZ(173.2px);}.piece-3 {    background: #006699;    -webkit-transform: rotateY(120deg) translateZ(173.2px);    -ms-transform: rotateY(120deg) translateZ(173.2px);    -o-transform: rotateY(120deg) translateZ(173.2px);    transform: rotateY(120deg) translateZ(173.2px);}.piece-4 {    background: #009999;    -webkit-transform: rotateY(180deg) translateZ(173.2px);    -ms-transform: rotateY(180deg) translateZ(173.2px);    -o-transform: rotateY(180deg) translateZ(173.2px);    transform: rotateY(180deg) translateZ(173.2px);}.piece-5 {    background: #FF0033;    -webkit-transform: rotateY(240deg) translateZ(173.2px);    -ms-transform: rotateY(240deg) translateZ(173.2px);    -o-transform: rotateY(240deg) translateZ(173.2px);    transform: rotateY(240deg) translateZ(173.2px);}.piece-6 {    background: #FF6600;    -webkit-transform: rotateY(300deg) translateZ(173.2px);    -ms-transform: rotateY(300deg) translateZ(173.2px);    -o-transform: rotateY(300deg) translateZ(173.2px);    transform: rotateY(300deg) translateZ(173.2px);}

是不是已经实现了走马灯了?

教你玩转CSS3的3D效果

第五步:animation让3D动起来

要实现走马灯动,其实很简单,我们只要在piece-box上加上旋转动画就行了,5s完成动画,从0度旋转到360度

/*piece盒子*/.piece-box {    position: relative;    width: 200px;    height: 200px;    margin: 300px auto;    perspective-origin: 50% 50%;    -webkit-transform-style: preserve-3d;    -moz-transform-style: preserve-3d;    -ms-transform-style: preserve-3d;    transform-style: preserve-3d;    animation: pieceRotate 5s;    -moz-animation: pieceRotate 5s; /* Firefox */    -webkit-animation: pieceRotate 5s; /* Safari and Chrome */    -o-animation: pieceRotate 5s ; /* Opera */}/*走马灯动画*/@keyframes pieceRotate{0%   {-webkit-transform: rotateY(0deg);        -ms-transform: rotateY(0deg);        -o-transform: rotateY(0deg);        transform: rotateY(0deg);}100% {-webkit-transform: rotateY(360deg);        -ms-transform: rotateY(360deg);        -o-transform: rotateY(360deg);        transform: rotateY(360deg);}}/* Firefox */@-moz-keyframes pieceRotate{0%   {-webkit-transform: rotateY(0deg);        -ms-transform: rotateY(0deg);        -o-transform: rotateY(0deg);        transform: rotateY(0deg);}100% {-webkit-transform: rotateY(360deg);        -ms-transform: rotateY(360deg);        -o-transform: rotateY(360deg);        transform: rotateY(360deg);}}/* Safari and Chrome */@-webkit-keyframes pieceRotate{0%   {-webkit-transform: rotateY(0deg);        -ms-transform: rotateY(0deg);        -o-transform: rotateY(0deg);        transform: rotateY(0deg);}100% {-webkit-transform: rotateY(360deg);        -ms-transform: rotateY(360deg);        -o-transform: rotateY(360deg);        transform: rotateY(360deg);}}/* Opera */@-o-keyframes pieceRotate{0%   {-webkit-transform: rotateY(0deg);        -ms-transform: rotateY(0deg);        -o-transform: rotateY(0deg);        transform: rotateY(0deg);}100% {-webkit-transform: rotateY(360deg);        -ms-transform: rotateY(360deg);        -o-transform: rotateY(360deg);        transform: rotateY(360deg);}}

这里就不放gif了~hhh是不是实现了酷炫的效果,还没结束哦~更酷炫的正方体组装

正方体,其实也不难实现,我这里就不很详细说了,你首先可以想象一个面,然后去拓展其他面如何去实现,比如我们把正方体的前面translateZ(100px)让它靠近我们100px,然后后面translateZ(-100px)让它远离我们100px,左边是先translateX(-100pxrotateY(90deg),右边就是translateX(100px)rotateY(90deg),上面是先translateY(-100px)rotateX(90deg),下面是先translateY(100px)rotateX(90deg),只要我们写进动画,一切就大功告成。

css就为如下,以下就只放piece1,其他读者可以自己类比实现,或者看我github的源码

.piece-1 {     background: #FF6666;     -webkit-transform: rotateY(0deg) translateZ(173.2px);     -ms-transform: rotateY(0deg) translateZ(173.2px);     -o-transform: rotateY(0deg) translateZ(173.2px);     transform: rotateY(0deg) translateZ(173.2px);     animation: piece1Rotate 5s 5s;     -moz-animation: piece1Rotate 5s 5s; /* Firefox */     -webkit-animation: piece1Rotate 5s 5s; /* Safari and Chrome */     -o-animation: piece1Rotate 5s 5s; /* Opera */     -webkit-animation-fill-mode: forwards; /* Chrome, Safari, Opera */      animation-fill-mode: forwards; }/*front*/ @keyframes piece1Rotate { 0%   {-webkit-transform: rotateY(0deg) translateZ(173.2px);     -ms-transform: rotateY(0deg) translateZ(173.2px);     -o-transform: rotateY(0deg) translateZ(173.2px);     transform: rotateY(0deg) translateZ(173.2px);} 100% {-webkit-transform: rotateY(0deg)  translateZ(100px);     -ms-transform:  rotateY(0deg) translateZ(100px);     -o-transform: rotateY(0deg)  translateZ(100px);     transform:  rotateY(0deg) translateZ(100px);} } /* Firefox */ @-moz-keyframes piece1Rotate { 0%   {-webkit-transform: rotateY(0deg) translateZ(173.2px);     -ms-transform: rotateY(0deg) translateZ(173.2px);     -o-transform: rotateY(0deg) translateZ(173.2px);     transform: rotateY(0deg) translateZ(173.2px);} 100% {-webkit-transform: rotateY(0deg)  translateZ(100px);     -ms-transform:  rotateY(0deg) translateZ(100px);     -o-transform: rotateY(0deg)  translateZ(100px);     transform:  rotateY(0deg) translateZ(100px);} } /* Safari and Chrome */ @-webkit-keyframes piece1Rotate { 0%   {-webkit-transform: rotateY(0deg) translateZ(173.2px);     -ms-transform: rotateY(0deg) translateZ(173.2px);     -o-transform: rotateY(0deg) translateZ(173.2px);     transform: rotateY(0deg) translateZ(173.2px);} 100% {-webkit-transform: rotateY(0deg)  translateZ(100px);     -ms-transform:  rotateY(0deg) translateZ(100px);     -o-transform: rotateY(0deg)  translateZ(100px);     transform:  rotateY(0deg) translateZ(100px);} } /* Opera */ @-o-keyframes piece1Rotate { 0%   {-webkit-transform: rotateY(0deg) translateZ(173.2px);     -ms-transform: rotateY(0deg) translateZ(173.2px);     -o-transform: rotateY(0deg) translateZ(173.2px);     transform: rotateY(0deg) translateZ(173.2px);} 100% {-webkit-transform: rotateY(0deg)  translateZ(100px);     -ms-transform:  rotateY(0deg) translateZ(100px);     -o-transform: rotateY(0deg)  translateZ(100px);     transform:  rotateY(0deg) translateZ(100px);} }

细心的读者可以发现我用了一个animation-fill-mode: forwards;,这个其实就是让这些piece保持动画最后的效果,也就是正方体的效果,读者可以不加试试看,那还是会恢复原样。

最后就是正方体的旋转了,前面我们的容器已经用过animation了,读者可能会想我再加个class放animaiton不就行了,hhh,animaiton会覆盖掉前面的,那前面的走马灯的动画就没了,所以在html结构中,我再加了一个box包裹piece, 如下

在动画上我们可以控制正方体动画的延时时间,就是等到正方体组装完成后再开始动画

animation: boxRotate 5s 10s infinite;第一个5s是动画时长,第二个10s是延时时间,然后我们让正方体的旋转,绕X轴从0度到360度,绕Y轴也0到Y轴360度。

.piece-box2 {    -webkit-transform-style: preserve-3d;    -moz-transform-style: preserve-3d;    -ms-transform-style: preserve-3d;    transform-style: preserve-3d;    animation: boxRotate 5s 10s infinite;    -moz-animation: boxRotate 5s 10s infinite; /* Firefox */    -webkit-animation: boxRotate 5s 10s infinite; /* Safari and Chrome */    -o-animation: boxRotate 5s 10s infinite; /* Opera */}/*正方体旋转动画*/@keyframes boxRotate{0%   {-webkit-transform: rotateX(0deg) rotateY(0deg););    -ms-transform: rotateX(0deg) rotateY(0deg););    -o-transform: rotateX(0deg) rotateY(0deg););    transform: rotateX(0deg) rotateY(0deg););}100% {-webkit-transform: rotateX(360deg) rotateY(360deg);    -ms-transform: rotateX(360deg) rotateY(360deg);    -o-transform: rotateX(360deg) rotateY(360deg);    transform: rotateX(360deg) rotateY(360deg);}}/* Firefox */@-moz-keyframes boxRotate{0%   {-webkit-transform: rotateX(0deg) rotateY(0deg););    -ms-transform: rotateX(0deg) rotateY(0deg););    -o-transform: rotateX(0deg) rotateY(0deg););    transform: rotateX(0deg) rotateY(0deg););}100% {-webkit-transform: rotateX(360deg) rotateY(360deg);    -ms-transform: rotateX(360deg) rotateY(360deg);    -o-transform: rotateX(360deg) rotateY(360deg);    transform: rotateX(360deg) rotateY(360deg);}}/* Safari and Chrome */@-webkit-keyframes boxRotate{0%   {-webkit-transform: rotateX(0deg) rotateY(0deg););    -ms-transform: rotateX(0deg) rotateY(0deg););    -o-transform: rotateX(0deg) rotateY(0deg););    transform: rotateX(0deg) rotateY(0deg););}100% {-webkit-transform: rotateX(360deg) rotateY(360deg);    -ms-transform: rotateX(360deg) rotateY(360deg);    -o-transform: rotateX(360deg) rotateY(360deg);    transform: rotateX(360deg) rotateY(360deg);}}/* Opera */@-o-keyframes boxRotate{0%   {-webkit-transform: rotateX(0deg) rotateY(0deg););    -ms-transform: rotateX(0deg) rotateY(0deg););    -o-transform: rotateX(0deg) rotateY(0deg););    transform: rotateX(0deg) rotateY(0deg););}100% {-webkit-transform: rotateX(360deg) rotateY(360deg);    -ms-transform: rotateX(360deg) rotateY(360deg);    -o-transform: rotateX(360deg) rotateY(360deg);    transform: rotateX(360deg) rotateY(360deg);}}

最后效果,大功告成!

教你玩转CSS3的3D效果

以上就是教你玩转CSS3的3D效果的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1608087.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 21:29:30
下一篇 2025年12月23日 21:29:39

相关推荐

  • CSS3中content的属性详解

    css中主要的伪元素有四个:before/after/first-letter/first-line,在before/after伪元素选择器中,有一个content属性,能够实现页面中的内容插入。 插入纯文字 content : ”插入的文章”,或者 content:none 不插入内容 #html…

    好文分享 2025年12月23日
    000
  • 使用CSS3媒体查询方法总结

    首先我们在使用media的时候需要先设置下面这段代码,来兼容移动设备的展示效果: 准备工作1:设置Meta标签 这段代码的几个参数解释: width = device-width:宽度等于当前设备的宽度 initial-scale:初始的缩放比例(默认设置为1.0)   minimum-scale:…

    好文分享 2025年12月23日
    000
  • 纯CSS3写的10个不同的酷炫图片遮罩层效果

    这个是纯CSS3实现的的10个不同的酷炫图片遮罩层效果,可以欣赏一下 实例代码 纯CSS3写的10个不同的酷炫图片遮罩层效果 @@##@@ PHP中SESSION和COOKIE基本用法 在项目中我们会经常用到Session和Cookie,比如用户登录验证、记录用户浏览历史,存储购物车数据,限制用户会…

    2025年12月23日 好文分享
    000
  • CSS3中的变形与动画详细说明

      最近在学习制作移动端的页面,做了一个微信页面的小demo,其中用到了很多的CSS3新增的内容,其中就有CSS3新增的变形和动画。其实这种CSS3的动画效果用JS也可以实现,不过CSS3能开启硬件加速,性能更好。    (下面均没写浏览器前缀,如有需要请自行添加~~) CSS3常见的动画效果的实现…

    好文分享 2025年12月23日
    000
  • 使用CSS实现Footer置底的五种方式

    页脚置底(Sticky footer)就是让网页的footer部分始终在浏览器窗口的底部。 当网页内容足够长以至超出浏览器可视高度时,页脚会随着内容被推到网页底部;但如果网页内容不够长,置底的页脚就会保持在浏览器窗口底部。 方法一:将内容部分的margin-bottom设为负数 footer htm…

    2025年12月23日
    000
  • 使用CSS3时限随内容自动伸缩的背景

    css3给我们带来一个非常实用的新属性:border-image,利用这个属性我们可以做出随着内容的增减自动伸缩的背景。废话不多说,看代码!html:     第一条列表内容     第二条列表内容     第三条列表内容     第四条列表内容     第五条列表内容 css:border: 20…

    2025年12月23日 好文分享
    000
  • 详解CSS3背景相关样式实例代码

    这篇文章详解css3背景相关样式实例代码 background-image绘制多张图片叠加,示例如下: background-image绘制多张图片叠加 div{ width:1100px; height:800px; background-image: url(“../../image/icon1…

    好文分享 2025年12月23日
    000
  • 利用纯css3实现圆形从中心向四周扩散动画效果代码

    先来个简单的示例,例如: @keyframes hovertreemove{from {top:30px;}to {top:130px;}} 效果:http://hovertree.com/texiao/css3/37/1.htm 可以通过 @keyframes 规则,创建动画。 创建动画的原理是,…

    好文分享 2025年12月23日
    000
  • 分享一个FlexBox标准及兼容写法速查表

    以上就是分享一个FlexBox标准及兼容写法速查表的详细内容,更多请关注创想鸟其它相关文章!

    好文分享 2025年12月23日
    000
  • 利用CSS3实现头像旋转效果实例代码

    本篇文章主要介绍了css3实现头像旋转效果,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 鼠标未放上效果: 鼠标放上之后旋转效果: transition: all 2.0s;表示所有的属性变换在2秒内完成; transform: rotate(360deg);表示图片旋…

    2025年12月23日
    000
  • 解析CSS3中nth-child与nth-of-type的区别

    css3中nth-child与nth-of-type的区别其实很简单::nth-of-type为什么要叫:nth-of-type?因为它是以”type”来区分的。也就是说:ele:nth-of-type(n)是指父元素下第n个ele元素, 而ele:nth-child(n)是…

    2025年12月23日 好文分享
    000
  • CSS3让登陆面板3D旋转起来实例代码

    点击登陆面板会发生360度旋转,并显示信息,真正使用css3让登陆面板3d旋转起来,如何实现登陆面板3d旋转,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了利用CSS3实现登陆面板3D旋转起来的具体代码,供大家参考,具体内容如下 效果图: 点击登陆,登陆面板会发生360度旋转,并显示信息。 旋转…

    2025年12月23日
    000
  • 使用CSS3过渡transition效果实例介绍

    这篇文章主要为大家详细介绍了css3过渡transition效果实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了CSS3过渡transition效果,供大家参考,具体内容如下 效果图: 实现代码: transition.html 立即学习“前端免费学习笔记(深入)”; T…

    2025年12月23日 好文分享
    000
  • 详解CSS3 RGBA色彩模式使用实例代码

    这篇文章主要以设计带有阴影边框的表单为例,为大家介绍了css3 rgba色彩模式使用方法,感兴趣的小伙伴们可以参考一下 RGBA色彩模式是RGB色彩模式的扩展,在红,蓝,绿三原色的基础上增加了不透明度参数。语法如下: rgba(r,g,b,) 其中r,g,b表示红色,蓝色,绿色三种原色所占的比重。其…

    2025年12月23日
    000
  • 使用CSS3的box-shadow属性制作边框阴影效果的方法

    这篇文章主要介绍了css3的box-shadow属性制作边框阴影效果的方法,box-shadow属性还是十分强大的,能设定阴影的水平或垂直位置,以及阴影的颜色和尺寸等,需要的朋友可以参考下 效果演示: box-shadow向框添加一个或多个阴影。IE9+、Firefox 4、Chrome、Opera…

    2025年12月23日 好文分享
    000
  • CSS3的opacity属性带来的层叠顺序问题解决方法

    这篇文章主要介绍了解决css3的opacity属性带来的层叠顺序问题的方法,主要针对opacity的属性值小于1的层会覆盖在其他层之上的问题,需要的朋友可以参考下 在最近的一个作品中,在使用 opacity 属性来实现页面整体透明的时候,发现了一个问题。如果两个层发生了重叠,使用了 opacity …

    2025年12月23日 好文分享
    000
  • 利用CSS3的opacity属性设置透明效果的用法介绍

    这篇文章主要介绍了详解css3的opacity属性设置透明效果的用法,同时还讲到了opacity透明度带有的继承性影响子集元素的问题,值得初学者注意,需要的朋友可以参考下 CSS3 opacity 属性的功能是用来控制网页元素的透明效果(调整不透明度),早期网页设计常常会用到许多的透明效果,通常都是…

    2025年12月23日
    000
  • CSS3中使用RGBa来调节透明度的示例说明

    这篇文章主要介绍了css3中使用rgba来调节透明度的教程,rgba是rgb色彩模型的一个扩展,这个缩写词代表红绿蓝三原色的首字母,alpha值代表颜色的透明度或者说不透明度,需要的朋友可以参考下 在 CSS3 中,增加了一个 opacity 属性,允许开发者设置元素的透明度,现在 opacity …

    2025年12月23日
    000
  • 纯CSS3实现不错的表单验证效果

    这是补充html5基础知识的系列内容,其他为: 一、HTML5– 新的结构元素 二、HTML5– figure、time、details、mark 三、HTML5– details活学活用 四、HTML5– 现存元素的变化 立即学习“前端免费学习笔记(…

    2025年12月23日 好文分享
    000
  • 详解css3文字与字体样式

    这篇文章详解css3文字与字体样式 css3使用服务器端字体: 使用服务器端字体 @font-face { font-family: webFont; /*此代码会首先用客户端字体Arial,如果客户端没有用下面一种服务器端字体*/ /*format格式: (ttf):truetype;(otf):…

    好文分享 2025年12月23日
    000

发表回复

登录后才能评论
关注微信