在我的扩展 popup.html 中使用 0ms 的 setTimeout 和不使用 setTimeout 之间的区别
Difference between setTimeout with 0ms and not using setTimeout in my extension's popup.html
我的扩展 popup.html 页面上有一个切换按钮 true/false。该按钮有一个 0.4 的过渡动画。有时当打开弹出页面时,我可以看到按钮滑到它的最终位置,所以我将 CSS 中的默认过渡时间设置为零,并在 popup.html 加载后使用 JS 将其更改回 0.4。
我的初始化函数从 chrome 存储中读取值并将按钮设置在适当的位置。之后,它向我的复选框添加了一个新的 class,该复选框的过渡时间设置为 0.4 秒。如果我将 setTimeout 中的最后一步用 0 毫秒包装起来,它会起作用,但如果我不使用 setTimeout 并将 querySelector 留在同一个地方,那么样式应用得如此之快以至于我可以再次看到它在打开 popup.html 时发生。我的问题是为什么会这样?同样的事情不应该发生在 setTimeout 为零的情况下吗?
function init(){
chrome.storage.sync.get(['switchState'], function(result) {
var switchState = result.switchState;
document.querySelector("input[type='checkbox']").checked = switchState;
setTimeout(() => {
document.querySelector(".slider").classList.add("animated-slider");
}, 0);
});
}
init();
.slider:before {
position: absolute;
content: "";
height: 25px;
width: 25px;
left: 2.5px;
bottom: 2.5px;
background-color: white;
transition: 0s;
border-radius: 25px;
}
.animated-slider:before {
transition: 0.4s;
}
当您使用 setTimeot 时,您的函数不会立即执行。它进入异步调用队列,并在引擎不忙于同步代码时执行。所以这个延迟给你的 css 工作一些时间。
如果你想在这种情况下进行控制,你需要使用 transitionend event
我的扩展 popup.html 页面上有一个切换按钮 true/false。该按钮有一个 0.4 的过渡动画。有时当打开弹出页面时,我可以看到按钮滑到它的最终位置,所以我将 CSS 中的默认过渡时间设置为零,并在 popup.html 加载后使用 JS 将其更改回 0.4。
我的初始化函数从 chrome 存储中读取值并将按钮设置在适当的位置。之后,它向我的复选框添加了一个新的 class,该复选框的过渡时间设置为 0.4 秒。如果我将 setTimeout 中的最后一步用 0 毫秒包装起来,它会起作用,但如果我不使用 setTimeout 并将 querySelector 留在同一个地方,那么样式应用得如此之快以至于我可以再次看到它在打开 popup.html 时发生。我的问题是为什么会这样?同样的事情不应该发生在 setTimeout 为零的情况下吗?
function init(){
chrome.storage.sync.get(['switchState'], function(result) {
var switchState = result.switchState;
document.querySelector("input[type='checkbox']").checked = switchState;
setTimeout(() => {
document.querySelector(".slider").classList.add("animated-slider");
}, 0);
});
}
init();
.slider:before {
position: absolute;
content: "";
height: 25px;
width: 25px;
left: 2.5px;
bottom: 2.5px;
background-color: white;
transition: 0s;
border-radius: 25px;
}
.animated-slider:before {
transition: 0.4s;
}
当您使用 setTimeot 时,您的函数不会立即执行。它进入异步调用队列,并在引擎不忙于同步代码时执行。所以这个延迟给你的 css 工作一些时间。 如果你想在这种情况下进行控制,你需要使用 transitionend event