JavaScript:使用 window.setTimeout 触发 CSS 转换

2023-12-11

这(显然)是一个更大项目的一部分,但我正在尝试触发 CS 转换setTimeout.

(我知道如何使用 CSS 动画,但这不仅仅是重复的过渡)。

当属性更改时,将发生 CSS 转换。为了我自己的目的,我使用setAttribute因为这将行为与其他与类相关的内容隔离开来,但下面的行为是相同的。

假设 HTML 和其他代码已就位,以下是简化版本:

var test=document.querySelector('div#test');    
window.setInterval(doit,4000);
function doit() {
    test.removeAttribute('thing');
    test.innerHTML=new Date();
    test.setAttribute('thing',null);
}

CSS 是:

div#test {
    opacity: 0;
}
div#test[thing] {
    transition: opacity 1s;
    opacity: 1;
}

我尝试的技巧是更改清除属性,然后再次设置它 - 这应该会触发 CSS 更改。它不能像上面那样工作。然而,如果我延迟设置属性 0 秒,它确实有效:

function doit() {
    test.removeAttribute('thing');
    window.setTimeout(function() {
        test.setAttribute('thing',null);
    },0);
    test.innerHTML=new Date();
}

问题是:为什么它不起作用,除非我添加这个微小的延迟,并且有更好的方法来做到这一点吗?

我想要一个答案without jQuery.

注意:我已经接受了下面的答案。以下代码将起作用:

function doit() {
    test.removeAttribute('thing');
    test.offsetHeight;                  //  force update
    test.innerHTML=new Date();
    test.setAttribute('thing',null);
}

Thanks


这是因为浏览器对回流和重新布局更改进行排队的方式。浏览器does not像构建代码一样按顺序执行这些操作。它将更改添加到队列中并尝试一次执行多个操作(出于性能原因)。

浏览器在这里试图变得“聪明” - 它看到样式将完全像以前一样结束,因此属性的删除和重新添加在一次更新中批量处理,因此您看不到任何变化。添加setTimeout,即使有 0 秒的延迟,也会强制浏览器在该点重排。

这是另一个类似问题的链接:强制浏览器在更改 CSS 时触发重排

这里有一个完整的方法/属性列表,您可以在 JS 中调用以强制在 JS 中进行回流(而不是使用setTimeout): https://gist.github.com/paulirish/5d52fb081b3570c81e3a

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript:使用 window.setTimeout 触发 CSS 转换 的相关文章

