CSS3之2D转换、3D转换

本文详细介绍了CSS3的2D和3D转换,包括位移、旋转、转换起点、缩放以及3D转换中的位移、透视、旋转等。通过实例展示了如何使用这些转换方法实现元素的各种动态效果,如居中、旋转、缩放等,并强调了转换顺序对效果的影响。同时,还提到了开启三维立体环境的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:可以配合我上一期博客(过渡与动画)一起看CSS3之过渡与动画 https://blog.youkuaiyun.com/weixin_45707229/article/details/125642353

2D转换 transform

位移translate

  • translate(x轴, y轴); 一个不能少(某个方向不想移动就写0 ) ,可以是百分比,百分比单位是相对于自身元素的,px单位相对于父元素

  • translateX(xxpx); 沿X轴移动 ,也可以是百分比,百分比单位是相对于自身元素的,px单位相对于父元素

  • translateY(xxpx); 沿Y轴移动 ,也可以是百分比,百分比单位是相对于自身元素的,px单位相对于父元素

重点

不会影响其他元素的位置,上面在移动,下面的标准流不变

行内标签没有效果(a、span等)

例:

可以配合定位,实现子元素在父元素垂直居中的效果(子绝父相,子top:50%,left:50%,transform: translate(-50%,-50%);实现居中于父元素)

<style>
        .box1{
            position: relative;
            width: 200px;
            height: 100px;
            transform: translate(10%,10%);
            background-color: pink;
        }
        .box2{
            position: absolute;
            top: 50%;
            left: 50%;
            width: 50px;
            height: 25px;
            background-color: skyblue;
            transform: translate(-50%,-50%);
        }
    </style>
    <div class="box1">
        <div class="box2"></div>
    </div>

在这里插入图片描述

旋转rotate

transform: rotate(xx deg); deg是度 角度,旋转的度数

例:配合过渡,实现鼠标悬停时,旋转360度一圈

<style>
	img{
        border: 3px solid black;
        border-radius: 50%;
        transition: all 0.5s;
    }
    img:hover{
        transform: rotate(360deg);
    }
</style>
<img src="../SHOPING/favicon.ico" >

请添加图片描述

转换的起点transform-origin

可以作为旋转点

transform-origin: x y (x和y用空格隔开)

x和y可以是 xxpx xxpx 或 xx% xx% 或 left/right/top/bottom/center left/right/top/bottom/center

默认是50% 50% 也就是中心点

例: 以左下角为旋转点旋转

<style>
        .origin{
	        overflow: hidden;
	        width: 100px;
	        height: 100px;
	        margin: 10px auto;
	        border: 1px solid gray;
	        transform-origin: left top;
    	}
        .origin::before{
            content: "xxx";
            display: block;
            width: 100%;
            height: 100%;
            background-color: pink;
            transform: rotate(90deg);
            transform-origin: left bottom;
            transition: all 0.3s;
        }
        .origin:hover::before{
            transform: rotate(0deg);
        }
    </style>
    <div class="origin"></div>

请添加图片描述

缩放scale

transform: scale(x,y) 没有单位,直接写倍数。 宽度 扩展为x倍,高度 扩大为原来y倍 ,
1默认不变;
2扩大2倍;
0.5缩小原来一半

transform: scale(x) 宽高一起变x倍 大小

缩放后原位置不变,不影响其他标准流

例: 鼠标悬停在头像上时放大

<style>
    img{
        border: 3px solid black;
        border-radius: 50%;
        transition: all 0.5s;
    }
    #avatar{
        line-height: 70px;
        transition: all 0.3s;
    }
    #avatar:hover{
        transform: scale(1.1);
    }
</style>
    <img id="avatar" src="../SHOPING/favicon.ico">

请添加图片描述

2D转换的复合写法

transform: translate(x,y) rotate(xx deg) scale(x,y) … 等

顺序会影响转换的效果。(先旋转会改变坐标轴方向)

同时有位移和其他属性时,记得把位移放最前面

