当前位置: 首页 > 面试题库 >

在附加元素上触发CSS过渡

欧桐
2023-03-14
问题内容

正如这个问题所观察到的,新添加的元素上的CSS过渡立即被忽略了-过渡的结束状态立即被呈现。

例如,给定此CSS(此处省略前缀):

.box { 
  opacity: 0;
  transition: all 2s;
  background-color: red;
  height: 100px;
  width: 100px;
}

.box.in { opacity: 1; }

此元素的不透明度将立即设置为1:

// Does not animate
var $a = $('<div>')
    .addClass('box a')
    .appendTo('#wrapper');
$a.addClass('in');

我已经看到了触发过渡以获得预期行为的几种方法:

// Does animate
var $b = $('<div>')
    .addClass('box b')
    .appendTo('#wrapper');

setTimeout(function() {
    $('.b').addClass('in');
},0);

// Does animate
var $c = $('<div>')
    .addClass('box c')
    .appendTo('#wrapper');

$c[0]. offsetWidth = $c[0].offsetWidth
$c.addClass('in');

// Does animate
var $d = $('<div>')
    .addClass('box d')
    .appendTo('#wrapper');
$d.focus().addClass('in');

相同的方法适用于原始JS DOM操作-这不是jQuery特定的行为。

编辑-我正在使用Chrome 35。

  • 为什么忽略附加元素上的即时CSS动画?
  • 这些方法如何以及为什么起作用?
  • 还有其他方法吗
  • 哪个是首选解决方案?

问题答案:

不激活新添加的元素的动画的原因是浏览器的批量重排。

添加元素时,需要回流。添加类也是如此。但是,当您在 单个javascript循环中
同时进行这两个操作时,浏览器会抓住机会优化第一个。在这种情况下,只有一个(同时是初始和最终)样式值,因此不会发生过渡。

这个setTimeout技巧行得通,因为它延迟了类向另一轮javascript的添加,因此呈现给渲染引擎的值有两个,需要计算,因为有时间点,第一个值呈现给用户时。

批处理规则还有另一个例外。如果您尝试访问即时值,浏览器需要计算它。这些值之一是offsetWidth。当您访问它时,将触发重排。在实际显示期间,另外一个是单独完成的。同样,我们有两个不同的样式值,因此我们可以及时对它们进行插值。

实际上,这是极少数需要这种行为的情况之一。在大多数情况下,在DOM修改之间访问引起回流的属性可能会导致严重的速度下降。

首选的解决方案可能因人而异,但是对我来说,offsetWidth(或getComputedStyle())的访问是最好的。在某些情况下,当setTimeout被解雇时,它们之间不会重新计算样式。这种情况很少见,大多数情况是在加载的网站上发生的,但是这种情况确实发生了。这样一来,您将无法获得动画。通过访问任何计算出的样式,您将强制浏览器进行实际计算。



 类似资料:
  • 问题内容: 我正在创建一个DOM元素(一个div),将其添加到DOM,然后在javascript中快速点击即可更改其宽度。从理论上讲,这应该触发CSS3转换,但是结果是从A到B直接转换,而两者之间没有转换。 如果我通过单独的测试点击事件来更改宽度,则一切都会按预期进行。 这是我的JS和CSS: JS(jQuery): CSS(目前仅使用mozilla): 我是在这里搞砸了吗,还是“一键通”不应该做

  • 问题内容: 我在页面加载时触发了CSS 属性beeing 的问题。 问题是,当我将a 应用于元素时(例如:),然后在页面首次加载时,我的元素从黑色闪烁到它自己分配的颜色。 假设我有以下代码: CSS HTML 在页面加载,我会褪色从到。 我不想将颜色转换应用于伪类,因为那样不会将转换 应用于onMouseLeave 。 我真的很讨厌在网页上闪烁文本。到目前为止,除非我确实需要过渡,否则我一直在避免

  • 问题内容: 该主题很好地描述了我的问题,我假设它不会以这种方式起作用,是否有办法使其起作用?(解决方法)? 这是通过AJAX加载的代码: 这是我的点击事件: 问题答案: 做这个。 要么 编辑: 从jQuery 1.7开始,不推荐使用.live()方法。 使用.on()附加事件处理程序。较旧版本的jQuery的用户应使用.delegate()。

  • 我试图理解为什么在我试图显示从网站获取的项目时会出现错误。我也在使用谷歌chrome浏览器。 这是我代码的其他部分 每当我使用"chromeDriver.FindElement(By.ID(something.link.text))。单击();",它会给出一个错误。我不能显示我提取的数据。 在错误消息中,它显示“OpenQA.Selenium.StaleElementReferenceExcept

  • 我已经在我的网站上设置了GTM,我有一个在以下条件下触发的触发器 触发器的GTM条件 当我测试标签时,它不会启动。我检查了元素的值为 那么,当我使用regex或contains操作符时,为什么GTM不起作用呢。还有其他人面临过这个问题吗? 此页上几乎没有触发器(https://luminaryproperties.co.uk/venturing-into-your-first-off-plan/?

  • 问题内容: 我找不到在新创建的dom元素上使用css过渡的方法。 假设我有一个空的html文档。 我也有这个CSS 和这个js 但是,正如您在http://jsfiddle.net/gwxkW/1/上看到的那样,单击该元素会立即显示。 如果我尝试在a中设置类,我 通常会 找到结果,但是对我来说,这似乎更像是javascript和CSS引擎之间的竞赛。有没有要听的特定事件?我尝试使用,但无法正常工作