广告位联系
返回顶部
分享到

css3带你实现3D转换效果

css 来源:互联网 作者:秩名 发布时间:2022-02-20 09:32:55 人浏览
摘要

前言 在css3中允许使用3D转换来对元素进行格式化,在原本只是2D转化的平面中引入了Z轴。在这之前我们讲解了css3中的2D转换,也就是二维空间变换,本篇的3D转换就是基于原来的2D转换

前言

在css3中允许使用3D转换来对元素进行格式化,在原本只是2D转化的平面中引入了Z轴。在这之前我们讲解了css3中的2D转换,也就是二维空间变换,本篇的3D转换就是基于原来的2D转换而来,与2D转换的功能相似。

三维坐标系

相信学过数学的效果版对这一概念多多少少是知道的,我们要想有一个3D空间效果,也就是立体空间感,比如:正方体、长方体.....再比如我们生活所居住的房间也是3D立体空间的,主要有X轴、Y轴Z轴共同组成

x轴 : 水平向右,x右边是正值,左边是负值。

y轴 : 垂直向下,y下面是正值,上面是负值。

z轴 : 垂直屏幕,往外面是正值,往里面是负值。

转换属性

属性 描述
transform 使得元素向2D或3D转换
transform-origin 改变转换元素的位置
transform-style 规定被嵌套元素如何在 3D 空间中显示
perspective 规定 3D 元素的透视效果
perspective-origin 规定 3D 元素的底部位置
backface-visibility 定义元素在不面对屏幕时是否可见

这里transform属性和transform-origin属性在前一篇《有趣的transform形变》中已经讲解了,这里就不再细说。不同的是在3D转换中,transform-origin属性会接收第三个值,表示Z轴方向位置

(1)transform-style

transform-style设置元素的子元素是位于 3D 空间中还是平面中。

语法:

1

2

3

div{

    transform-style: flat|preserve-3d;

}

flat:设置元素的子元素位于该元素的平面中(子元素不设置3D空间)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>Document</title>

    <style>

        .box{

            position: relative;

            width: 200px;

            height: 200px;

            margin: 100px auto;

            transition: .5s;

            /* flat:子元素不存在3D空间 */

            transform-style: flat;

            background-color: #eee;

        }

        .box:hover{

            transform: rotateY(60deg);

        }

        .s{

            position: absolute;

            top: 0;

            left: 0;

            width: 100%;

            height: 100%;

            background-color: pink;

        }

        .s2{

            background-color: orange;

            transform: rotateX(45deg);

        }

    </style>

</head>

<body>

    <div class="box">

        <div class="s s1"></div>

        <div class="s s2"></div>

    </div>

</body>

</html>

设置flat值,子元素就只位于平面中,效果如下:

preserve-3d:设置元素的子元素应用于3D空间中

基于上述栗子,将transform-style属性值改为preserve-3d:

1

2

3

4

.box{

  /* 让子元素保持3d立体空间环境 */

  transform-style: preserve-3d;

}

得到3D空间效果:

3D视觉是不是感觉一下就来啦~

(2)perspective

perspective指定了观察者与 z=0 平面的距离,使具有三维位置变换的元素产生透视效果。如果不指定透视,则Z轴空间中的所有点将平铺到同一个2D视平面中,并且变换结果中将不存在景深概念

z>0 的三维元素比正常大,而 z<0 时则比正常小,大小程度由该属性的值决定

“perspective”本身就具有透视的意思,就是设置用于户和元素3D空间Z平面之间的距离(视距),简单理解就是将电脑屏幕当做一个平面,用户眼睛到屏幕的垂直方向。值越大用户与屏幕距离越远,视觉效果很小,值越小3D效果就越明显。

语法:

1

2

3

div{

   perspective:none | <length>

}

  • none:默认值,与 0 相同,不设置透视
  • length:元素距离视图的距离,以像素计

这里还是以上述栗子进行演示:

1

2

3

body{

    perspective: 900px;

}

或者

1

2

3

.box{

    perspective: 900px;

}

只要设置在父盒子上就可以,效果如下:

从第一眼就可以看出与上面不同,没有设置景深是这样:

设置了景深是这样的:

注意:perspective属性只影响 3D 转换元素,并且同时使用perspective-origin属性,可以改变 3D 元素的底部位置

(3)perspective-orgin

perspective-origin 属性定义 3D 元素所基于的 X 轴和 Y 轴。该属性允许您改变 3D 元素的底部位置。

语法:

1

perspective-origin: x-axis y-axis;

x-position:指定消失点的横坐标,其值有以下形式:

<length-percentage>长度值或相对于元素宽度的百分比值,可为负值。

  • left, 关键字,0值的简记。
  • center, 关键字,50%的简记。
  • right, 关键字,100%的简记。

