zoukankan      html  css  js  c++  java
  • 如何用纯 CSS 创作背景色块变换的按钮特效

    效果预览

    在线演示

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

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

    可交互视频教程

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

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

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

    源代码下载

    本地下载

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

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

    代码解读

    定义 dom,标准导航结构下,<li> 中的每个字母用 <span> 包裹:

    &lt;nav&gt;
        &lt;ul&gt;
            &lt;li&gt;
                &lt;span&gt;p&lt;/span&gt;
                &lt;span&gt;r&lt;/span&gt;
                &lt;span&gt;o&lt;/span&gt;
                &lt;span&gt;d&lt;/span&gt;
                &lt;span&gt;u&lt;/span&gt;
                &lt;span&gt;c&lt;/span&gt;
                &lt;span&gt;t&lt;/span&gt;
                &lt;span&gt;s&lt;/span&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/nav&gt;
    

    居中显示:

    body {
        margin: 0;
        height: 100vh;
        display: flex;
        align-items: center;
        justify-content: center;
        background: linear-gradient(to right bottom, dimgray, black);
    }
    

    定义文字样式:

    ul {
        padding: 0;
    }
    
    li {
        list-style-type: none;
    }
    
    li span {
        color: white;
        font-size: 50px;
        font-family: monospace;
        text-transform: uppercase;
        letter-spacing: 0.1em;
    }
    

    当鼠标悬停时,用伪元素绘制倾斜的背景色块:

    li span {
        position: relative;
        transition: 500ms;
    }
    
    li:hover span {
        color: #333;
    }
    
    li span::before {
        content: '';
        position: absolute;
        height: 100%;
         0;
        z-index: -1;
        transition: 500ms;
    }
    
    li:hover span::before {
         70%;
        transform: rotate(-25deg);
        background: white;
    }
    

    设置缓动延时,增加动画效果:

    li:hover span {
        transition-delay: calc(80ms * var(--n) + 10ms);
    }
    
    li:hover span::before {
        transition-delay: calc(80ms * var(--n));
    }
    
    li span:nth-child(1) {
        --n: 1;
    }
    
    li span:nth-child(2) {
        --n: 2;
    }
    
    li span:nth-child(3) {
        --n: 3;
    }
    
    li span:nth-child(4) {
        --n: 4;
    }
    
    li span:nth-child(5) {
        --n: 5;
    }
    
    li span:nth-child(6) {
        --n: 6;
    }
    
    li span:nth-child(7) {
        --n: 7;
    }
    
    li span:nth-child(8) {
        --n: 8;
    }
    

    在单词左侧增加一条鼠标悬停时变亮的竖线:

    li {
        padding-left: 2em;
        border: 2px solid transparent;
        border-left-color: silver;
        transition: 500ms;
    }
    
    li:hover {
        border-left-color: white;
    }
    

    dom 中增加几个按钮,形成一组按钮:

    &lt;nav&gt;
        &lt;ul&gt;
            &lt;li&gt;
                &lt;span&gt;h&lt;/span&gt;
                &lt;span&gt;o&lt;/span&gt;
                &lt;span&gt;m&lt;/span&gt;
                &lt;span&gt;e&lt;/span&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;span&gt;p&lt;/span&gt;
                &lt;span&gt;r&lt;/span&gt;
                &lt;span&gt;o&lt;/span&gt;
                &lt;span&gt;d&lt;/span&gt;
                &lt;span&gt;u&lt;/span&gt;
                &lt;span&gt;c&lt;/span&gt;
                &lt;span&gt;t&lt;/span&gt;
                &lt;span&gt;s&lt;/span&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;span&gt;s&lt;/span&gt;
                &lt;span&gt;e&lt;/span&gt;
                &lt;span&gt;v&lt;/span&gt;
                &lt;span&gt;i&lt;/span&gt;
                &lt;span&gt;c&lt;/span&gt;
                &lt;span&gt;e&lt;/span&gt;
                &lt;span&gt;s&lt;/span&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;span&gt;c&lt;/span&gt;
                &lt;span&gt;o&lt;/span&gt;
                &lt;span&gt;n&lt;/span&gt;
                &lt;span&gt;t&lt;/span&gt;
                &lt;span&gt;a&lt;/span&gt;
                &lt;span&gt;c&lt;/span&gt;
                &lt;span&gt;t&lt;/span&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/nav&gt;
    

    最后,文字居中对齐,再调整一下按钮间距:

    li {
        text-align: center;
        margin: 1em 0;
    }
    

    大功告成!

    原文地址:https://segmentfault.com/a/1190000015192218
  • 相关阅读:
    LIS(nlogn) POJ 3903 Stock Exchange
    LCS(滚动数组) POJ 1159 Palindrome
    LCS(打印全路径) POJ 2264 Advanced Fruits
    3-16 提取任务(第6章)
    3-15 《元编程》第6章 3-16 hook method
    3-13《元编程》第5章Class Definitions 3-14(5-4Singleton Classes,2小时)3-15(3小时✅)
    3-11 《Ruby元编程》第4章block块 3-12
    3-9《元编程》第3章Tuesday:methods
    3-8《Ruby元编程》第二章对象模型
    2-27 最短路径《啊哈算法》2-28完成四种算法
  • 原文地址:https://www.cnblogs.com/lalalagq/p/10007296.html
Copyright © 2011-2022 走看看