实现多行文字被颜色逐渐填满的特效

这是我参与更文挑战的第25天,活动详情查看: 更文挑战

前言

大家好哇,又到了夜深人静更文的时候啦!周五加班的我,准备开始更文就已经十一点了,但是更文大业不能停哇~做一件事无论成败,贵在过程,贵在坚持不是吗?

今天我们来用实现多行文字文字被颜色逐渐填满的特效

前几天我写了一篇《纯css实现:文字被颜色逐渐填满的特效》,有这么一条评论:

image.png

嗐~ 学习就学习,干嘛要举一反三呢?

明明是禁止换行才能实现的效果,你问我多行文字怎么处理?

想当年我手拿一把西瓜刀,从南天门砍到玉皇殿,我说我杀人不眨眼,你问我眼睛干不干?

image.png

好吧,今天也顺便解决一下这个多行文字逐渐被填充的效果~

那么一起来开始吧!

过程

按照我原先的想法,是JS动态判断有多少行,然后根据行数来分割,给每一行应用文字填充的动画效果即可。但是今天我突发奇想,如果把文字切割出来是不是更方便一些呢?思路如下:

  • 两个文字层要重叠,也就是说样式一样。
  • 提取底部文字盒子的文字,遍历它,用span标签包裹,然后每隔0.3秒向上层盒子添加它。
  • 把渐渐填满文字的动画加给span标签即可,这样当前文字动画结束之后,下个文字被添加进来,动画又开始。

于是我敲出了如下代码:

    <style>
        .box{
            width: 888px;
            height: 300px;
            margin: 200px auto;
            position: relative;
        }
   
        p{
            position: absolute;
            top: 0;
            left: 0;
            font-size: 36px;
            font-weight: 600;
        }
        #text{
            color: #666;
        }
        #copyText{
            color: rgb(253, 145, 145);
        }


        span {
            display: inline-block;
            white-space: nowrap;
            background: linear-gradient(to right, #ABDCFF, #0396FF);
            -webkit-background-clip: text;
            color: transparent;
            animation: landIn 1s linear;
        }

        @keyframes landIn {
            0% {
                width: 0;
            }
            100% {
                width: 1em;
            }
        }
    </style>

    <div class="box">
        <p id="text">你好呀,我是南极大冰块~目前是一名在线掘金高级摸鱼师,精通摸鱼、划水、坐着睡觉、拍马屁、吹牛、甩锅、吵架等前端开发必备技能~关注我,一起学习好玩的前端知识吧!</p>
        <p id="copyText"></p>
    </div>

    <script>
        let text = document.querySelector("#text")
        let copyText = document.querySelector("#copyText")
        // textContent 属性设置或返回指定节点的文本内容,以及它的所有后代。
        let letters = text.textContent.split("")
        console.log(letters)
        for (let i = 0; i < letters.length; i++) {
            let span = document.createElement("span")
            span.textContent = letters[i]
            setTimeout(() => {
                copyText.append(span)
            }, 1000*i)
        }
    </script>
复制代码

运行效果如下:

GIF 2021-6-25 22-34-32.gif

看起来似乎没什么问题?其实不然,最右边动画的时候会出现没有底层文字,只有上层文字的情况,虽然一闪而过,但也是问题:
image.png

为什么会这样呢?因为p标签的宽度是确定的,当span标签由0变为1em的时候,它并不知道剩余的宽度是否能容下自身,当它发现剩余的空间容不下自身,于是就会换行,就出现了一闪而过的情况。

image.png

怎么解决这个问题呢?我想到了两端对其,于是我给p标签加了text-align: justify;,我满心欢喜的以为解决了这个小问题,结果发现运行效果如下:

这这这。。。布局都乱掉了啊喂!

这是因为我给span设置了宽度1em,相当于是36px,它并不会跟着p标签变得两端对齐,那么怎么做呢?

很简单,给p标签应用设置等宽字体,然后p标签就会被占满,即使它的宽度不设置text-align: justify;,看起来也是两端对其的,同时span标签的每一个字符也能完美重叠上去。

但是中文的等宽字体下载都要收费,暂时没找到的合适的字体来验证。不过也算多了一种思路实现多行文字被颜色填充的效果,毕竟JS去获取行数的变化实在不够优雅~

后记

希望大冰块今天分享的内容能对你有所帮助,多行文字被颜色逐渐填满的特效可以用在首页,介绍页等吸引人注意的地方。实现起来其实也没那么难以实现,比如这篇文章加上代码,也就一小时左右搞定了~ 说起来今天的更文还是蛮顺利的~

今天是我坚持日更的第二十五天,每天输出一点点,进步一点点。有志者,事竟成。大家一起加油呀~

如果本文对你有帮助,别再是悄悄收藏啦!比如点个赞呀,关注大冰块呀,一起和大冰块学习更多好玩的技术博客吧~

d2a3b6f182407290c859b16b1d4715a3.gif

更文挑战的文章目录如下:

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享