y-position:指定消失点的纵坐标,其值有以下形式:

  • <length-percentage>长度值或相对于元素高度的百分比值,可为负值。
  • top, 关键字,0值的简记。
  • center, 关键字,50%的简记。
  • bottom, 关键字,100%的简记

介绍完语法使用,我们知道了怎么取值,下面还是基于上述例子继续演示:

值为长度值:

1

2

3

.box{

    perspective-origin: 300px;

}

效果如下:

值为关键字:

1

2

3

4

.box{

    perspective: 900px;

    perspective-origin: left;

}

效果如下:

值为百分比:

1

2

3

4

.box{

    perspective: 900px;

    perspective-origin: 300%;

}

效果如下:

两个值:

1

2

3

4

.box{

    perspective: 900px;

    perspective-origin: left top;

}

效果如下:

(4)backface-visibility

backface-visibility指定当元素背面朝向观察者时是否可见

元素的背面是其正面的镜像,虽然在 2D 中不可见,但是当变换导致元素在 3D 空间中旋转时,背面可以变得可见。 (此属性对 2D 变换没有影响,它没有透视。)

语法:

1

backface-visibility: visible|hidden;

  • visible:默认值。 背面是可见的。
  • hidden:背面是不可见的

这里借鉴了MDN上面的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>Document</title>

    <style>

        .showbf div {

          backface-visibility: visible;

        }

         

        .hidebf div {

          backface-visibility: hidden;

        }

        .container {

          width: 150px;

          height: 150px;

          margin: 75px 0 0 75px;

          border: none;

        }

         

        .cube {

          width: 100%;

          height: 100%;

          perspective: 550px;

          perspective-origin: 150% 150%;

          transform-style: preserve-3d;

        }

         

        .face {

          display: block;

          position: absolute;

          width: 100px;

          height: 100px;

          border: none;

          line-height: 100px;

          font-family: sans-serif;

          font-size: 60px;

          color: white;

          text-align: center;

        }

         

        .front {

          background: rgba(0, 0, 0, 0.3);

          transform: translateZ(50px);

        }

         

        .back {

          background: rgba(0, 255, 0, 1);

          color: black;

          transform: rotateY(180deg) translateZ(50px);

        }

         

        .right {

          background: rgba(196, 0, 0, 0.7);

          transform: rotateY(90deg) translateZ(50px);

        }

         

        .left {

          background: rgba(0, 0, 196, 0.7);

          transform: rotateY(-90deg) translateZ(50px);

        }

         

        .top {

          background: rgba(196, 196, 0, 0.7);

          transform: rotateX(90deg) translateZ(50px);

        }

         

        .bottom {

          background: rgba(196, 0, 196, 0.7);

          transform: rotateX(-90deg) translateZ(50px);

        }

         

        th, p, td {

          background-color: #EEEEEE;

          margin: 0px;

          padding: 6px;

          font-family: sans-serif;

          text-align: left;

        }

    </style>

</head>

<body>

    <table>

      <tr>

        <th><code>backface-visibility: visible;</code></th>

        <th><code>backface-visibility: hidden;</code></th>

      </tr>

      <tr>

        <td>

          <div class="container">

            <div class="cube showbf">

              <div class="face front">1</div>

              <div class="face back">2</div>

              <div class="face right">3</div>

              <div class="face left">4</div>

              <div class="face top">5</div>

              <div class="face bottom">6</div>

            </div>

          </div>

          <p>

            Since all faces are partially transparent,

            the back faces (2, 4, 5) are visible

            through the front faces (1, 3, 6).

          </p>

        </td>

        <td>

          <div class="container">

            <div class="cube hidebf">

              <div class="face front">1</div>

              <div class="face back">2</div>

              <div class="face right">3</div>

              <div class="face left">4</div>

              <div class="face top">5</div>

              <div class="face bottom">6</div>

            </div>

          </div>

          <p>

            The three back faces (2, 4, 5) are

            hidden.

          </p>

        </td>

      </tr>

    </table>

</body>

</html>

3D转换

旋转单位:deg(角度)、rad(弧度)、grad(梯度)、turn(圈)

  1. 弧度 = 角度*π/180
  2. grad = 360度(一圈)

(1)3D位移

3D位移在2D基础上多加了一个可以z轴移动的方向

3D位移主要演示translateZ和translate3d两个属性:

translate3d()CSS 函数在3D空间内移动一个元素的位置,这个移动由一个三维向量来表达,分别表示他在三个方向上移动的距离

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>3D位移</title>

    <style>

body{

    perspective: 800px;

}

.box{

    position: relative;

    width: 200px;

    height: 200px;

    margin: 100px auto;

    transition: .5s;

    background-color: pink;

    text-align: center;

    line-height: 200px;

}

