一个通用的打字机效果

举报
搞前端的半夏 发表于 2021/12/28 22:05:11 2021/12/28
【摘要】 大家好,我是半夏👴,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注➕ 点赞 👍关注公众号:半夏话前端,了解更多前端知识! 前言相信经常看CSS文章的小伙伴,会经常见到关于单行文本的打字机效果。目前的主要实现逻辑是通过设置文本容器的宽度从0变成文本的总长度,使得文字可以逐渐出现。不过这里的文本总长度是比较难获取的。大部分方案的计算方式 px*总字数 或者 em*总字数通过设置文字...

大家好,我是半夏👴,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注➕ 点赞 👍关注公众号:半夏话前端,了解更多前端知识!

前言

相信经常看CSS文章的小伙伴,会经常见到关于单行文本的打字机效果。

目前的主要实现逻辑是

  1. 通过设置文本容器的宽度从0变成文本的总长度,使得文字可以逐渐出现。不过这里的文本总长度是比较难获取的。大部分方案的计算方式 px*总字数 或者 em*总字数
  2. 通过设置文字出现动画的steps(),保证文字可以逐个出现。

本文的实现逻辑任然是基础上面的思路,不过会加以改进,做一个通用的单行打字机效果。

容器

.text {
    max-width: 0; 
    white-space: nowrap;
    overflow: hidden;
    font-size: 16px;
    animation: typing 3s steps(var(--textlen)) ;

}    
 <div class="text" >我是打字机效果的文字</div>

容器的初始宽度设置为0,这里我使用的是max-width,当然也可以使用width。overflow保证多余文本不会出现。

会调用一个打字机的动画。steps使用了–textlen。这里的–textlen 用来保存文字的长度。

动画

设置宽度变化为文字总长度。

@keyframes typing {
    100% {
    	max-width: calc(var(--textlen) * 16px);
    }
}

js获取长度

这里是style.setProperty,直接修改CSS变量的值,所以就不需要自己先计算max-width和steps().

const text = document.getElementById("text");
const content = text.innerHTML;
text.style.setProperty("--textlen", content.length);

ch替换px

在CSS,ch是相对于数字0的大小。1ch等于一个0的宽度。在CSS中,在中文下,一个汉字是2ch。在英文下,一个字母是1ch。

所以利用这个特定,我们不需要考虑父元素px的情况。只需要:

中文:

max-width: calc(var(–textlen) * 16px);替换成max-width: calc(var(–textlen) * 2ch);

英文:

max-width: calc(var(–textlen) * 16px);替换成max-width: calc(var(–textlen) * 1ch);

请注意:根据设置的 font-family的不同,中文情况下2ch还是存在无法展示一个完整汉字的情况。

例如在 font-family:sans-serif;的情况下,是无法完整展示的。我目前还在研究这个问题。

image-20211127141211046

在font-family:monospace的情况下,是可以完整展示的

image-20211127141339613

效果

打字机

后记

对于纯CSS实现打字机效果,需要自己数出文本的长度,以及字符的个数,比较麻烦。而使用CSS变量加上JS的方式,避免了人工计数的繁琐。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。