javascript - 带有 setTimeout 延迟无限循环的 Vanilla Javascript 信息代码
问题描述
我正在尝试使用纯粹的 vanilla JS(没有 jQuery 等)来显示信息代码。
我有一个<div class="postcode-panel"></div>
带有一些文字的 div:
XXX 的最新信息- 这将显示 3 秒
然后这个 div 淡出视图并显示下一个 div<div class="rating-panel"></div>
并带有以下文字:
等级 5.4 - 这将显示 15 秒。
一旦 div.rating-panel
被查看了 15 秒,那么第一个 div.postcode-panel
然后循环返回并显示 3 秒,然后无限循环。我正在使用 CSS 控制淡出动画,但我很难让所有不同的超时都在 JS 中工作。
更新:我已经设法更新我的代码以显示和隐藏代码,但我无法在正确的时间里得到它。
这是一个JS Fiddle。
下面是我的代码
function postcode () {
var postcodePanel = document.querySelector(".postcode-panel");
var ratingPanel = document.querySelector(".rating-panel");
var activeClass = 'active';
function start() {
setTimeout(function() {
setTimeout(function(){
postcodePanel.classList.remove(activeClass);
ratingPanel.classList.add(activeClass);
}, 3000);
setTimeout(function(){
start();
}, 15000);
postcodePanel.classList.add(activeClass);
ratingPanel.classList.remove(activeClass);
},100);
}
start();
}
window.addEventListener('load', postcode);
.info-panel {
position:relative;
background:blue;
color:white;
padding:20px;
font-size:20px;
}
.postcode-panel {
display:block;
position:absolute;
opacity: 0;
}
.postcode-panel.active {
animation:ticker-pc 3s ;
}
.rating-panel {
opacity: 0;
}
.rating-panel.active {
animation:ticker-rr 12s ;
}
@keyframes ticker-pc {
0% {
opacity: 0;
-webkit-transform:translateY(30px);
transform:translateY(30px);
}
10% {
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
50% {
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
90% {
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
100% {
opacity: 0;
-webkit-transform:translateY(-30px);
transform:translateY(-30px);
}
}
@keyframes ticker-rr {
0% {
opacity: 0;
-webkit-transform:translateY(30px);
transform:translateY(30px);
}
2% {
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
50% {
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
97% {
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
100% {
opacity: 0;
-webkit-transform:translateY(-30px);
transform:translateY(-30px);
}
}
<div class="info-panel">
<div class="postcode-panel active">
<span class="latest-info">
Latest information for
<span class="postcode-info">
XXX
</span>
</span>
</div>
<div class="rating-panel">
<span class="rating">
Rating <span class="score">5.4</span>
</span>
</div>
</div>
解决方案
您不需要为此专门使用 JavaScript。您可以像现在一样有两个动画,但都持续 18 秒,并设置百分比,以便相关文本显示 3 秒或 15 秒。
您可以通过关键帧获得很多精细控制,并且您可能希望使用百分比来获得您想要的确切内容,但是不需要 JS 来运行您的动画,您应该会发现用户的 GPU 已被调用并为您完成工作。
.info-panel {
position:relative;
background:blue;
color:white;
padding:20px;
font-size:20px;
}
.postcode-panel {
display:block;
position:absolute;
opacity: 0;
animation:ticker-pc 18s infinite;
animation-fill-mode: forwards;
}
.rating-panel {
opacity: 0;
animation:ticker-rr 18s infinite;
animation-fill-mode: forwards;
}
@keyframes ticker-pc {
0% {
opacity: 0;
-webkit-transform:translateY(30px);
transform:translateY(30px);
}
1.66666% {/* gets into view at full opacity after 0.3seconds */
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
16.66666% {/* stays there for 3 seconds - 0.3 seconds */
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
18.33332% {/* goes out at the top and fades away after 0.3 seconds */
opacity: 0;
-webkit-transform:translateY(-30px);
transform:translateY(-30px);
}
100% {
opacity: 0;
-webkit-transform:translateY(-30px);
transform:translateY(-30px);
}
}
@keyframes ticker-rr {
0% {
opacity: 0;
-webkit-transform:translateY(30px);
transform:translateY(30px);
}
16.6667% { /* wait for 3 seconds */
opacity: 0;
-webkit-transform:translateY(30px);
transform:translateY(30px);
}
18.33332% {/* get into view at full opacity after 0.3seconds */
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
98.33334% {/* stay in full view for rest of time -0.3 seconds */
opacity: 1;
-webkit-transform:translateY(0);
transform:translateY(0);
}
100% {
opacity: 0;
-webkit-transform:translateY(-30px);
transform:translateY(-30px);
}
}
<div class="info-panel">
<div class="postcode-panel">
<span class="latest-info">
Latest information for
<span class="postcode-info">
XXX
</span>
</span>
</div>
<div class="rating-panel">
<span class="rating">
Rating <span class="score">5.4</span>
</span>
</div>
</div>
推荐阅读
- html - 使绝对定位的轮播响应
- python - 检查的有效实现:对于数组中的每个元素,检查它是否存在于另一个数组中
- docker - 无法在 dockerfile 中获取 heroku $port
- python - python有没有可以从Web of Science或Scopus获取记录的包?
- ansible - 如何将配置项从ansible playbook传递给snow
- javascript - 使用 Angular javascript 的 json 日期格式
- jquery - 防止用户使用 Enter 提交表单,但在一个表单输入字段上启用 Enter 键
- php - 如何扩展基于 Codeigniter 2.1.3 构建的购买产品(Multiscraper)中的类
- xamarin - Xamarin 表单的 AWS cognito 登录问题,NotAuthorizedException:用户名或密码不正确
- python - 一行分配与多行分配有什么区别