10CSS3——2D3D转换


CSS3 转换可以对元素进行移动、缩放、转动、拉长或拉伸。我们将结合过渡功能对 CSS32D3D 转换进行学习。

  • 2D 转换
  • 3D 转换

1、转换属性

转换有下列属性:

  • transform: 将 2D3D 转换应用到元素上去。
  • transform-origin:可以改变被转换元素的位置。
  • transform-style:规定被嵌套元素如何在 3D 空间中显示。
  • perspective:规定 3D 元素的透视效果,与 perspective-origin 结合使用,可以改变 3D 元素的底部位置,在实现一些 3D 效果,这一项是必不可少的。
  • perspective-origin:规定 3D 元素的底部位置。
  • backface-visibility:定义元素在不面对屏幕时是否可见。

transform-origin

transform-origin: x-axis y-axis z-axis;
/*
x-axis:定义视图在 X 轴的位置,left | center | right | length | %
y-axis:定义视图在 Y 轴的位置,top | center | bottom | length | %
z-axis:定义视图在 Z 轴的位置,length
*/
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        .div1 {
            width: 300px;
            height: 300px;
            margin: 200px;
            border: 2px solid;
            text-align: center;
        }
        .div1 div {
            width: 300px;
            height: 300px;
            background: lightgreen;
            /*transform: 将 2D 或 3D 转换应用到元素上去*/
            transform: rotate(45deg);
        }
        .transform-origin div {
            /*transform-origin: x-axis y-axis z-axis;*/
            transform-origin: 10% 10%;
        }
    </style>
</head>
<body>
    <div class="div1">
        <div>变换基点在默认位置</div>
    </div>
    <div class="div1 transform-origin">
        <div>变换基点在 10% 10% 位置</div>
    </div>
</body>

在这里插入图片描述
可以看到两个变换的基点有了明显的不同,第二个将变换基点设置到 10% 10% 的位置,变换也出现了不同。

transform-style

规定被嵌套元素如何在 3D 空间中显示

transform-style: flat | preserved-3d;
/*
flat:子元素将不保留 3D 位置
preserved-3d:子元素将保留 3D 位置
在实现一些 3D 效果的时候,一般都要声明为 preserved-3d
*/
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        .div1 {
            width: 200px;
            height: 200px;
            border: 1px solid #bbb;
            margin: 100px;
            /* 在父元素中设置transform-style: preserve-3d; */
            /*flat:子元素将不保留 3D 位置
                preserved-3d:子元素将保留 3D 位置
                在实现一些 3D 效果的时候,一般都要声明为 preserved-3d*/
            transform-style: preserve-3d;
            transform: perspective(600px);
        }
        .div1 div {
            width: 200px;
            height: 200px;
            background: lightgreen;
            transform: rotateX(60deg);
        }
        .div2 {
            width: 200px;
            height: 200px;
            border: 1px solid #bbb;
            margin: 100px;
            /* 在父元素中设置transform-style: flat; */
            transform-style: flat;
            transform: perspective(600px);
        }
        .div2 div {
            width: 200px;
            height: 200px;
            background: lightgreen;
            transform: rotateX(60deg);
        }
    </style>
</head>
<body>
    <div class="div1">
        <div></div>
    </div>
    <div class="div2">
        <div></div>
    </div>
</body>

在这里插入图片描述
可以看到,div1div2 除了 transform-style 属性之外,其它完全相同,一个保留了 3d 效果,一个未保留 3d 效果。

perspective

规定 3D 元素的透视效果,与 perspective-origin 结合使用,可以改变 3D 元素的底部位置,在实现一些 3D 效果,这一项是必不可少的。

