CSS-4

平面转换

整体认识

css 复制代码
    div {
        margin: 100px 0;

        width: 100px;
        height: 100px;
        background-color: pink;

        /* 过渡效果 */
        transition: all 1s;
    }

    /* 当鼠标悬停到div时,进行平面转换 */
    div:hover {
        transform: translate(800px) rotate(360deg) scale(2) skew(180deg);
    }
作用:为元素添加动态效果,一般与过渡配合使用
概念:改变盒子在平面内的形态(位移、旋转、缩放、倾斜)

平移

css 复制代码
案例展示:通过平移实现"居中"效果
(原理:利用 transform: translate(); 取值为百分比时候,是参照盒子自身尺寸计算结果的特点)

<style>
    .box {
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);

        width: 100px;
        height: 100px;
        background-color: pink;
    }
</style>

<body>
    <div class="box"></div>
</body>
css 复制代码
属性:
	transform: translate(X轴移动距离,Y轴移动距离);

取值:
	1.像素单位数值
	2.百分比(参照盒子自身尺寸计算结果)
	3.正负均可

技巧:
	1.translate() 只写一个值,表示沿着X轴移动
	2.单独设置X或者Y轴移动距离:translateX() 或 translateY()

旋转

<style>
    .box {
        width: 100px;
        height: 100px;
        background-color: pink;

        transition: all 2s;
    }

    .box:hover {
        transform: rotate(360deg);
    }
</style>

<body>
    <div class="box"></div>
</body>

属性:
	 transform: rotate(旋转角度);
	 
角度单位:deg

技巧:
	取值为正,顺时针旋转
	取值为负,逆时针旋转

转换原点

css 复制代码
<style>
    .box {
        width: 100px;
        height: 100px;
        background-color: pink;

        transition: all 2s;
        /* 将旋转的原点改为右边+底部 */
        transform-origin: right bottom;
    }

    .box:hover {
        transform: rotate(360deg);
    }
</style>

<body>
    <div class="box"></div>
</body>
默认情况下,转换原点是盒子中心点
转换原点是一个原点,当发生转换时候(包括旋转、缩放、平移等等),以此为原点进行坐标的定位

属性:
	transform-origin: 水平原点位置  垂直原点位置;

取值:
	1.方位名词(left、top、right、bottom、center)
	2.像素单位数值
	3.百分比

多重转换

css 复制代码
多重转换的实现:先平移再旋转
	transform: translate(...) rotate(...);

缩放

<style>
    .box {
        margin: 100px auto;
        
        width: 100px;
        height: 100px;
        background-color: pink;

        transition: all 2s;
    }

    .box:hover {
        transform: scale(2);
    }
</style>

<body>
    <div class="box"></div>
</body>

属性:
	transform: scale( 缩放倍数 );
	transform: scale( X轴缩放倍数, Y轴缩放倍数);

技巧:
	通常,只为scale设置一个值,表示X轴和Y轴等比例缩放
	通常大于1表示放大,取值小于1表示缩小

倾斜

css 复制代码
<style>
    .box {
        margin: 100px auto;
        
        width: 100px;
        height: 100px;
        background-color: pink;

        transition: all 0.5s;
    }

    .box:hover {
        transform: skew(-30deg);
    }
</style>

<body>
    <div class="box"></div>
</body>
属性:
	transform: skew(倾斜角度);

渐变

渐变效果

css 复制代码
<style>
    .box {
        width: 100px;
        height: 100px;
        background-color: pink;

        transition: all 0.5s;
    }

    .box:hover {
        background-image: linear-gradient(
            to right,
            red,
            green
        );

        background-image: linear-gradient(
            45deg,
            red,
            green
        );

        background-image: linear-gradient(
            red 80%,
            green
        );
    }
</style>
渐变是多个颜色逐渐变换的效果,一般用于设置盒子背景
分类:
	1.线性渐变(沿着直线的方向发生渐变)
	2.径向渐变(沿着圆心向四周发生渐变)
	
属性:
	background-image: linear-gradient(
		渐变方向,
		颜色1 终点位置,
		颜色2 终点位置,
		...
	);
	
取值:
	1.渐变的方向:可选择不写
		to 方位名词
		角度度数
	
	2.终点位置:可选择不写
		百分比

背景颜色渐变的案例

