利用css实现“过渡效果”小案例 1

80 阅读2分钟

任务

实现以下效果演示:

过渡动画效果.gif

思路

首先准备图片资源,如下

image.png

然后,由效果图可知,悬停一个图标上时,背景图标旋转360°,前景图标放大一定倍数。

因此,用li标签来当作容器时,悬停在一个li上产生上述效果,此时不能用背景图标当作li的背景图片,否则只能对li本身旋转才能带动背景图片一起旋转,这样的话前景图标就会跟着旋转。

所以,li只能用作悬停效果,在li里面插入这两个图片,分别采用不同的过渡效果:可以使用::before伪元素当作子元素再给它添加背景图标当作背景图片。

代码

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>01.html</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .box{
            width: 508px;
            height: 107px;
            margin: 100px auto;
        }
        .box ul{
            list-style: none;
        }
        .box ul li{
            float: left;
            width: 107px;
            height: 107px;
            margin-right: 20px;
            position: relative;
        }
        /* 
            如果给li添加背景图片,当它旋转时也会带动里面的子元素图标,因此思路是 
            这两个图片一定是li的两个子元素,一个旋转,一个放大,互不影响。
            
            故好的思路是:直接创建伪元素添加背景图片(不用额外创建一个div去包裹 
            它-当然也行),然后图标通过定位-相对于父盒子li,去实现覆盖居中。
            也可以直接插入两个图片。
        */
        .box ul li::before{
            content: '';
            display: block;
            width: 107px;
            height: 107px;
            /* 最好加个初始值 */
            transform: rotate(0);
            transition: transform .8s ease 0s;
        }
        .box ul li:nth-child(1):before{
            background-image: url(images/a_1.png);
        }
        .box ul li:nth-child(2):before{
            background-image: url(images/a_2.png);
        }
        .box ul li:nth-child(3):before{
            background-image: url(images/a_3.png);
        }
        .box ul li:nth-child(4):before{
            background-image: url(images/a_4.png);
        }
        .box ul li:hover::before{
            transform: rotate(360deg);
        }
        .box ul li img{
            width: 60px;
            height: 60px;
            position: absolute;
            top: 50%;
            left: 50%;
            margin-top: -30px;
            margin-left: -30px;
            transition: transform .8s ease 0s;
        }
        .box ul li:hover img{
            transform: scale(1.2);
        }
    </style>
</head>

<body>
    <div class="box">
        <ul>
            <li>
                <img src="images/icon1.svg" alt="">
            </li>
            <li>
                <img src="images/icon2.svg" alt="">
            </li>
            <li>
                <img src="images/icon3.svg" alt="">
            </li>
            <li>
                <img src="images/icon4.svg" alt="">
            </li>
        </ul>
    </div>
</body>

</html>