.box:hover{

    /* transform: translateX(50px) translateY(100px) translateZ(200px); */

    /* 简写 */

    transform: translate3d(50px,100px,200px);

}

    </style>

</head>

<body>

    <div class="box">3D位移</div>

</body>

</html>

效果如下:

注意:

  1. 首先要设置perspectiv属性在被观察元素的父盒子上,不然不会有Z轴效果。
  2. 如果只是单独设置Z轴视距,可以直接使用translateZ属性。
  3. Z轴设置的值越大,距离我们眼睛就越近,也就是简单理解元素被放大了
  4. Z轴设置的值越小,或者为负数,则会离我们眼睛越远,元素缩小

(2)3D旋转

  • rotateX:让元素围绕X轴转
  • rotateY:让元素围绕Y轴旋转
  • rotateZ:让元素围绕Z轴旋转
  • rotate3d:让元素围绕固定轴旋转不变形

旋转量由角度决定,角度为正则顺时针旋转,反之逆时针旋转

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>3D旋转</title>

    <style>

body{

    perspective: 800px;

}

.box{

    position: relative;

    width: 200px;

    height: 200px;

    margin: 100px auto;

    transition: .5s;

    background-color: pink;

    text-align: center;

    line-height: 200px;

}

.box:hover{

    transform: rotateX(180deg); /* X轴旋转180° */

    transform: rotateY(180deg); /* Y轴旋转180° */

    transform: rotateZ(180deg); /* Z轴旋转180° */

}

    </style>

</head>

<body>

    <div class="box">3D旋转</div>

</body>

</html>

X轴旋转效果:

Y轴旋转效果:

Z轴旋转效果:

这里单独将rotate3d函数拎出来讲

语法:

1

rotate3d(x, y, z, a)

取值分析:

  • x:可以是0到1之间的数值,表示旋转轴X坐标方向的矢量
  • y:可以是0到1之间的数值,表示旋转轴Y坐标方向的矢量
  • z:可以是0到1之间的数值,表示旋转轴Z坐标方向的矢量
  • a:表示旋转角度。正的角度值表示顺时针旋转,负值表示逆时针旋转

也就是说rotateX(a) === rotate3d(1,0,0,a)、rotateY(a) === rotate3d(0,1,0,a)、rotateZ(a) === rotate3d(0,0,1,a)

1

2

3

.box:hover{

    transform: rotate3d(1,1,0,50deg); /* 表示在X轴和Y轴旋转50° */

}

效果如下:

1

2

3

.box:hover{

    transform: rotate3d(1,1,1,1turn); /* 围绕3轴旋转一圈 */

}

效果如下:

综合案例

基于上述所学内容,我们来实操做一个3D盒子旋转:

html结构:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<!DOCTYPE html>

<html lang="zh-CN">

    <head>

        <meta charset="UTF-8" />

        <meta name="viewport" content="width=device-width, initial-scale=1.0" />

        <title>3D盒子旋转</title>

        <link rel="stylesheet" href="css/index.css" />

    </head>

    <body>

        <section>

            <div><img src="images/1.jpg" alt="" /></div>

            <div><img src="images/2.jpg" alt="" /></div>

            <div><img src="images/3.jpg" alt="" /></div>

            <div><img src="images/4.jpg" alt="" /></div>

            <div><img src="images/5.jpg" alt="" /></div>

            <div><img src="images/6.jpg" alt="" /></div>

            <div><img src="images/1.jpg" alt="" /></div>

            <div><img src="images/2.jpg" alt="" /></div>

            <div><img src="images/3.jpg" alt="" /></div>

            <div><img src="images/4.jpg" alt="" /></div>

            <div><img src="images/5.jpg" alt="" /></div>

            <div><img src="images/6.jpg" alt="" /></div>

        </section>

    </body>

</html>

css部分:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

* {

    /* 初始化 */

    padding: 0;

    margin: 0;

}

body {

    /* 弹性布局*/

    display: flex;

    justify-content: center;

    align-items: center;

    height: 100vh;

    /* 视距 */

    perspective: 1000px;

}

section {

    position: relative;

    width: 150px;

    height: 150px;

    /* 让子元素保留其3D位置 */

    transform-style: preserve-3d;

    /* 动画 名称 时长 linear 是匀速运动 infinite是无限次播放 */

    animation: rotate 5s linear infinite;

}

section div {

    position: absolute;

    top: 0;

    left: 0;

    width: 100%;

    height: 100%;

    background-color: #fff;

    transition: all 1s;

}

section div img {

    width: 100%;

    height: 100%;

}

/* 这里使用的伪类选择器 */

section div:nth-child(1) { /* 选择第1个元素 */

    transform: translateZ(75px);

}

section:hover div:nth-child(1) {

    transform: translateZ(200px);

}

