- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试像这样获取 CSS left 属性的值... window.getComputedStyle(document.querySelector('.test'), ':after').getPropertyValue('left');
问题是这在 Chrome 中返回一个像素值,但在 FireFox 中返回一个百分比。有什么方法可以让它始终返回一个像素值吗?
JSFiddle:https://jsfiddle.net/r8mynvL4/2/
HTML:
<div class="test">This is a test.</div>
CSS:
.test {
border: 1px solid black;
position: relative;
}
.test:after {
content: '*';
bottom: -10%;
left: 95%;
position: absolute;
}
JS:
var leftValue = window.getComputedStyle(document.querySelector('.test'), ':after').getPropertyValue('left');
console.log(leftValue);
最佳答案
要直接回答这个问题,是的,请按照 e.generalov 最初在 bugzilla report 中描述的方法尝试此方法。 :
function getComputedStylePropertyValue(who, pseudo, propName) {
var dv = who.ownerDocument.defaultView,
cStyle = dv.getComputedStyle(who, pseudo),
tmpNode = null, propVal;
if (pseudo) {
var css = cStyle.cssText;
if (!css) { // it is an empty string. https://bugzilla.mozilla.org/show_bug.cgi?id=137687
var sty = [];
for (var key in cStyle) {
if (cStyle.hasOwnProperty(key)) {
sty.push(cStyle[key] + ':' + cStyle.getPropertyValue(cStyle[key]));
}
}
css = sty.join(';');
}
tmpNode = document.createElement('dummy');
tmpNode.style.cssText = css;
if (pseudo === '::before' && who.firstChild) {
who.insertBefore(tmpNode, who.firstChild);
} else { // ::before in case of empty element or ::after
who.appendChild(tmpNode);
}
cStyle = dv.getComputedStyle(tmpNode, null);
}
propVal = cStyle.getPropertyValue(propName);
if (tmpNode) {
tmpNode.parentNode.removeChild(tmpNode);
}
return propVal;
}
您可能会感到惊讶,Gecko (Firefox) 似乎 正确地实现了目前的规范。 (我说出现了,因为它的某些部分当然可能仍然存在错误)。快速摘要是 this part of the 'left' property definition :
Otherwise: if specified as a '<length>', the corresponding absolute length; if specified as a '<percentage>', the specified value; otherwise, auto.
计算值的定义 - 左属性。由于position:absolute声明,“否则”正在应用。
那么,为什么 Chrome 不这样做呢?看起来很清楚,对吧?好吧,如果您有兴趣了解该标准如何变得相对不一致,请继续阅读!
首先,较新的用户代理(如 Chrome)不需要过多考虑向后兼容性,并且基本上可以忽略 CSS 规范中较旧和较晦涩的部分。
对于 Gecko 和规范本身来说,这当然是另一回事。 CSS 无版本 - 例如,您的网站不会声明它使用的是哪个版本的 CSS。相反,CSS 模块有机地构建在彼此之上,并且必须向后兼容。
同时,Chrome 支持一致性。它偶尔会偏离规范的严格定义,原因是插入网络向前发展。典型的结果是更新规范以反射(reflect)任何结果良好的内容。
This fiddle显示非伪元素确实返回 px 值。简而言之,这归因于 CSS 模块相互引用的方式。从 W3C 的 Angular 来看,正是对这种引用方案的严格遵守使 Firefox 成为事实上的引用实现。
因此,例如 getComputedStyle 的定义明确引用 CSS 级别 2:
This method is used to get the computed style as it is defined in [CSS2].
如果我们继续看一下计算值的定义 defined in there然后我们看到它曾经以像素为单位定义:
percentages must be multiplied by a reference value (each property defines which value that is)
同时,::before 和::after 等伪元素明确引用了 CSS3;他们使用 left
的 CSS3 描述 now defines it differently .
请记住,此规范是工作草案 - 浏览器无需遵循它(但 Firefox 正在这样做)。另一方面,Chrome 正在插入一致性路线 - 即整个 API 总是只返回那些使用过的值。
关于JavaScript:getComputedStyle 浏览器之间的返回值不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42102687/
获取元素的样式时,我们总是使用 if(document.defaultView && document.defaultView.getComputedStyle) 检查浏览器是否支持该方法。 为什么不
我目前拥有的代码获得了整个 CSS,甚至是默认的。我想要的是只更改默认的 CSS。 function baba() { addEventListener("mouseover", function
我需要为元素获取一个计算 CSS 位置,但是当使用auto 而不是数字值时,我在不同浏览器中得到的结果不一致。 例如在下面的demo中设置bottom: auto;Chrome 和 Firefox 报
我正在尝试报告我创建的椭圆形 div 的边框半径值,但我得到了一个未定义的返回值。谁能解释为什么?我是犯了一个简单的错误还是我的代码有问题?谢谢你! CSS3
我在这里设置了一个演示: http://jsbin.com/evifeb/ 这更像是我在大声思考,而不是一个适当的问题,但是.. 为什么浏览器将样式规则与辅助方法和保留字一起直接插入到计算样式对象中?
这个问题在这里已经有了答案: text-decoration: apparent discrepancy between appearance and computed values (3 个答案)
我想创建一个具有 display: none 的模拟 div 用于测试目的。但是,在测试中设置显示然后调用 getComputedStyle 显示样式没有变化,即 const parent = doc
我有一段简单的代码: var recipes = document.getElementsByClassName("recipes"); var recipesStyle = window.getCo
我正在尝试像这样获取 CSS left 属性的值... window.getComputedStyle(document.querySelector('.test'), ':after').getPr
我只是问我做错了什么,因为我以前已经做过,我只是不记得是怎么做的,我一定是把旧代码弄丢了。 Firefox 有一个未记录的颜色值,称为 -moz-win-accentcolor,可用于获取 Windo
本质上,我试图使用 getComputedStyle 来获取属性值,而无需(直接)访问元素。请阅读下面的说明以了解更多详细信息。 这很难解释,如果你不明白,请告诉我。 这是我的 CSS 代码: .yS
getComputedStyle获取text-decoration属性继承失败,但可以获取font-size。 在 Firefox 25 和 GoogleChrome 30 中失败。 Note: In
在考虑向 Chromium 提交错误时寻找解决方法 - 如果元素有过渡,getComputedStyle 不会返回您期望它返回的内容,直到过渡结束。 长和短 - 如果我有一个高度为 24px 的元素,
@media screen{ a {color:green} } @media print{ a {color:red} } 有没有一种方法可以使用 JavaScript 在打印
我处于这样一种情况,我需要等到图像被加载后,一旦图像被加载,我需要得到它的计算高度,以便我可以相应地设置黄色选择器。 问题:基于图像的计算高度,我正在设置黄色选择器。它随机与 setTimeout()
我有以下代码用于更新名为 --changeColor 的 css 变量 const r = document.querySelector(':root'); const currentColor =
我只是想知道为什么,例如,window.getComputedStyle(element).top 总是以像素为单位返回测量值,即使在设置了 top 位置的情况下也是如此像这样明确地 % elemen
getComputedStyle 的 MDN 文档州 The values returned by getComputedStyle are known as resolved values. The
我在定义 left、right 和 bottom 的元素上调用 getComputedStyle。 在 Chrome 中,它返回 'auto' 作为 top 的值,但在 Firefox 中,它返回像素
我目前遇到一个“奇怪的问题”...我是 JavaScript 的初学者,我想获取图像的高度以便设置 a 的大小。 我得到屏幕的宽度 我根据屏幕尺寸设置图像的宽度=> 我猜电脑也设置了图像的高度。 我问
我是一名优秀的程序员,十分优秀!