<style>
    .box {
        position: relative;

        width: 100px;
        height: 100px;
        background-color: pink;
    }

    .mask {
        position: absolute;
        left: 0;
        top: 0;

        width: 100%;
        height: 100%;

        background-image: linear-gradient(
            transparent,  /*  transparent 它代表着全透明黑色,即一个类似rgba(0,0,0,0)这样的值 */
            rgba(0,0,0,0.5)
        );
        /* 将透明度设置为0,起到"关闭显示效果"的作用 */
        opacity: 0;
    }

    .box:hover .mask {
        /* 将透明度设置为1,起到"开启显示的效果"的作用 */
        opacity: 1;
    }
</style>

<body>
    <div class="box">
        <span>Hello World</span>
        <div class="mask"></div>
    </div>
</body>

径向渐变

css 复制代码
<style>
    .box {
        width: 100px;
        height: 100px;
        background-color: pink;
        border-radius: 50%;

        background-image: radial-gradient(
            /* 一条半径 */
            50px at center center,
            red,
            pink
        );
    }

    .box:hover {
        background-image: radial-gradient(
            /* 两条半径 */
            50px 20px at center center,
            pink,
            red
        );
    }
</style>

<body>
    <div class="box"></div>
</body>
css 复制代码
作用:给按钮添加高光效果
取值:
	1.半径1条则为圆,2条则为椭圆
	2.圆心位置取值:像素单位数值/百分比/方位名词

空间转换

平移

属性:
	transform: translate3d(x, y, z);
	transform: translateX();
	transform: translateY();
	transform: translateZ();
	
取值(正负均可)
	1.像素单位数值
	2.百分比(参照盒子自身尺寸计算结果)
	
注意事项:
	电脑屏幕是平面的,z轴的效果无法直接体现,所以可以配合"视距"知识点使用

视距

作用:指定了观察者与 z = 0 平面的距离,为元素添加透视效果

透视效果:近大远小

属性:
	添加给直接父级,取值范围一般为 800 ~ 1200
	perspective: 视距;

平移与视距的综合效果

css 复制代码
<style>
    .father {
        perspective: 800px;
    }

    .son {
        margin: 100px auto;
        width: 100px;
        height: 100px;
        background-color: orange;
        transition: all .5s;
    }

    .son:hover {
        transform: translateZ(300px);
    }

</style>

<body>
    <div class="father">
        <div class="son"></div>
    </div>
</body>

旋转

css 复制代码
<style>
    .father {
        /* 旋转时候,使用"视距"所带来的透视效果,会使得旋转更明显(因为"视距"会自动实现"近大远小,近实远虚") */
        perspective: 800px;
    }

    .son {
        margin: 100px auto;
        width: 200px;
        height: 200px;
        background-color: pink;
        transition: all 0.5s;
    }

    .son:hover {
        /* transform: rotateZ(60deg); */
        /* transform: rotateX(60deg); */
        transform: rotateY(-60deg);
    }

</style>

<body>
    <div class="father">
        <div class="son"></div>
    </div>
</body>
css 复制代码
 属性:
     transform: rotateX(角度);
     transform: rotateY(角度);
     transform: rotateZ(角度);
 
 角度单位:deg
 
 例子: 
 	transform: rotateZ(60deg);

 拓展:
	rotate3d(x,y,z,角度度数):用来设置自定义旋转轴的位置及旋转的角度
	x,y,z 取值为 0-1 之间的数字
左手法则:根据旋转方向确定取值正负

操作:
	左手握住旋转轴,拇指指向正值方向。其他四个手指弯曲方向为旋转正值方向。

立体呈现

立体知识

css 复制代码
<style>
    .cube {
        position: relative;
        margin: 100px auto;
        width: 200px;
        height: 200px;
        transition: all 2s;

        transform-style: preserve-3d;
    }

    .cube div {
        position: absolute;
        left: 0;
        top: 0;
        width: 200px;
        height: 200px;
    }

    .front {
        background-color: orange;
        transform: translateZ(100px);
    }

    .back {
        background-color: green;
        transform: translateZ(-100px);
    }

    .cube:hover {
        transform: rotateY(90deg);
    }
</style>

<body>
    <div class="cube">
        <div class="front">前面</div>
        <div class="back">后面</div>
    </div>
</body>
css 复制代码
作用:控制元素的子元素是位于3D空间中还是平面中
属性名:transform-style
属性值:
	flat: 子级处于平面中
	preserve-3d: 子级处于3D空间

立方体案例

