2.css动画(空间转换,动画)

1空间转换

使用transform属性实现元素在空间内的位移、旋转、缩放等效果

空间:是从坐标轴角度定义的。x 、y 和z三条坐标轴构成了一个立体空间,z轴位置与视线方向相同。

空间转换也叫3D转换

 1.1空间位移

使用translate实现元素空间位移效果

1.1.1translatez轴

    /* 3d变换连写 transform: translate3d(x轴,y轴,z轴) */transform: translateZ(400px)

1.1.2perspective(透视)属性

使用perspective属性实现透视效果

 transform: translateZ(400px);看不到z轴的变化情况,因为大小不变看不出变化;

        通过给父级加perspective(透视)属性

        (取值推荐800-1200透视距离也称为视距,所谓的视距就是人的眼睛到屏幕的距离。)

        ,实现近大远小,近实远虚的效果

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        /*  transform: translateZ(400px);看不到z轴的变化情况,因为大小不变看不出变化;
        通过给父级加perspective(透视)属性
        (取值推荐800-1200透视距离也称为视距,所谓的视距就是人的眼睛到屏幕的距离。)
        ,实现近大远小,近实远虚的效果 */
        body {
            perspective: 800px;
        }

        .box {
            width: 200px;
            height: 200px;
            background-color: pink;
            transition: all .8s;
            margin: 200px auto;
        }

        .box:hover {
            transform: translate3d(400px, 200px, 200px);
            /* 3d变换连写 transform: translate3d(x轴,y轴,z轴) */
        }
    </style>
</head>

<body>
    <div class="box">

    </div>
</body>

</html>

1.2空间旋转

3d空间旋转

transform: rotate3d(x, y, z, 角度度数):用来设置自定义旋转轴的位置及旋转的角度;

            x,y,z 取值为0-1之间的数字

            角度单位是:deg,turn

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            width: 200px;
            height: 200px;
            /* background-color: pink; */
            margin: 200px auto;
        }
        .box img {
            width: 100%;
            transition: all .8s;
            height: 100%;
        }

        .box:hover img{
            /* transform: rotatex(180deg ); */
            /* x轴,正值从上往下翻 */
            /* transform: rotatey(360deg ); */
            /* y轴,正值从左往右翻 */
            /* transform: rotatez(180deg ); */
            /* z轴,正值从顺时针转圈 */
            transform: rotate3d(1,1,1,1turn)

            /* 3d空间旋转 transform: rotate3d(x, y, z, 角度度数):用来设置自定义旋转轴的位置及旋转的角度;
            x,y,z 取值为0-1之间的数字
            角度单位是:deg,turn*/
        }
    </style>
</head>

<body>
    <div class="box">
<img src="../images/heart.png" alt="">
    </div>
</body>

</html>

1.3立体呈现(transform-style: preserve-3d)

由于perspective透视属性不能呈现立体图形,perspective只增加近大远小、近实远虚的视觉效果。

所以我们对子元素的父元素使用transform-style: preserve-3d; 使子元素处于真正的3d空间.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            position: relative;
            transform-style: preserve-3d;
            width: 200px;
            height: 200px;
            margin: 100px auto;
            background-color: aqua;
            transition: all .9s;
        }

        .box:hover {
            transform: rotatey(0.5turn);
        }

        .one,
        .two {
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            background-color: red;
            transform: translateZ(100px);

        }

        .two {
            background-color: pink;
            transform: translateZ(-100px);

        }
    </style>
</head>

<body>
    <div class="box">
        <div class="one">
            前面
        </div>
        <div class="two">
            后面
        </div>
    </div>
</body>

</html>

1.4立体按钮

 鼠标移动到'首页'时,上方的index旋转至正面,实现代码如下.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        ul {
            list-style: none;
        }

        a {
            text-decoration: none;
            color: #fff;
        }

        .box {
            width: 800px;
            height: 50px;
            margin: 100px auto;
        }

        .box li {
            perspective:800px;
            width: 120px;
            height: 50px;
            float: left;
            margin-right: 50px;
        }

        .box li a {
            /* 开启3d */
            transform-style: preserve-3d;
            position: relative;
            display: block;
            width: 100%;
            height: 100%;
            /* background-color: pink; */
            transition: all .9s;
        }

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


        .box li span {
            position: absolute;
            left: 0;
            top: 0;
            display: block;
            width: 100%;
            height: 100%;
            text-align: center;
            line-height: 50px;
        }

        .box li span:first-child {
            transform:translatey(-25px) rotateX(90deg) ;
            background-color: yellowgreen;

        }

        .box li span:last-child {
            background-color: blue;
            transform: translateZ(25px);
        }
    </style>
</head>

<body>
    <div class="box">
        <ul>
            <li>
                <a href="#">
                    <span>index</span>
                    <span>首页</span>
                </a>
            </li>
            <li>
                <a href="#">
                    <span>login</span>
                    <span>登录</span>
                </a>
            </li>
            <li>
                <a href="#">
                    <span>register</span>
                    <span>注册</span>
                </a>
            </li>

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

</html>

注意:包含'index'的span需要先y轴上升高盒子高度的一半(25px),然后再绕x轴转90度;

 .box li span:first-child {
            transform:translatey(-25px) rotateX(90deg) ;
            background-color: yellowgreen;
        }

