【发布时间】:2016-06-18 17:16:13
【问题描述】:
在玩 JavaScript 和 CSS 过渡时,我尝试删除一个 CSS 类 在使用 JavaScript 和 innerHTML 动态插入 div 之后。
我很惊讶与蓝色 div 的不透明度相关的 CSS 过渡没有按照我想要的方式触发(在 Safari 下工作,在 Chrome 下随机工作,在 Firefox 开发版下不工作)。有人能解释一下这种现象吗?
我不确定为什么它的工作方式与红色 div 不同。也许我不知道浏览器如何处理 innerHTML ?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Having fun with JS</title>
<style>
.std {
width:100px;
height:100px;
opacity: 1;
transition: opacity 5s;
}
.std--hidden {
opacity: 0;
}
.std--red {
background-color: red;
}
.std--blue {
background-color: blue;
}
</style>
</head>
<body>
<button>click here</button>
<div class='std std--red std--hidden'></div>
<div class='insert-here'>
</div>
<script>
// let a chance to the browser to trigger a rendering event before the class is toggled
// see http://stackoverflow.com/a/4575011
setTimeout(function() {
// everything works fine for the red div
document.querySelector('.std--red').classList.toggle('std--hidden');
}, 0);
document.querySelector('button').addEventListener('click', function(e) {
var template = `<div class='std std--blue std--hidden'></div>`;
document.querySelector('.insert-here').innerHTML = template;
setTimeout(function() {
// Why does the CSS transition seems to be triggered randomly ?
// well more exactly
// - it works under my Safari
// - it does not work under my FirefoxDeveloperEdition
// - it works randomly under my Google Chrome
document.querySelector('.std--blue').classList.toggle('std--hidden');
}, 0);
});
</script>
</body>
</html>
编辑
所以我刚刚阅读了CSS transitions specs 并找到了这个
对一组同时进行的样式更改的处理称为 样式更改事件。 (实现通常会改变风格 事件以对应于他们所需的屏幕刷新率,以及何时 脚本需要最新的计算样式或布局信息 依赖它的 API。)
这可能是某种解释吗? setTimeout 0 在某些浏览器上是否太快以至于他们没有时间计算样式差异,因此不会触发样式更改事件?事实上,如果使用更长的 setTimeout(例如,~16.6666,猜测 1/60 的刷新率......)它似乎在任何地方都有效。有人可以确认吗?
【问题讨论】:
-
使用
setTimeout有什么意义?它什么也没做。也许尝试删除它们,看看会发生什么? -
是的,它很有用,在浏览器首次渲染 DOM 之后,它会将删除 css 类的代码排入队列
-
尝试删除您在
var template中插入内部 HTML 元素的反引号。而是看到添加双引号“” -
oooh...那个反引号没有做任何事情...您可能应该使用双引号(
")作为外部和单引号(')作为class= -
反引号对应一个 ES6 模板字符串。
标签: javascript css listener css-transitions innerhtml