用CSS实现鼠标悬停后卡片上升并出现亮光特效

5,659 阅读2分钟

效果

AlloyTeam网页中有这样一种效果,鼠标hover某一个盒子出现上升,并带有亮光的特效,不多说直接看下面的动图。

盒子上升阴影和亮光效果.gif

思路分析

效果分析

仔细观察,鼠标hover后,盒子出现了上升的现象,盒子周围也出现了阴影,鼠标移开后,盒子又自动回来了,并且上升的过程中盒子上有一道亮光闪过

其实这种效果用简单的html+css就可以实现,用到的知识主要是盒子模型、定位中的子绝父相、溢出隐藏以及平面位移等

代码分析

这里只用demo来解释原理,实际应用可以放到flex布局中等等。

  1. 首先写两个父子关系的div的盒子,子盒子box1用来实现亮光特效,用伪元素也可以
    <div class="box">
        <div class="box1"></div>
    </div>
  1. 设置box和box1的css基本样式,并加上子绝父相,子盒子需要加上渐变色,父盒子记得overflow:hidden去掉子盒子由于定位在外面多余的区域
.box {
    	   overflow:hidden;
            position: relative;
            width: 300px;
            height: 300px;
            border: 1px solid #000;
            background-color: pink;
            margin: 100px auto;
	}
.box1 {
            position: absolute;
            left: -110%;
            top: 0;
            width: 300px;
            height: 300px;
            background-image: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .5), rgba(255, 255, 255, 0));
        }
  1. 实现hover父盒子box上升和阴影
.box:hover {
            transform: translateY(-20px);
            box-shadow: 0 26px 40px -24px rgb(0 36 100 / 50%);
        }

再给box盒子加上过渡属性即可transition: all .2s;

  1. 实现盒子hover亮光效果 原理:hover后用子盒子box1水平从左移到右边即可,斜着使用transform: skew(-30deg);使盒子变成平行四边形

加上代码:

.box1{
    transform:skew(-30deg);
		}
.box:hover .box1 {
            left: 110%;
            transition: all .3s;
        }

补充知识:hover父盒子,给子盒子加位移或者定位

  • 子盒子不加过渡效果 直接闪现过去 闪现回来
  • 子盒子加上过渡效果 缓慢过去缓慢回来,给hover的选择器加过渡,缓慢过去,闪现回来(过渡本来是谁需要变就给谁加)。就是这里实现的效果,鼠标hover的时候出现亮光,鼠标移开时不出现亮光

效果

1.gif

完整代码

<!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 {
            overflow: hidden;
            position: relative;
            width: 300px;
            height: 300px;
            border: 1px solid #000;
            background-color: pink;
            margin: 100px auto;
            transition: all .2s;
        }
        .box1 {
            position: absolute;
            left: -110%;
            top: 0;
            width: 300px;
            height: 300px;
            background-image: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .5), rgba(255, 255, 255, 0));
            transform: skew(-30deg);
        }
        .box:hover .box1 {
            left: 110%;
            transition: all .3s;
        }
        .box:hover {
            transform: translateY(-20px);
            box-shadow: 0 26px 40px -24px rgb(0 36 100 / 50%);
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="box1"></div>
    </div>
</body>
</html>