1.5 3d缩放 scale

正常情况下z轴正对我们的方向,即使z轴的高放大我们也无法看到,

所以通过 perspective的近大远小效果,来看到z轴的高的放大,盒子向内转90度后,盒子的z轴高度就能被我们看到.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            perspective: 800px;
            /* 透视默认中心点在盒子中间,所以以后记得把盒子居中 */
        }

        .box {
            width: 400px;
            height: 400px;
            background-color: pink;
            margin: 200px auto;
            transition: all .9s;
        }

        .box:hover {
            /* transform: scalex(2); */
            /* scalx,放大的是宽 */
            /* transform: scaley(2); */
            /* scaly,放大的是高 */
            transform: scalez(200) rotatex(90deg);
                /* scalz,放大的是高 */

        }
    </style>
</head>

<body>
    <div class="box">

    </div>
</body>

</html>

2.动画animation

过渡与动画的区别?

1.过渡实现的是2个状态间的变化过程,而动画可以实现多个状态间的变化过程.,且动画过程可控(重复播放、最终画面、是否暂停)

2.过渡通常要与伪类选择器:hover搭配使用,而动画不必要

2.1 实现动画的步骤

2.1.1      定义一个动画  @keyframes 动画名{}

   @keyframes run {
            100%{
                background-position: -1680px 0;
            }

2.1.1.1定义动画第一种方式

   @keyframes move{
            from{
                transform: translate(0, 0);
            }
            to{
                transform: translate(1000px, 0);
            }
        }

2.1.1.2定义动画第二种方式

  @keyframes run {
            0%{
                background-position: 0 0; 
            }
            100%{
                background-position: -1680px 0;
            }
        }

注意:

1.0%到100%之间可以写多个值,如0%,25%,50%,75%,100%

2.如果from或者0%的盒子位置状态不发生变化可以省略,如:

  @keyframes run {
            100%{
                background-position: -1680px 0;
            }
        }

2.1.2     调用动画 animation: 动画名 动画花费时长

            animation: run 2s infinite alternate linear;

2.1.3

animation的连写方式:

 2.1.4

animation的部分属性和属性值:

 2.2 逐帧动画

使用steps实现逐帧动画
逐帧动画:帧动画。开发中,一般配合精灵图实现动画效果。
animation-timing-function: steps(N);含义:将动画过程等分成N份

实现剑客奔跑效果

精灵图:

 注意:

1.定义动画中(keyframs中)改变背景图的位置移动的距离就是精灵图的宽度.

@keyframes run {
            100%{
                background-position: -1680px 0;
            }
        }

2.添加速度曲线steps(n)时,n就是精灵图上小图的个数.

animation: run 2s  steps(12) infinite,move 3s infinite linear;

3.添加无限重复效果infinite

animation: run 2s  steps(12) infinite,move 3s infinite linear;

代码如下: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box
        {
            width: 140px;
            height: 140px;
            background-color: green;
            /* border-radius: 50%; */
            background-image: url(../images/bg.png);
            animation: run 2s  steps(12) infinite,move 3s infinite linear;
        }
        @keyframes run {
            100%{
                background-position: -1680px 0;
            }
        }
        /* @keyframes move {
            100%{
                transform: translate(1900px,0) rotate(3turn);

            }
        } */

    </style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

 2.3 轮播图实现

实现轮播框内七个图无缝循环播放,鼠标移动上去会暂停.

注意:

当原本七个图结束后会出现空白,同时会突兀的转到第一二三张图出现在展示框内.

为了解决这个问题,使不出现空白并且使连接第一二三张图更加无缝,我们在原本的七个li后增加三个li,这三个li复制于前三张图,所以其实ul中一共有7+3=10张图.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

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

        .box ul {
            width: 2000px;
            list-style: none;
            animation: move 6s infinite linear;
        }
        ul:hover{
            animation: move 3s infinite linear paused;
        }

        .box ul li {
            float: left;
        }

        a {
            display: block;
            width: 200px;
            height: 150px;
        }

        img {
            width: 100%;
            height: 100%;
        }

        @keyframes move {
            100% {
                transform: translate(-1400px, 0);
            }
        }
    </style>
</head>

<body>
    <div class="box">
        <ul>
            <li><a href="#">
                    <img src="../images/1.jpg" alt=""></a>
            </li>
            <li><a href="#">
                    <img src="../images/2.jpg" alt=""></a>
            </li>
            <li><a href="#">
                    <img src="../images/3.jpg" alt=""></a>
            </li>
            <li><a href="#">
                    <img src="../images/tyre1.png" alt=""></a>
            </li>
            <li><a href="#">
                    <img src="../images/tyre.png" alt=""></a>
            </li>
            <li><a href="#">
                    <img src="../images/product.jpg" alt=""></a>
            </li>
            <li><a href="#">
                    <img src="../images/rotate.png" alt=""></a>
            </li>
            <li><a href="#">
                    <img src="../images/1.jpg" alt=""></a>
            </li>
            <li><a href="#">
                    <img src="../images/2.jpg" alt=""></a>
            </li>
            <li><a href="#">
                    <img src="../images/3.jpg" alt=""></a>
            </li>
            <!-- 解决动画留白问题,在后面补上最前面三个图,造成一种接到第一个的假象 -->
        </ul>
    </div>
</body>

</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值