- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
void element.offsetWidth;
是一行奇怪的代码,它似乎什么也没做,但却是 CSS 动画工作所必需的。这条线有什么作用以及为什么需要它?
如果整行被注释掉,动画会发生一次但不会重复。 (如果删除 void
,它仍然有效。)
full code/demo住在这里;我尝试复制以下相关摘录:
script.js:
beatIndicator = document.getElementById("beatIndicator"),
...
// Happens every time a beat starts:
beatIndicator.classList.remove("anim");
void beatIndicator.offsetWidth; // Why is this line needed?
beatIndicator.classList.add("anim");
示例-advanced.html
<span style="display: none;" id="beatIndicator" class="pulse"></span>
<style>
.pulse {
width: 40px;
height: 40px;
border-radius: 50%;
background: #f44336;
z-index: 3;
left: -18px;
display: inline-block;
vertical-align: middle;
margin-left: 10px;
}
@keyframes pulse-anim {
from {
box-shadow: rgba(244, 67, 54, 1) 0px 0px 0px 0px;
}
to {
box-shadow: rgba(244, 67, 54, 0) 0px 0px 0px 14px;
}
}
.pulse.anim {
animation: pulse-anim;
}
</style>
最佳答案
当您对 dom 进行更改(例如 classList.remove('anim')
)时,可能会导致页面发生一系列更改。渲染这些更改的成本可能很高,而且由于您连续更改多个内容的情况很常见,因此浏览器会尝试批量处理累积的更改,并且仅在您正在执行的操作结束时执行计算。
因此,如果那条奇怪的线不存在,那么会发生以下情况:
这行额外的代码的作用是要求浏览器提供有关 dom 的信息。但为了知道 offsetWidth 是多少,浏览器必须放弃批量更改的计划并立即执行页面的回流。当前状态没有运行动画类,这是一个更改,因此动画会重置。稍后,当该函数完成时,它会再次执行计算,并发现您已经进行了另一项更改(相对于它为您提供 offsetWidth 时的情况),因此它也应用了该更改。
简而言之:您迫使浏览器做额外的工作,而在这种情况下,这恰好是可取的。在大多数情况下,强制浏览器做额外的工作是一件坏事。大多数时候您希望避免以这种方式查询 dom,因为它会降低性能。
使其发挥作用的另一种方法是立即删除该类,然后稍后添加该类,如下所示:
element.addEventListener("click", function(e){
element.classList.remove("anim");
setTimeout(() => element.classList.add("anim"), 0);
}, false);
关于javascript - void element.offsetWidth 的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60686489/
我在使用 Google map API 显示邮政编码时遇到问题。但是,它给出了一个错误: https://maps.gstatic.com/maps-api-v3/api/js/19/6/main.j
在 element.offsetWidth 中,FF 和 Chrome 之间有 1px 的差异。 我一直在阅读以试图理解这个问题。试图reset the CSS , 试图将元素从屏幕边界附近移开(我记
我有一个 JS 函数可以获取页面上 div 的宽度: function getWidth() { var container = document.getElementsByClassName(
好吧,我正在尝试创建一个水平站点,但是当我尝试获取导航的 offsetWidth 时,它返回的值远高于真实宽度。可以找到有问题的设计 here .该页面的 CSS 是 here和 JS here .
我在跨不同浏览器使用 offsetWidth 时遇到了问题。这种结果差异导致了一些奇怪的布局。我创建了一个非常小的示例来显示我所看到的内容。 jsbin HTML Cell 1
1、概念 它们都是Element的属性,表示元素的宽度: Element.clientWidth 内容+内边距-滚动条-----不包括边框和外边距 =
Element.scrollWidth 只读属性是衡量元素内容的宽度,包括因为溢出而在屏幕上不可见的内容。SO 中的帖子对 scrollWidth、offsetWidth、clientWidth 有详
这段代码是我写的。 当我添加滚动条时,我得到 403 作为 clientWidth,这似乎是真的:403px 用于内部内容 + 17px 用于滚动条。然后我得到 403 作为 offsetWidth,
我正在尝试找到适合我的场景的文本宽度。这是我的代码(简单示例) var text = "Country and some following text"; var textObj = documen
我在使用 jquery 时遇到了一个奇怪的问题。我们正在尝试在我们的 Web 应用程序中使用相当旧的 jQuery 1.5.1。它仅支持 IE,并且始终以怪异模式呈现(无 doctype 元素)。 除
我有一个带有表格的 AngularJS 应用程序,我想获得这个场景: 首先:我想使用 table 引导类创建一个流动的表; 第二:在 table head 中的一些 javascript 更改(重建
我有一个链接的 css 文件用于默认属性,第二个链接文件用于显示窗口更改时它会更改的消息。在 JS 脚本的末尾,我将一个元素的 offsetWidth 放在全局值 NavW 中。所以 JS 似乎返回了
在我的应用程序中,我想检查是否有文本溢出(省略号)。为此,我检查 e.offsetWidth JS function manageReportDescription(
我尝试使用 nativeElement.offsetWidth 获取元素宽度,但它比实际宽度小 2.5px。我想知道我错过了什么? 我试图检查 DOM 并试图找到 2.5px 的位置,但我无法在任何地
不知何故,我在 Firefox 和 Chrome 中得到了不同的 offsetWidth 结果。 我有一个简单的按钮 Dropdown 其中 offsetWidth 正好是 89 像素。 Chrome
我正在尝试根据 div 中包含的图像的宽度调整其大小,但没有任何 JS 方法可以一致地工作来获取图像的宽度。 label here img { width: auto
void element.offsetWidth; 是一行奇怪的代码,它似乎什么也没做,但却是 CSS 动画工作所必需的。这条线有什么作用以及为什么需要它? 如果整行被注释掉,动画会发生一次但不会重复
我需要根据一些标签的宽度和高度来计算 offsetwidth... 我知道如何计算特定标签的 offsetwidth 高度 = 563 像素,宽度 = 763 像素,我使用 有一些内容,p 标签左边
我用 Bootstrap 3.3 创建了一个 carousel 它可以在我的本地机器上运行,但是当我将整个东西上传到正在编译 bootstrap js 文件的服务器上时将其他文件放在一个文件中,我收到
Angular 新手,我正在尝试使用 ScrollTrigger 进行水平滚动。 它有效,但是当我提供或构建时,出现错误: 类型“元素”上不存在属性“偏移宽度”。 这是 gsap 的代码: gsap.
我是一名优秀的程序员,十分优秀!