随机推荐

  • 使用 slf4j 读取 .properties 文件

    我想使用 slf4j 从 properties 文件中读取数据 我能够在控制台上输出数据 但我想要的是在某个文件上输出数据 所以我需要在 properties 文件中声明的文件 Appender 并且我我无法使用 slf4j 读取 prop
  • 证书如何避免中间人攻击?

    我还有一个关于网络安全的问题 如果我理解正确的话 证书是为了识别你的真实身份 所以中间人的攻击是不可能的 但当我看到这张图片时 http upload wikimedia org wikipedia commons thumb 2 2b D
  • 获取等于 php 十六进制字符串的 C# 字节数组

    所以我现在不允许修改这段php代码 主要是因为它很旧并且工作正常 Warning 总体来说代码非常糟糕 IV 没有被随机化 也没有与输出一起存储 我问这个不是因为我想 我问是因为我需要 当我开始工作时 我还计划进行重构 并使用真正可靠的加密
  • 具有 AUTO_INCRMENT 主 ID 的 MySQL 表在回滚后不会释放该数字

    我有一张桌子 上面有账单 每张账单都有一个 ID 该 ID 在我插入新记录后来自数据库 该字段是一个设置了 AUTO INCRMENT 的 INTEGER 如果我插入一条新记录作为事务的一部分并且必须回滚该事务 则 ID 将被占用并消失 因
  • 中带有 List 的动态列

    我正在尝试生成一个dataTable动态地使用列 所以我有一个List
  • Xamarin Forms 滑动按钮

    我希望在我的应用程序中添加一个滑动功能 该功能与 旧 iPhone 上的解锁机制几乎相同 参见图片 我正在努力解决如何在跨平台解决方案上实现这一点 我的直接想法是使用滑块和自定义渲染器 但不确定如果用户在完成幻灯片之前放手 如何创建捕捉以启
  • 在 AVPlayer 框架中播放 3gp 视频的已知问题?

    AVPlayer 无法在设备上播放 3gp 文件是否存在任何已知问题 mp4 文件可以正常播放 但无法从设备上的 URL 播放 3gp 文件 Thanks 如果重要的话 我使用的是 iOS 9 Swift 3 AVPlayer 或 AVPl
  • 使用手动 where 语句具有多个更新条件的 Codeigniter 模型

    我在模型中有返回数据的代码 this gt db gt select title content date where name Joe AND status boss this gt db gt where where query thi
  • SQL Server - 如何选择每个用户的最新记录?

    我正在尝试执行一个 SQL 命令 该命令应该绘制进入数据库的最后一行 基本上 当用户提交最后一个帖子 就像在这个论坛中 时 它会将用户重定向到一个页面 其中包含他的帖子标题 帖子段落以及用户名和帖子提交时间等数据 我开始研究声明 SELEC
  • PHP使用相同的变量后通过引用传递错误

    看一下这段代码 帮助我理解结果 x array hello beautiful world y array bye bye world harsh foreach x as n gt v v DONT CHANGE foreach y as
  • MS SQL Server:以小时和分钟的精度计算年龄

    我需要一个 SQL 函数来计算年龄 它必须准确并涵盖所有极端情况 由于是婴儿病房 所以30分钟是很常见的情况 我查看了其他答案 但找不到处理所有情况的答案 例如 宝宝出生于2014 04 29 12 59 00 000 现在是 2014 0
  • shell 脚本查找每个文件的文件名和行数,现在将此记录插入到 Oracle 表中

    我必须找到文件夹中可用的文件名以及每个文件行数 然后 我将获得两列数据 现在我必须将此记录插入到具有两列 col1 col2 的oracle表中 我可以写一个 shell 脚本来完成这两个任务吗 我发现自己正在写第一部分 IE wc l e
  • 我可以在 Django 中使用 XSLT 吗?

    我们使用 Django 来编写我们的新项目 我们的设计师想要使用 XSLT 编写模板 如您所知 Django 有自己的模板系统 并且我没有任何理由说明为什么设计者不能使用 XSLT 2个问题 我可以在视图中返回 XML 吗 这样做有理由吗
  • 如何正确设置d3.brush范围?

    我正在根据 Mike Bostocks 示例编写 d3 小部件http bl ocks org mbostock 1667367因此 我尝试使用预定义日期设置画笔范围 但范围矩形不适用于这些日期 var brush d3 svg brush
  • 带刻度标签的 Python PyQt4 滑块

    我是 PyQt4 的新手 我正在使用 QSlider 制作 gui 默认情况下 滑块不会显示刻度值 我搜索过 但没有找到简单的方法来做到这一点 那么是否可以或者我必须手动进行 我已经制定了一个解决方案 用于在垂直或水平方向向滑块添加标签 结
  • 如何生成临时 Zip 文件,然后在下载后自动将其删除?

    我有一个下载页面 其中有 3 个下载选项 Word Zip 和 PDF 有一个文件夹包含 doc文件 当用户单击页面上的 Zip 选项时 我希望 ASP NET 使用以下内容压缩文件夹 doc文件到临时 zip文件 然后客户端会从服务器下载
  • 在 g:remoteLink 中传递参数作为 javascript 函数的结果

    在 gsp 文件中我有 javaScript 函数 在 g remoteLink 中我喜欢使用该函数传递参数 像下面这样的东西
  • apache httpclient 4 的 UNICODE URI 编码

    我正在使用 apache http client 4 进行所有 Web 访问 这意味着我需要执行的每个查询都必须通过 URI 语法检查 我尝试访问的网站之一使用 UNICODE 作为 url GET params 编码 即 参数 srh t
  • 使用 INNER JOIN 时出现歧义错误

    我试图从 depts 表中选择 deptno dname 并将其与 emp 表连接以选择 empno 和 ename 然后我想按部门名称对它们进行分组 并按部门升序排序 当加入这两个表时 我一直觉得 deptno 不明确 但这是连接表的共性
  • JavaScript:使用 window.setTimeout 触发 CSS 转换

    这 显然 是一个更大项目的一部分 但我正在尝试触发 CS 转换setTimeout 我知道如何使用 CSS 动画 但这不仅仅是重复的过渡 当属性更改时 将发生 CSS 转换 为了我自己的目的 我使用setAttribute因为这将行为与其他