3D转换

坐标轴
请添加图片描述

位移 translate3d

  • transform: translateX( …px) 仅在x轴上移动

  • transform: translateY( …px) 仅在y轴上移动

  • transform: translateZ( …px) 仅在z轴上移动

  • transform: translate3d(x,y,z) xyz分别指要移动的轴的方向的距离,一个都不能少写。

透视 perspective

perspective 给父元素添加,单位px,值越大,离屏幕越远,子元素越小。

由此能实现近大远小 的效果

旋转 rotated3d

  • rotateX( …deg) 正数沿x轴顺时针旋转,负数逆时针
  • rotateY( …deg) 正数沿y轴顺时针旋转,负数逆时针
  • rotateZ( …deg) 正数沿z轴顺时针旋转,负数逆时针
  • rotate3d(x,y,z,xxdeg) (了解)
    可以自定义旋转轴,rotate3d(1,1,0,30deg) 表示沿着x轴和y轴中间的轴即 对角线 旋转30度。

例: 结合动画,进行3d旋转

<style>
        body{
            perspective: 500px;
        }
        img{
            display: block;
            margin: 50px auto;
            border: 5px solid black;
            animation: xxx 2s linear infinite;
        }
        @keyframes xxx {
            0%{ 
            }
            25%{
                transform: rotateX(30deg)
            }
            50%{
                transform: rotateX(30deg) rotateY(30deg)    
/*rotateX(30deg)是保持上面那个x轴的旋转状态,而不是在x轴累加再旋转30度*/ 
            }
            75%{               
                 transform: rotateX(30deg)  rotateY(30deg)  rotateZ(30deg)   
/*同理,rotateX(30deg)和rotateY(30deg)是保持上面那的旋转状态,不是累加*/ 
            }
            100%{
                transform: rotateX(0deg)  rotateY(0deg)  rotateZ(0deg)
            }
        }
    </style>
    <img src="./GuangDong.jpg">

请添加图片描述

开启三维立体环境

控制子元素是否开启三维立体环境

transform-style 默认 flat 不开启立体空间

transform-style: preserve-3d 子元素开启立体空间

代码写给父级,但是影响的是子盒子


综合案例: 魔方

<style> 
        body{
            perspective: 500px;
        }

        @keyframes upsidedown {
            0%{}
            25%{
                transform: rotateY(221deg)  rotateX(344deg) rotateZ(34deg);
            }
            50%{
                transform: rotateY(44deg)  rotateX(12deg) rotateZ(62deg);
            }
            75%{
                transform: rotateY(123deg)  rotateX(64deg) rotateZ(17deg);
            }
            100%{
                transform: rotateY(22deg)  rotateX(90deg) rotateZ(202deg);
            }
        }

      .box{
        position: relative;
        width: 100px;
        height: 100px;
        transform-style: preserve-3d;   /*   让子盒子保持三维立体  */
        margin: 200px auto;
        animation: upsidedown 3s ease-in-out 0.2s infinite alternate;
      }

      .top,
      .left,
      .front,
      .back,
      .right,
      .bottom{
        position: absolute;
            width: 100%;
            height: 100%;
      }

      .top{
            background-color: red;
            transform: translateY(-50%) rotateX(90deg);
        }

        .left{
            background-color: blue;
            transform: translateX(-50%)  rotateY(90deg);
        }
        .front{
            background-color: white;
            text-align: center;
            line-height: 100px;
            transform:  translateZ(50px);
        }
        .back{
            background-color: yellow;
            transform: translateZ(-50px);
        }
        .right{
            background-color: green;
            transform: translateX(50%) rotateY(90deg);
        }

        .bottom{
            background-color: orange;
            transform: translateY(50%) rotateX(90deg);
        }
</style>
    <div class="box">
        <div class="top"></div>
        <div class="left"></div>
        <div class="front">魔方</div>
        <div class="back"></div>
        <div class="right"></div>
        <div class="bottom"></div>
    </div>

效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值