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

暂时禁用CSS过渡效果的最干净方法是什么?

松德曜
2023-03-14
问题内容

我有一个DOM元素,应用了以下一些/全部效果:

#elem {
  -webkit-transition: height 0.4s ease;
  -moz-transition: height 0.4s ease;
  -o-transition: height 0.4s ease;
  transition: height 0.4s ease;
}

我正在编写一个调整此元素大小的jQuery插件,我需要暂时禁用这些效果,以便可以平滑地调整其大小。

临时禁用这些效果(然后重新启用它们)的最优雅的方法是什么,因为它们可能是由父母应用的,也可能根本没有应用。


问题答案:

简短答案

使用此CSS:

.notransition {
  -webkit-transition: none !important;
  -moz-transition: none !important;
  -o-transition: none !important;
  transition: none !important;
}

加上这个JS(没有jQuery)…

someElement.classList.add('notransition'); // Disable transitions
doWhateverCssChangesYouWant(someElement);
someElement.offsetHeight; // Trigger a reflow, flushing the CSS changes
someElement.classList.remove('notransition'); // Re-enable transitions

或者这个带有jQuery的JS …

$someElement.addClass('notransition'); // Disable transitions
doWhateverCssChangesYouWant($someElement);
$someElement[0].offsetHeight; // Trigger a reflow, flushing the CSS changes
$someElement.removeClass('notransition'); // Re-enable transitions

…或使用您正在使用的任何其他库或框架的等效代码

说明

这实际上是一个相当微妙的问题。

首先,您可能想创建一个’notransition’类,您可以将其应用于元素以将其*-transitionCSS属性设置为none。例如:

.notransition {
  -webkit-transition: none !important;
  -moz-transition: none !important;
  -o-transition: none !important;
  transition: none !important;
}

(次要一边-注意缺少的-ms-transition。在那里,你不需要它的html" target="_blank">Internet Explorer的第一个版本,以支持过渡。 _在所有
为IE 10,其支持他们前缀的。)_

但这只是样式,很容易。当您尝试使用此类时,您会遇到陷阱。陷阱是,这样的代码无法像您天真的期望的那样工作:

// Don't do things this way! It doesn't work!
someElement.classList.add('notransition')
someElement.style.height = '50px' // just an example; could be any CSS change
someElement.classList.remove('notransition')

天真地,您可能会认为高度变化不会动态显示,因为它是在应用“ notransition”类时发生的。但是,实际上, 它将
动画化,至少在我尝试过的所有现代浏览器中。问题在于,浏览器正在缓存需要进行的样式更改,直到JavaScript完成执行为止,然后在一次重排中进行所有更改。结果,它将进行重排,其中是否启用过渡没有净变化,但是高度有净变化。因此,它可以动画显示高度变化。

您可能会认为解决此问题的合理而干净的方法是将对“ notransition”类的删除包装在1ms的超时时间内,如下所示:

// Don't do things this way! It STILL doesn't work!
someElement.classList.add('notransition')
someElement.style.height = '50px' // just an example; could be any CSS change
setTimeout(function () {someElement.classList.remove('notransition')}, 1);

但这也不可靠。我无法在WebKit浏览器中使以上代码中断,但是在Firefox(无论是慢速计算机还是快速计算机)上,您有时(似乎是随机的)都会得到与使用幼稚方法相同的行为。我想这是因为JavaScript的执行速度可能足够慢,以至于超时功能在浏览器闲置时等待执行,否则会考虑进行机会性重排,如果发生这种情况,
Firefox在重排之前执行排队的功能。

我发现该问题的唯一解决方案是在删除“ notransition”类之前, 强制 元素的重排,刷新对其所做的CSS更改。有多种方法可以执行此操作-
有关更多信息,请参见此处。与“标准”方法最接近的方法是读取offsetHeight元素的属性。

那么,一种实际可行的解决方案是

someElement.classList.add('notransition'); // Disable transitions
doWhateverCssChangesYouWant(someElement);
someElement.offsetHeight; // Trigger a reflow, flushing the CSS changes
someElement.classList.remove('notransition'); // Re-enable transitions


 类似资料:
  • 问题内容: 顾名思义,是否有适当的方法来设置一些初始CSS属性(或类),并告诉浏览器将其转换为另一个值? 这不会激活Chrome 29 / Firefox 23中元素的不透明度。这是因为(源): […]您会发现,如果同时应用两组属性,则立即应用一组属性,然后浏览器将尝试优化属性更改,而忽略您的初始属性并防止过渡。在幕后,浏览器在绘画之前先批处理属性更改,这通常会加快渲染速度,但有时可能会产生不利影

  • 主要内容:1. transition-property,2. transition-duration,3. transition-timing-function,4. transition-delay,5. transition通常当 CSS 的属性值更改后,浏览器会立即更新相应的样式,例如当鼠标悬停在元素上时,通过 :hover 选择器定义的样式会立即应用在元素上。在 CSS3 中加入了一项过渡功能,通过该功能您可以将元素从一种样式在指定时间内平滑的过渡到另一种样式,类似于简单的动画,但无需借

  • CSS3 过渡是元素从一种样式逐渐改变为另一种的效果。 尽管 CSS3 过渡效果是足够的过渡的一个元素,但是 text-transform 属性可以提高 CSS3 过渡效果的风格。 主要有四个属性的CSS3转换效果,已被描述如下: transition-property transition-duration transition-timing-function transition-delay

  • 问题内容: 我想在字典中的所有键上映射一个函数。我希望可以执行以下操作,但是过滤器无法直接应用于字典。实现这一目标的最干净的方法是什么? 在此示例中,我尝试将每个值加1。但这对于示例来说是偶然的-主要目的是弄清楚如何将map()应用于字典。 问题答案: 迅捷4+ 好消息!Swift 4包含一种方法,该方法使用相同的键但值不同来构造字典的副本。它还包含一个重载函数,该重载函数返回a 和,并使用初始值

  • 问题内容: 我需要使用$ resource 发送带有我的DELETE请求的请求正文 我可以看到的唯一方法是更改​​: https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js 从 至 有没有更好的方法来覆盖此?就像您更改内容类型标头时一样,您可以执行以下操作: 或类似的东西…我已经用谷歌搜索了一下,但也

  • 主要内容:使用案例过渡效果(Transition)插件提供了简单的过渡效果。 如果您想要单独引用该插件的功能,那么除了其他的 JS 文件,您还需要引用 transition.js。或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstrap.min.js。 Transition.js 是 transitionEnd 事件和 CSS 过渡效果模拟器的基本