css 复制代码
<style>
    .cube {
        width: 300px;
        height: 300px;
        font-size: 80px;
        text-align: center;
        line-height: 300px;
        transition: 2s;
        transform: rotateY(-30deg) rotateX(-35deg);
        transform-style: preserve-3d;
        margin: 300px auto;
    }

    .cube:hover {
        transform: rotateY(30deg) rotateX(35deg);
    }

    .cube>div {
        width: 300px;
        height: 300px;
        position: absolute;
        left: 0;
        top: 0;
        transition: 2s;
        opacity: 0.5;
        border: 1px dashed black;
    }

    .cube .flat1 {
        background-color: red;
        transform: translateY(-150px) rotateX(90deg);
    }

    .cube .flat2 {
        background-color: orange;
        transform: translateY(150px) rotateX(90deg);
    }

    .cube .flat3 {
        background-color: yellow;
        transform: translateX(-150px) rotateY(90deg);
    }

    .cube .flat4 {
        background-color: green;
        transform: translateX(150px) rotateY(90deg);
    }

    .cube .flat5 {
        background-color: lightgreen;
        transform: translateZ(150px);
    }

    .cube .flat6 {
        background-color: blue;
        transform: translateZ(-150px);
    }
</style>

<body>
    <div class="cube">
        <div class="flat1">上</div>
        <div class="flat2">下</div>
        <div class="flat3">左</div>
        <div class="flat4">右</div>
        <div class="flat5">前</div>
        <div class="flat6">后</div>
    </div>
</body>

3D导航案例

<style>
    * {
        margin: 0;
        padding: 0;
    }

    ul {
        margin-top: 100px;
        margin-left: 36%;
    }

    ul li {
        float: left;
        margin: 0 5px;
        width: 120px;
        height: 35px;
        list-style: none;
        /* 一会我们需要给box旋转 也需要透视干脆给li加里面的子盒子都有透视效果 */
        perspective: 500px;
    }

    .box {
        position: relative;
        width: 100%;
        height: 100%;
        background-color: pink;
        transform-style: preserve-3d;
        transition: all .4s;
    }

    .box:hover {
        transform: rotateX(90deg);
    }

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

    .front {
        background-color: red;
        opacity: 0.5;
        transform: translateZ(17.5px);
    }

    .bottom {
        background-color: green;
        opacity: 0.5;
        /* 这个x轴一定是负值 */
        /* 我们如果有移动 或者其他样式,必须先写我们的移动 */
        transform: translateY(17.5px) rotateX(90deg);
    }
</style>

<body>
    <ul>
        <li>
            <div class="box">
                <div class="front">导航一</div>
                <div class="bottom">111</div>
            </div>
        </li>
        <li>
            <div class="box">
                <div class="front">导航二</div>
                <div class="bottom">222</div>
            </div>
        </li>
        <li>
            <div class="box">
                <div class="front">导航三</div>
                <div class="bottom">333</div>
            </div>
        </li>
    </ul>
</body>

缩放

css 复制代码
transform: scale3d(x,y,z);
transform: scaleX();
transform: scaleY();
transform: scaleZ();

动画

认识动画

css 复制代码
过渡:实现两个状态间的变换过程
动画:实现多个状态间的变换过程,动画过程可控(重复播放、最终画面、是否暂停)

定义动画

css 复制代码
<style>
    @keyframes 动画名称 {
        from {}
        to {}
    }
</style>
css 复制代码
<style>
    @keyframes 动画名称 {
        0% {}
        10% {}
        ...
        100% {}
    }
</style>

使用动画

css 复制代码
<style>
    .box {
        animation: 动画名称 动画花费时长;
    }
</style>

基本演示

动画一演示:宽度从200变化到800

<style>
    .box {
        width: 200px;
        height: 100px;
        background-color: pink;
        
        /* 第二步:使用动画 */
        animation: change-size 1s;
    }

    /* 第一步:定义动画 */
    @keyframes change-size {
        from {
            width: 200px;
        }

        to {
            width: 800px;
        }
    }
</style>

<body>
    <div class="box"></div>
</body>
css 复制代码
动画二演示:从 200*100 变化到 300*300 再变化到 800*500

<style>
    .box {
        width: 200px;
        height: 100px;
        background-color: pink;

        animation: changed 1s;
    }

    /* 注意:这里的 0%、20%、100% 表示的意思是动画时常的百分比 */
    @keyframes changed {
        0% {
            width: 200px;
            height: 100px;
        }

        20% {
            width: 300px;
            height: 300px;
        }

        100% {
            width: 800px;
            height: 500px;
        }
    }
