javascript - css替换居中句子中的单词并平滑调整宽度
问题描述
我正在寻找与此页面上的主要效果类似的效果https://sendgrid.com/
页面显示一个居中的句子,一个词被替换,句子左右到词的部分,根据新词的宽度平滑地重新调整位置。
<body>
<h1>
This animation is
<span id="swappable">awesome</span>
don't you think?
</h1>
</body>
body {
display: flex;
justify-content: center;
}
#swappable {
display: inline-block;
}
const swappables = ["bad", "great", "fantastic", "boring"];
let index = 0;
setInterval(() => {
document.getElementById("swappable").innerHTML = swappables[index];
index = index == swappables.length - 1 ? 0 : index + 1;
}, 3000);
此代码使零件在替换单词后卡入到位,但
我怎样才能实现这种平稳过渡?
解决方案
document.addEventListener('DOMContentLoaded',()=>{
const stringsCont = document.querySelector('#strings-cont');
const strings = [...stringsCont.querySelectorAll('.string')];
let active = 0;
next = () =>{
strings.forEach((s,i) => i===active?s.classList.add('active'):s.classList.remove('active'));
stringsCont.style.width = strings[active].offsetWidth+'px';
active = (active+1)%strings.length;
}
setInterval(next, 3000);
setTimeout(next,0)
});
h1 {
font-family: sans-serif;
font-size: 16px;
text-align: center;
font-weight: normal;
display: flex;
align-items: center;
justify-content: center;
}
#strings-cont{
position: relative;
display: inline-flex;
transition: width .3s ease;
justify-content: center;
}
.string {
font-weight: bold;
transition: opacity .3s ease, top .3s ease;
position: absolute;
opacity:0;
left: 50%;
top: 100%;
transform: translateX(-50%);
white-space: nowrap;
}
.string:before {
content: '';
position: absolute;
top: 100%;
left:0;
height: 3px;
width: 0;
background-color: violet;
}
.string.active {
transition: opacity .3s ease;
opacity:1;
position: static;
transform: translateX(0);
left:0;
top:0;
}
.string.active:before {
width: 100%;
transition: all 2.7s ease;
transition-delay: .3s;
}
<h1>
Send Email
<span id="strings-cont" style="width:0">
<span class="string">Lorem Ipsum</span>
<span class="string">Dolor Sit Ammet</span>
<span class="string">Consectetur Adipiscing Elit</span>
<span class="string">Sed Do Eiusmod</span>
</span>
With Confidence
</h1>
推荐阅读
- mysql - 如何将ip地址插入mysql
- html-framework-7 - Framework7 已经初始化(React)
- qt5 - bitbake:如何恢复编译
- python-3.x - 如何知道用户是否在 wxPyhton 中更改了 AuiNotebook 的选项卡顺序?
- php - 带有准备好的语句的 mysqli_stmt_num_rows 不返回行数
- asp.net-mvc - 从特定索引实体框架的会话中删除
- .net - 无法打破 foreach 循环
- python - 用python计算价值增加的总和
- javascript - 尽管凭据错误,但发出休息后请求总是返回 200
- c - 如何检查字符串是否包含某个字符?