perspective: number | none;
/*
number:单位 px,元素距离视图的距离
none:默认值,0,无透视
*/
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        .div1 {
            width: 300px;
            height: 300px;
            margin: 50px;
            border: 1px solid #bbb;
        }
        .div1 div {
            width: 100%;
            height: 100%;
            background: lightgreen;
            /*perspective:规定 3D 元素的透视效果,与 perspective-origin 结合使用,
            可以改变 3D 元素的底部位置,在实现一些 3D 效果,这一项是必不可少的。
            number:单位 px,元素距离视图的距离
            none:默认值,0,无透视
            */
            transform: perspective(600px) rotateY(45deg);
            /*设置了透视和变换方式*/
        }
    </style>
</head>
<body>
    <div class="div1">
        <div></div>
    </div>
</body>

在这里插入图片描述

perspective-origin

规定 3D 元素的底部位置

perspective-origin: x-axis y-axis;
/*
x-axis:定义该视图在 X 轴上的位置。默认为 50%。left|center|right|length|%
y-axis:定义该视图在 Y 轴上的位置。默认为 50%。top|center|bottom|length|%
将透视聚集点改变到其他位置。
*/

backface-visibility

定义元素在不面对屏幕时是否可见

backface-visibility: visible|hidden;
/*
visible:背面可见
hidden:背面不可见
*/
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        div {
            width: 200px;
            height: 200px;
            background: lightgreen;
            transform: rotateY(180deg);
            /* 将 div 元素都翻转 180deg,翻转到背面 */
        }
        .div1 {
            backface-visibility: hidden;
        }
        .div2 {
            backface-visibility: visible;
        }
    </style>
</head>
<body>
    <div class="div1">div1 backface-visibility: hidden;</div>
    <div class="div2">div2 backface-visibility: visible;</div>
</body>

在这里插入图片描述
可以看到,两个 div 块在翻转后都是背面朝向我们,当我们设置 div1backface-visibility: hidden 时,div1 就不可见了,只有 div2 是可见的。

2、2D转换

2D 转换有以下几种常用方法(transform属性下的函数):

  • translate(x,y) :平移,xx轴上的平移,yy轴上的平移,根据原始位置的 xy 轴位置,分别偏离 xy 的距离。
 {
 transform: translate(50px,100px);
 -ms-transform: translate(50px,100px); /* IE 9 */
 -webkit-transform: translate(50px,100px); /* Safari and Chrome */
}

另外两种⽅法:
(1)translateX(x)元素仅在⽔平⽅向位移
(2)translateY(y)元素仅在垂直⽅向位移
translateX(x)translateY(y)同时使用,不会同时生效,后面的会覆盖掉前面的。
在这里插入图片描述
在这里插入图片描述

  • rotate(angle) :根据给定的angle 大小旋转,正度数表示顺时针旋转, angle 为负,则逆时针旋转。
{
 transform: rotate(30deg);
 -ms-transform: rotate(30deg); /* IE 9 */
 -webkit-transform: rotate(30deg); /* Safari and Chrome */
}

在这里插入图片描述

  • scale(x,y) :将元素根据中⼼原点进⾏缩放,根据 xy 的值,对应的放大宽度和高度。
{
 -ms-transform:scale(2,3); /* IE 9 */
 -webkit-transform: scale(2,3); /* Safari */
 transform: scale(2,3); /* 标准语法 */
}

另外两种⽅法:
(1) scaleX(x)元素仅在⽔平⽅向上缩放(x轴缩放)
(2) scaleY(y)元素仅在垂直⽅向上缩放(y轴缩放)
在这里插入图片描述

  • skew(<angle> [,<angle>]) :包含两个参数值,分别表示X轴和Y轴倾斜的⻆度,如果第⼆个参数为空,则默认为0,参数为负表示向相反⽅向倾斜。
{
 transform: skew(30deg,20deg);
 -ms-transform: skew(30deg,20deg); /* IE 9 */
 -webkit-transform: skew(30deg,20deg); /* Safari and Chrome */
}

