请马上登录,朋友们都在花潮里等着你哦:)
您需要 登录 才可以下载或查看,没有账号?立即注册
x
<style>
/* 帖子元素(模拟) */
.pa {
margin: 20px auto;
width: 100% ;
min-height: 600px;
display: grid;
place-items: center;
position: relative;
}
/* 总文本容器 */
#ma { position: absolute; }
/* 单个文本容器 */
.char {
display: block;
padding: 0 2px;
font: bold 2.4em sans-serif;
text-shadow: 1px 1px 2px black;
opacity: 0;
transform: translate(var(--x), var(--y));
animation: fadeIn 1.5s var(--delay) forwards, flash 1s infinite alternate;
}
/* 行内块class : 横排使用 */
.inline-block { display: inline-block; }
/* 文本淡入动画 */
@keyframes fadeIn {
to { transform: translate(0, 0); opacity: 1; }
}
/* 文本闪烁动画 */
@keyframes flash {
to { filter: hue-rotate(360deg); }
}
</style>
<div id="pa" class="pa">
<div id="ma" class="wrapper"></div>
</div>
<p style="text-align:center;">
<input id="inline" type="checkbox" value="0" />
<label for="inline">横排</label>
<button id="btnDo" type="button">再来一次</button>
</p>
<script>
const text = '本是後山人偶做前堂客'; // 待处理的文本内容
breakup(text, ma); // 运行文本特效
btnDo.onclick = () => breakup(text, ma);
// 处理文本函数(打散、封装)
function breakup(str, targetElm) {
targetElm.innerHTML = ''; // 清空总文本容器内容
// 拆解文本为单个、置入数组(同时处理空格以兼顾拼音类语言文本)
const chars = str.split('').map(c => c === ' ' ? ' ' : c);
const frg = document.createDocumentFragment(); // 创建文档碎片
// 遍历文本数组,使用span标签逐一封装文本
chars.forEach((char, idx) => {
const span = document.createElement('span'); // 创建span标签
span.innerHTML = char; // 单个文本置入span标签
span.classList.add('char'); // span标签的class类名(重要,文本样式和动画高度依赖)
const x = Math.random() * (Math.random() > 0.5 ? 300 : -300); // 随机水平位置
const y = Math.random() * (Math.random() > 0.5 ? 300 : -300); // 随机垂直位置
// 追加差异化CSS样式
span.style.cssText += `
display: ${inline.checked ? 'inline-block' : 'block'}; /* 横排或竖排 */
color: hsl(${Math.floor(Math.random() * 360)}, 100%, 50%); /* 随机前景色 */
--x: ${x}px;
--y: ${y}px;
--delay: ${Math.random() * 0.5}s; /* 动画延时 : 主意配套duration-time */
`;
frg.appendChild(span); // span标签加入文档碎片
});
targetElm.appendChild(frg); // 文档碎片加入总文本容器
}
</script>
|