CSS+HTML动手实战(一)鼠标悬停效果

前言

最近学习完了CSS+HTML,想做几个项目练练手,经朋友告知,可以写代码记录,所以在此进行代码的另类备份以及记录实际动手时发现的问题。(新手向记录,望大佬们海涵!)(每个实战后都附有完整代码)

(一)鼠标悬停实现翻转

通过CSS3中的属性transition实现某个属性发生改变时,产生一个过渡效果,过渡,即属性变换的过程产生一定延迟,并非生分的直接变化,能产生一定的视觉美感(bushi)。

  • 首先设置一个三层的div嵌套,最外层div用于装下实现本次翻转效果的其余div,第二层div可以提供一个拥有两个面的立体空=间,实现翻转的视觉效果,第三层两个div为第二层div的两个面。
<body>
    <div class="out_div">
        <div class="contt">
            <div class="first_div">First Page</div>
            <div class="back_div">Back Page</div>
        </div>
    </div>
</body>
  • 然后为每一个div加上宽高,背景色等基本属性,并将两个需要翻转的div设置为绝对定位,使其脱离文档流(否则两个div的位置会不重叠,翻转时位置产生变化)
<style>
        .out_div{
            display: inline-block;
            width: 160px;
            height: 80px;
        }
        .contt{
            display: inline-block;
            width: 100%;
            height: 100%;
        }
        .first_div{
            position: absolute;
            display: inline-block;
            width: 100%;
            height: 100%;
            background-color: aqua;
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;
        }
        .back_div{
            position: absolute;
            display: inline-block;
            width: 100%;
            height: 100%;
            background-color: aquamarine;
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;
        }
</style>
  • 最后为两个最内层的div设置过渡效果,实现鼠标悬浮时翻转。如下,完整style代码:
    <style>
        .out_div{
            display: inline-block;
            width: 160px;
            height: 80px;
        }
        .contt{
            display: inline-block;

            width: 100%;
            height: 100%;
            transition: transform 0.8s;
            transform-style: preserve-3d;
        }
        .first_div{
            position: absolute;
            display: inline-block;
            width: 100%;
            height: 100%;
            background-color: aqua;
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;
            transition: transfrom 0.8s;
            /*设置backface-visibility属性,使得翻转180度后不显示此div,只有在正面时显示*/
            backface-visibility: hidden;
        }
        .back_div{
            position: absolute;
            display: inline-block;
            width: 100%;
            height: 100%;
            background-color: aquamarine;
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;
            /* 旋转180使得刚开始看不到这个div */
            transform: rotateX(180deg);
            /*过渡效果在transfrom属性产生变化时生效,使得transfrom属性变化时间延迟至0.8s*/
            transition: transfrom 0.8s;
            /*设置backface-visibility属性,使得翻转180度后不显示此div,只有在正面时显示*/
            backface-visibility: hidden;
        }
        .out_div:hover .contt{
            transform: rotateX(180deg);
        }
    </style>
完整代码:
<!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>Flip测试</title>
    <style>
        .out_div{
            display: inline-block;
            width: 160px;
            height: 80px;
        }
        .contt{
            display: inline-block;

            width: 100%;
            height: 100%;
            transition: transform 0.8s;
            transform-style: preserve-3d;
        }
        .first_div{
            position: absolute;
            display: inline-block;
            width: 100%;
            height: 100%;
            background-color: aqua;
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;
            transition: transfrom 0.8s;
            backface-visibility: hidden;
        }
        .back_div{
            position: absolute;
            display: inline-block;
            width: 100%;
            height: 100%;
            background-color: aquamarine;
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;
            /* 旋转180使得刚开始看不到这个 */
            transform: rotateX(180deg);
            transition: transfrom 0.8s;
            backface-visibility: hidden;
        }
        .out_div:hover .contt{
            transform: rotateX(180deg);
        }
        
    </style>
</head>
<body>
    <div class="out_div">
        <div class="contt">
            <div class="first_div">First Page</div>
            <div class="back_div">Back Page</div>
        </div>
    </div>
</body>
</html>

(二)鼠标悬停实现闪光

原理同上,利用的是transition的过渡效果。

  • 首先创建一个div,将其当成产生变化的背景
<div class="shin">触摸就会闪光</div>
  • 接着为这个div设置宽高,背景色等基础属性
<style>
        .shin{
            display: inline-block;
            width: 160px;
            height: 80px;
            background-color: antiquewhite;
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;
        }
</style>
  • 设置完div基础属性后,我们需要用到CSS中的伪类after(after伪类还可以用于解决高度塌陷问题),将after伪类设置成闪光效果中的那道光。

    为了实现类似光闪烁的效果,可以将after伪类设置为绝对定位,使其脱离文档流,提高层级,达到覆盖div的效果,同时为了不影响鼠标不悬浮时的视觉效果,将after伪类初始位置设置在界面外(left: -50px;
    <style>
        .shin{
            display: inline-block;
            width: 160px;
            height: 80px;
            background-color: antiquewhite;
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;
            /*设置为超出时隐藏,可以使得鼠标不悬浮和过渡完后after伪类不会出现在div上层*/
            overflow: hidden;
            /*设置为相对定位可以使得div变成after伪类的包含块,否则after伪类会把根元素html当成它的包含块,使得光束after伪类变化范围出现错误(变成全屏移动的光束了)*/
            position: relative;
        }
        .shin::after{
            content: "";
            background-color: #fff;
            width: 20px;
            /*此处为了模拟的真实,设置的宽度和角度由于div溢出隐藏overflow: hidden的设置,恰好使得旋转后的after伪类显示高度与div一致(实际高度不一致,具体可以删除div的overflow: hidden;属性查看)*/
            height: 120px;
            transform: rotate(30deg);
            left: -50px;
            
            position: absolute;
            transition: left 0.8s;
        }
        .shin:hover::after{
        /*当鼠标悬浮时after伪类从左侧出现,并过渡到div的右侧,但由于div设置了overflow: hidden,故超出时,after伪类会被隐藏*/
            left:120%;
        }
    </style>
完整代码:
<!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>Shin</title>
    <style>
        .shin{
            display: inline-block;
            width: 160px;
            height: 80px;
            background-color: antiquewhite;
            display: flex;
            flex-direction: row;
            justify-content: center;
            align-items: center;
            overflow: hidden;
            position: relative;
        }
        .shin::after{
            content: "";
            background-color: #fff;
            width: 20px;
            height: 120px;
            transform: rotate(30deg);
            left: -50px;
            position: absolute;
            transition: left 0.8s;
        }
        .shin:hover::after{
            left:120%;
        }
    </style>
</head>
<body>
    <div class="shin">触摸就会闪光</div>
</body>
</html>
结语

这次其实也主要是为了尝试写博客,选择的项目也是非常小白的,主要是练练手和练习博客的写法,下次必须有进步!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值