section div:nth-child(2) { /* 选择第2个元素 */

    transform: rotateX(-180deg) translateZ(75px);

}

section:hover div:nth-child(2) {

    transform: rotateX(-180deg) translateZ(200px);

}

section div:nth-child(3) { /* 选择第3个元素 */

    transform: rotateX(90deg) translateZ(75px);

}

section:hover div:nth-child(3) {

    transform: rotateX(90deg) translateZ(200px);

}

section div:nth-child(4) { /* 选择第4个元素 */

    transform: rotateX(-90deg) translateZ(75px);

}

section:hover div:nth-child(4) {

    transform: rotateX(-90deg) translateZ(200px);

}

section div:nth-child(5) { /* 选择第5个元素 */

    transform: rotateY(90deg) translateZ(75px);

}

section:hover div:nth-child(5) {

    transform: rotateY(90deg) translateZ(200px);

}

section div:nth-child(6) { /* 选择第6个元素 */

    transform: rotateY(-90deg) translateZ(75px);

}

section:hover div:nth-child(6) {

    transform: rotateY(-90deg) translateZ(200px);

}

section div:nth-child(7) { /* 选择第7个元素 */

    transform: translateZ(75px);

}

section div:nth-child(8) { /* 选择第8个元素 */

    transform: rotateX(-180deg) translateZ(75px);

}

section div:nth-child(9) { /* 选择第9个元素 */

    transform: rotateX(90deg) translateZ(75px);

}

section div:nth-child(10) { /* 选择第10个元素 */

    transform: rotateX(-90deg) translateZ(75px);

}

section div:nth-child(11) { /* 选择第11个元素 */

    transform: rotateY(90deg) translateZ(75px);

}

section div:nth-child(12) { /* 选择第12个元素 */

    transform: rotateY(-90deg) translateZ(75px);

}

 

/* 定义动画 */

@keyframes rotate {

    0% {

        transform: rotateY(0) rotateX(0);

    }

    100% {

        transform: rotateY(360deg) rotateX(360deg);

    }

}

效果如下


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://www.jb51.net/css/811832.html
相关文章
  • CSS3浏览器兼容的介绍

    CSS3浏览器兼容的介绍
    一、浏览器兼容 1.1、概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题。不同浏览器其内核
  • CSS元素定位之通过元素的标签或者元素的id、cl

    CSS元素定位之通过元素的标签或者元素的id、cl
    大部分人在使用selenium定位元素时,用的是xpath元素定位方式,因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观,更好
  • 微信小程序纯CSS实现无限弹幕滚动效果

    微信小程序纯CSS实现无限弹幕滚动效果
    啥也不说,先上效果图 实现背景 产品:我们需要一个弹幕滚动效果,类似于微博热搜那种实时评论,但是我们的数据是固定的20条,你让他
  • 使用CSS构建强大且酷炫的粒子动画效果

    使用CSS构建强大且酷炫的粒子动画效果
    粒子动画,顾名思义,就是页面上存在大量的粒子构建而成的动画。传统的粒子动画主要由 Canvas、WebGL 实现。 当然,不使用 HTML + CSS 的主要
  • flex:1的详细介绍

    flex:1的详细介绍
    简单的来说一下在别人问你这个问题的时候怎么来回答它 前端新人,如有错误求大佬指出~求教???? 情景复现 大佬提问:你知道flex: 1;的更深
  • 新的CSS伪类函数 :is 和 :where()示例介绍

    新的CSS伪类函数 :is 和 :where()示例介绍
    在编写 CSS 时,有时可能会使用很长的选择器列表来定位具有相同样式规则的多个元素。例如,如果您想对标题中的 b 标签进行颜色调整,我
  • 纯CSS打字动画的实现方法

    纯CSS打字动画的实现方法
    在一些技术网站中,经常会看到这样一种展示效果:逐个显示一段文本中的字符,模拟出一种打字的效果。通过这种方式可以显著地提升网
  • 实现el-form每行显示两列底部按钮居中效果的教程

    实现el-form每行显示两列底部按钮居中效果的教程
    el-form 每行显示两列,底部按钮居中 问题: 以前的解决办法是:el-col,el-row。但是这里只有一个el-form-item的label数据是已知的,其余项都是循
  • CSS实现六边形的图片效果的代码

    CSS实现六边形的图片效果的代码
    前言 在CodePen上看到一个有意思的效果: 这个效果的难点在于六边形的绘制, 那么接下来我们就一起来看下作者是怎么实现他的吧 实现思路
  • CSS浮动引起的高度塌陷问题的详细介绍

    CSS浮动引起的高度塌陷问题的详细介绍
    正常页面布局 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 style *{ margin:0; padding: 0; } .content{ width:400px; border:1px solid #000; } .box{ width:200px;
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计