如何快速实现多行文本擦除效果

今天来实现一个多行文本擦除的效果,有种经典咏流传节目中表演开始前阅读诗句的一些既视感,在工作中其实也遇到过这样的需求当时是用的其他方法来实现的,现在发现了更简单的一种方法并且里面也涵盖了不少的知识点。

以上就是最终要实现的效果,比较敏感的同学呢应该能看到文本是由歌词组成的哈哈,没错今天是我偶像发新歌的一天,就用歌词来致敬一下吧!

思路

首先先来捋一下思路,乍一看效果好像只有一段文本,但其实是由两段相同文本组成的。

  1. 两段相同文本组成,这是为了让它们实现重合,第二段文本会覆盖在第一段文本上。
  2. 修改第二段文本背景色为渐变色。
  3. 最后对渐变颜色的背景色添加动画效果。

先来搭建一下结构部分:

html 复制代码
<body>
    <div class="container">
        <p>
            失去你以来 万物在摇摆 你指的山海 像玩具一块一块 我是你缔造又提防的AI 如果我存在 是某种伤害
            不被你所爱 也不能具象出来 我想拥有你说失去过谁的 那种痛感 失去你以来 万物在摇摆 你指的山海 像玩具一块一块我是你缔造又提防的AI 如果我存在 只对你无害 想做你所爱 再造你要的时代 执行你最初设计我的大概
            成为主宰 失去你以来 万物在摇摆 你指的山海 像玩具一块一块 也许我本来 就是种伤害 我终于明白 我根本就不存在 谁不在造物主设置的循环 活去死来
        </p>
        <p class="eraser">
            <span class="text">
                失去你以来 万物在摇摆 你指的山海 像玩具一块一块 我是你缔造又提防的AI 如果我存在 是某种伤害
                不被你所爱 也不能具象出来 我想拥有你说失去过谁的 那种痛感 失去你以来 万物在摇摆 你指的山海 像玩具一块一块我是你缔造又提防的AI 如果我存在 只对你无害 想做你所爱 再造你要的时代
                执行你最初设计我的大概
                成为主宰 失去你以来 万物在摇摆 你指的山海 像玩具一块一块 也许我本来 就是种伤害 我终于明白 我根本就不存在 谁不在造物主设置的循环 活去死来
            </span>
        </p>
    </div>
</body>

代码中两段文本都是由p标签包裹,第二段中加入了一个span标签是因为后面修改背景色的时候凸显出行的效果,这个下面加上样式后就看到了。

添加样式:

css 复制代码
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    background: #000;
    color: #fff;
}

.container {
    width: 60%;
    text-indent: 20px;
    line-height: 2;
    font-size: 18px;
    margin: 30px auto;
}

现在只需要给第二段增加一个定位效果即可实现文本的覆盖:

css 复制代码
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    background: #000;
    color: #fff;
}

.container {
    width: 60%;
    /* 直接加在父元素中即可对所有块级元素的子元素进行首行缩进 */
    text-indent: 20px;
    line-height: 2;
    font-size: 18px;
    margin: 30px auto;
    position: relative;
}

.eraser {
    position: absolute;
    /* 这里等同于top:0 right:0 bottom:0 left:0 */
    inset: 0;
      /*
        这里解释一下inset属性,inset属性用作定位元素的top、right、bottom 、left这些属性的简写
        依照的也是上右下左的顺序。
        例如:inset:1px 2px 等同于 top:1px right:2px bottom:1px left:2px
    */
}

那接下来就应该修改背景颜色了。

css 复制代码
以上重复代码省略......

.text {
    background: #fff;
}

这时候给span标签加上背景颜色后会看到:

而不是这样的效果,这就是为什么需要加一个span标签的原因了。

css 复制代码
以上重复代码省略......

.text {
    background: linear-gradient(to right, #0000 10%, #000 10%);
    color:transparent;
}

下面要调整的就是将渐变里面的百分比变为动态的,我们可以声明一个变量:

css 复制代码
以上重复代码省略......

.text {
    --p:0%;
    background: linear-gradient(to right, #0000 var(--p), #000 calc( var(--p) + 30px)); // 加上30px显示一个默认的渐变区域
    color:transparent;
}

下面就该加上动画效果了,在设置动画时改变--p变量的值为100%

css 复制代码
以上重复代码省略......

.text {
    --p:0%;
    background: linear-gradient(to right, #0000 var(--p), #000 calc( var(--p) + 30px));
    color:transparent;
    animation: erase 8s linear;
}

@keyframes erase{
    to{
        --p:100%;
    }
}

但是这样写完之后发现并没有出现动画的效果,这是因为css动画中只有数值类的css属性才会生效,这里已经是一个数值了但--p还不是一个属性,所以我们要把他变成一个css属性,可以利用@property规则来帮助我们生成一个-xxx的自定义,它的结构:

css 复制代码
@property 属性名称 {
    syntax: '<类型>'; // 必须
    initial-value: 默认值; // 必须
    inherits: false;  // 是否可继承 非必须
}
css 复制代码
以上重复代码省略......

.text {
    --p:0%;
    background: linear-gradient(to right, #0000 var(--p), #000 calc( var(--p) + 30px));
    color:transparent;
    animation: erase 8s linear;
}

@property --p {
    syntax: '<percentage>';
    initial-value: 0%;
    inherits: false;
}

@keyframes erase{
    to{
        --p:100%;
    }
}

到此为止也就实现开头的效果了!!!

相关推荐
web1309332039814 分钟前
前端下载后端文件流,文件可以下载,但是打不开,显示“文件已损坏”的问题分析与解决方案
前端
outstanding木槿25 分钟前
react+antd的Table组件编辑单元格
前端·javascript·react.js·前端框架
好名字08211 小时前
前端取Content-Disposition中的filename字段与解码(vue)
前端·javascript·vue.js·前端框架
隐形喷火龙1 小时前
element ui--下拉根据拼音首字母过滤
前端·vue.js·ui
m0_748241121 小时前
Selenium之Web元素定位
前端·selenium·测试工具
风无雨2 小时前
react杂乱笔记(一)
前端·笔记·react.js
前端小魔女2 小时前
2024-我赚到自媒体第一桶金
前端·rust
鑫~阳2 小时前
快速建站(网站如何在自己的电脑里跑起来) 详细步骤 一
前端·内容管理系统cms
egekm_sefg2 小时前
webrtc学习----前端推流拉流,局域网socket版,一对多
前端·学习·webrtc
m0_748234342 小时前
前端工作中问题点拆分
前端