(1)skewX(< angle>):表示只在X轴(⽔平⽅向)倾斜。
(2)skewY(< angle>):表示只在Y轴(垂直⽅向)倾斜。
在这里插入图片描述
在这里插入图片描述

  • matrix()matrix 变换涉及到了线性代数的知识,在此不作讲述。感兴趣的同学可以自行了解。
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        .div1 {
            margin: 50px;
            width: 200px;
            height: 200px;
            background-color: lightgreen;
            opacity: 0.5;
            transition: 2s;
        }
        .div1:hover {
            transform: translate(30px, 40px);
            /*根据原始位置的 x 、y 轴位置,分别偏离 x 、y 的距离。*/
            /*translate(x,y)*/
            opacity: 1;
        }
        .div2 {
            margin: 50px;
            width: 200px;
            height: 200px;
            background-color: cyan;
            opacity: 0.5;
            transition: 2s;
        }
        .div2:hover {
            transform: rotate(180deg);
            /*rotate(angle)*/
            /*:根据给定的 angle 大小,顺时针旋转,如果 angle 为负,则逆时针旋转。*/
            opacity: 1;
        }
        .div3 {
            margin: 50px;
            width: 200px;
            height: 200px;
            background-color: orange;
            opacity: 0.5;
            transition: 2s;
        }
        .div3:hover {
            transform: skew(20deg, 30deg);
            /*skew(angle,angle)*/
            /*根据给定的两个角度,分别在水平方向和垂直方向倾斜,第二个角度默认为 0 。*/
            opacity: 1;
        }
    </style>
</head>
<body>
    <div class="div1">div1</div>
    <div class="div2">div2</div>
    <div class="div3">div3</div>
</body>

把鼠标移动到矩形上,观察效果。

3、3D 转换

3D 转换语法与 2D 转换语法较为类似

  • translate3d(x,y,z):定义 3D 转化,给出三个值,分别应用于三个坐标轴上
  • translateX(x):定义 3D转化,仅用于X
  • translateY(y):定义 3D 转化,仅用于 Y
  • translateZ(z):定义 3D 转化,仅用于Z 轴 ,在z轴上的平移,z轴为⾯向屏幕的这个⽅向

在这里插入图片描述
在这里插入图片描述

  • perspective:定义 3D 转换元素的透视视图
    在这里插入图片描述

在这里插入图片描述

  • scale3d(x,y,z):定义 3D 缩放转换

  • scaleX(x):定义 3D 缩放转换,仅用于X

  • scaleY(y):定义 3D 缩放转换,仅用于 Y

  • scaleZ(z):定义 3D 缩放转换,仅用于 Z 轴

  • rotate3d(x,y,z,angle):定义 3D 旋转

  • rotateX(angle):定义沿 X 轴的 3D 旋转

 {
 transform: rotateX(180deg);
 -webkit-transform: rotateX(180deg); /* Safari 与 Chrome */
}
  • rotateY(angle):定义沿 Y 轴的 3D 旋转
 {
 transform: rotateY(180deg);
 -webkit-transform: rotateY(180deg); /* Safari 与 Chrome */
}
  • rotateZ(angle):定义沿 Z 轴的 3D 旋转

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        .div1 {
            margin: 50px;
            width: 200px;
            height: 200px;
            background-color: lightgreen;
            opacity: 0.5;
            transition: 2s;
        }
        .div1:hover {
            /*X 轴旋转*/
            transform: rotateX(180deg);
            opacity: 1;
        }
        .div2 {
            margin: 50px;
            width: 200px;
            height: 200px;
            background-color: cyan;
            opacity: 0.5;
            transition: 2s;
        }
        .div2:hover {
            /*Y 轴伸缩*/
            transform: scaleY(2);
            opacity: 1;
        }
        .div3 {
            margin: 50px;
            width: 200px;
            height: 200px;
            background-color: orange;
            opacity: 0.5;
            transition: 2s;
        }
        .div3:hover {
            /*X 轴移动*/
            transform: translateX(50%);
            opacity: 1;
        }
    </style>
</head>
<body>
    <div class="div1">div1</div>
    <div class="div2">div2</div>
    <div class="div3">div3</div>
</body>

把鼠标移动到盒子上,观察效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值