找回密码
 立即注册
搜索
查看: 12|回复: 3

烟消云散:CSS文本烟雾化特效 转自马黑教程专版

[复制链接]

1638

主题

3439

回帖

1万

积分

管理员

积分
13933
发表于 7 小时前 | 显示全部楼层 |阅读模式

1638

主题

3439

回帖

1万

积分

管理员

积分
13933
 楼主| 发表于 7 小时前 | 显示全部楼层
CSS并非万能,不过模拟文本烟雾化还是可以的,虽然不会很逼真。实现思路是:利用text-shadow、opacity和transform转换的巧妙配合,通过文本阴影+旋转、扭曲、拉伸+透明令文本个体注意烟雾化而后消散。以下是效果和代码:
[size=3em]烟消云散一杯谁共歌欢
css部分:一个父元素盒子样式 #ma,用 flex 布局是为了便于控制文本位置,overflow 属性则约束文本动画仅限呈现在盒子内;.txtBox 类元素样式用于文本,每一个文本个体均使用此类名,动画使用了两个CSS变量,--du 是动画时长,--de 是动画延时,将在JS中给出赋值;关键帧动画 gone 针对文本阴影、不透明度和transform做描述,其中,translate 参数用于设计烟雾的走向,本例是向左、向上。HTML部分:就一个父元素,其内的文本在JS中添加。JS部分:给文本容器 ma 添加文本,文本个体分别装入span,再将 span 标签追加给 ma 容器;span 的CSS样式指定类名即 className 为 txtBox,然后给 --du 和 --de 两个变量赋值,赋值算法的系数不一定这样,可根据文本的长短而定,但乘以几两个变量应保持一致,然后再给 --du 变量总值适当加大一点(比如本例,乘以 0.8 之后再加上 1 秒)。
CSS的盒子背景色、文本颜色以及关键帧动画的相关数值、JS的赋值运算等,均可适当调整参数,以达到设计需求。
这个效果不宜用于长篇文本,一般而言仅适用于字数不太多的单行文本。

1638

主题

3439

回帖

1万

积分

管理员

积分
13933
 楼主| 发表于 7 小时前 | 显示全部楼层
<style>#ma {        margin: 20px auto;        width: 600px;        height: 200px;        font: bold 2.4em sans-serif;        color: transparent;        overflow: hidden;        display: flex;        justify-content: center;        align-items: end;}.txtBox {        text-shadow: 0 0 0 rgba(0,0,0,1);        animation: gone var(--du) var(--de) infinite;}@keyframes gone {        40% {                text-shadow: 0 0 0 rgba(0,0,0,.6);                opacity: .5;        }        100% {                text-shadow: 0 0 0 rgba(0,0,0,.3);            transform: translate(-20px,-60px) rotate(-180deg) skew(20deg) scale(1.8);                opacity: 0;        }}</style><div id="ma"></div><script>let strAr = '烟消云散一杯谁共歌欢'.split('');strAr.forEach((text,key) => {        let span = document.createElement('span');        span.className = 'txtBox';        span.textContent = text;        span.style.cssText += `                --du: ${strAr.length * .8 + 1}s;                --de: ${key * .8}s;        `;        ma.appendChild(span);});</script>

1638

主题

3439

回帖

1万

积分

管理员

积分
13933
 楼主| 发表于 7 小时前 | 显示全部楼层

代码:

<style>
#ma {
	margin: 20px auto;
	width: 600px;
	height: 200px;
	font: bold 2.4em sans-serif;
	color: transparent;
	overflow: hidden;
	display: flex;
	justify-content: center;
	align-items: end;
}
.txtBox {
	text-shadow: 0 0 0 rgba(0,0,0,1);
	animation: gone var(--du) var(--de) infinite;
}
@keyframes gone {
	40% {
		text-shadow: 0 0 0 rgba(0,0,0,.6);
		opacity: .5;
	}
	100% {
		text-shadow: 0 0 0 rgba(0,0,0,.3);
	    transform: translate(-20px,-60px) rotate(-180deg) skew(20deg) scale(1.8);
		opacity: 0;
	}
}
</style>

<div id="ma"></div>

<script>
let strAr = '烟消云散一杯谁共歌欢'.split('');
strAr.forEach((text,key) => {
	let span = document.createElement('span');
	span.className = 'txtBox';
	span.textContent = text;
	span.style.cssText += `
		--du: ${strAr.length * .8 + 1}s;
		--de: ${key * .8}s;
	`;
	ma.appendChild(span);
});
</script>
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

协同嘉业科技有限公司 ( 京ICP备2024053108号-1 )

GMT+8, 2026-10-30 08:54 , Processed in 0.107107 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表