zoukankan      html  css  js  c++  java
  • 如何把握好 transition 和 animation 的时序,创作描边按钮特效

    效果预览

    在线演示

    按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。

    https://codepen.io/comehope/pen/mKdzZM

    可交互视频教程

    此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。

    请用 chrome, safari, edge 打开观看。

    https://scrimba.com/p/pEgDAM/cgnk6Sb

    源代码下载

    本地下载

    每日前端实战系列的全部源代码请从 github 下载:

    https://github.com/comehope/front-end-daily-challenges

    代码解读

    定义 dom,标准的导航模式:

    <nav>
        <ul>
            <li>Home</li>
        </ul>
    </nav>
    

    居中显示:

    body {
        margin: 0;
        height: 100vh;
        display: flex;
        align-items: center;
        justify-content: center;
        background-color: black;
    }
    

    定义文本和按钮边框样式:

    nav ul {
        padding: 0;
    }
    
    nav ul li {
        color: white;
        list-style-type: none;
        font-size: 32px;
        font-family: sans-serif;
        text-transform: uppercase;
         12em;
        height: 4em;
        border: 1px solid rgba(255, 255, 255, 0.2);
        text-align: center;
        line-height: 4em;
        letter-spacing: 0.2em;
    }
    

    用 before 伪元素定义上边框和右边框,其中边框颜色因会多次被用到,所以采用变量:

    :root {
        --color: dodgerblue;
    }
    
    nav ul li::before {
        content: '';
        position: absolute;;
         0;
        height: 0;
        visibility: hidden;
        top: 0;
        left: 0;
        border-top: 1px solid var(--color);
        border-right: 1px solid var(--color);
    }
    

    类似地,用 after 伪元素定义右边框和下边框:

    nav ul li::after {
        content: '';
        position: absolute;;
         0;
        height: 0;
        visibility: hidden;
        bottom: 0;
        right: 0;
        border-bottom: 1px solid var(--color);
        border-left: 1px solid var(--color);
    }
    

    设计边框入场的动画效果,按上、右、下、左的顺序依次显示边框,为了方便调整动画的速度设置了与时间相关的变量:

    :root {
        --time-slot-length: 0.1s;
        --t1x: var(--time-slot-length);
        --t2x: calc(var(--time-slot-length) * 2);
        --t3x: calc(var(--time-slot-length) * 3);
        --t4x: calc(var(--time-slot-length) * 4);
    }
    
    nav ul li:hover::before,
    nav ul li:hover::after {
         100%;
        height: 100%;
        visibility: visible;
    }
    
    nav ul li:hover::before {
        transition:
            visibility 0s,
            width linear var(--t1x),
            height linear var(--t1x) var(--t1x);
    }
    
    nav ul li:hover::after {
        transition: 
            visibility 0s var(--t2x),
            width linear var(--t1x) var(--t2x),
            height linear var(--t1x) var(--t3x);
    }
    

    设计边框出场的动画效果,与入场的顺序相反:

    nav ul li::before {
        transition:
            height linear var(--t1x) var(--t2x),
            width linear var(--t1x) var(--t3x),
            visibility 0s var(--t4x);
    }
    
    nav ul li::after {
        transition:
            height linear var(--t1x),
            width linear var(--t1x) var(--t1x),
            visibility 0s var(--t2x);
    }
    

    让按钮文字在描边期间变色:

    nav ul li {
        transition: var(--t4x);
    }
    
    nav ul li:hover {
        color: var(--color);
    }
    

    最后,在描边结束后,在按钮四周增加一个脉冲动画,加强动感:

    nav ul li:hover {
        animation: pulse ease-out 1s var(--t4x);
    }
    
    @keyframes pulse {
        from {
            box-shadow: 0 0 rgba(30, 144, 255, 0.4);
        }
    
        to {
            box-shadow: 0 0 0 1em rgba(30, 144, 255, 0);
        }
    }
    

    大功告成!

    原文地址:https://segmentfault.com/a/1190000015089396

  • 相关阅读:
    MATLAB01
    Diffie-Hellman 密钥交换
    古典密码
    正则表达式
    装饰器初析
    进制转换的栈实现
    Log4j(异常日志)
    2018/6/6
    2018.1.1T19B3-u4
    2018.1.1T19-B3-U3jiangyi
  • 原文地址:https://www.cnblogs.com/lalalagq/p/10000028.html
Copyright © 2011-2022 走看看