</style>

<body>
    <div class="box"></div>
</body>

其他属性值

css 复制代码
<style>
    .box {
        width: 200px;
        height: 100px;
        background-color: pink;

        /* 速度曲线 */
        animation: change 2s linear;       /* linear: 匀速运动 */
        animation: change 2s steps(3);     /* steps(n步): 将动画按照"步骤"分成n步 */

        /* 延迟时间 */
        animation: change 2s 4s;           /* 第一个时间是动画时长,第二个时间是延时时间 */

        /* 重复次数 */
        animation: change 2s 3;           /* 动画重复播放3次 */
        animation: change 2s infinite;    /* 动画一直重复播放 */

        /* 动画方向 */
        animation: change 2s alternate;    /* alternate:反向 */

        /* 执行完毕时状态 */
        animation: change 2s forwards;
        animation: change 2s backwards;    /* 默认效果 */
        
        /* 暂停动画 */
        animation-play-state: paused;		/* 通常配合:hover使用 */
    }

    @keyframes change {
        from {
            width: 200px;
        }

        to {
            width: 800px;
        }
    }
</style>

<body>
    <div class="box"></div>
</body>
css 复制代码
animation: 动画名称 动画时长 速度曲线 延迟时间 重复次数 动画方向 执行完毕时状态

提示:
	1.动画名称和动画时长必须赋值
	2.取值不分先后顺序
	3.如果有两个时间值,第一个时间值表示动画时长,第二个时间值表示延迟时间

走马灯案例

css 复制代码
<style>
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }

    li {
        list-style: none;
    }

    img {
        display: block;
        width: 200px;
        height: 102px;
    }

    .box {
        margin: 100px auto;
        width: 600px;
        height: 112px;
        border: 5px solid #000;
        overflow: hidden;
    }

    .box ul {
        display: flex;
        animation: move 6s infinite linear;
    }

    /* 定义位移动画:ul使用动画:鼠标悬停暂停动画 */
    @keyframes move {
        0% {
            transform: translate(0);
        }

        100% {
            /* 向左移动,使用负数;一张图片宽度为200px,4张图片宽度为800px,故而向左移动4张图片的宽度为-800px */
            transform: translate(-800px);
        }
    }

    .box:hover ul {
        animation-play-state: paused;
    }
</style>

<body>
    <div class="box">
        <ul>
            <!-- 真正要展示的图片 -->
            <li><img src="./images/img0.png" alt=""></li>
            <li><img src="./images/img1.png" alt=""></li>
            <li><img src="./images/img2.png" alt=""></li>
            <li><img src="./images/img3.png" alt=""></li>

            <!-- 复制前几张图片进行再次展示,只是为了弥补方框中的空白 -->
            <li><img src="./images/img0.png" alt=""></li>
            <li><img src="./images/img1.png" alt=""></li>
            <li><img src="./images/img2.png" alt=""></li>
        </ul>
    </div>
</body>

精灵动画案例

css 复制代码
<style>
    div {
        width: 140px;
        height: 140px;
        border: 1px solid #000;
        background-image: url(./images/run.png);

        /* 本张精灵图有12个小图,故而steps(12) */
        animation: run 1s steps(12) infinite;
    }

    @keyframes run {
        from {
            background-position: 0 0;
        }

        to {
            background-position: -1680px 0;
        }
    }
</style>

<body>
    <div></div>
</body>

多组动画

css 复制代码
<style>
    div {
        width: 140px;
        height: 140px;
        /* border: 1px solid #000; */
        background-image: url(./images/run.png);

        /* 多组动画 */
        animation:
            run 1s steps(12) infinite,
            move 3s forwards
    }

    /* 实现原地跑的动画效果 */
    @keyframes run {
        from {
            background-position: 0 0;
        }

        to {
            background-position: -1680px 0;
        }
    }

    /* 实现向前移动的动画效果 */
    @keyframes move {
        0% {
            transform: translate(0);
        }

        100% {
            transform: translate(800px);
        }
    }
</style>

<body>
    <div></div>
</body>
相关推荐
y先森3 小时前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy3 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189113 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿4 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡5 小时前
commitlint校验git提交信息
前端
虾球xz5 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇6 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒6 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员6 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐6 小时前
前端图像处理(一)
前端