为什么浏览器会替换通过 css 分配的宽度值



>当我为所有选择分配基本样式时,例如。

width: 300px;
padding: 0;
margin: 0;
border-width: 1px;

在不同情况下通过javascript检索宽度时,我得到了意想不到的结果。

  • 选择可见时,with 为 298px
  • 选择显示:无时,宽度也是 298px (ff,jquery)
  • 选择位于div 中并显示:无时,宽度正确300像素

(结果也是相同的分配:框大小:边框框)

好吧,检索到的宽度

有时与使用的浏览器和javascript框架不同,但总而言之,我只想能够检索分配的宽度(300px)。(我想这与这里所说的"形式怪异"有关:http://meyerweb.com/eric/thoughts/2007/05/15/formal-weirdness/,但为什么浏览器不使用用户分配的宽度??

如何检索分配的宽度?真的有办法做到吗?

例子:

http://jsfiddle.net/ETCcH/5/(用于使用 jQuery,或者使用 mootools 的示例将 5 替换为 4)

(查看并使用不同的浏览器试用)

你永远不会得到在css文件中写下的值。使用 JavaScript,您只会获得 Web 浏览器当前应用于该元素的 css 属性。

在您的情况下,如果宽度确实是固定的,您可以在最大宽度设置为 300px 或添加overflow: hidden的情况下"强制"它 - 如果这是一个选项。

实际上,

是边界给你带来了麻烦。将边框宽度设置为 0,您将能够看到每个人的 300px。实际上,浏览器将元素的宽度设置为300px,并添加边框。对于可见元素,可以使用 offsetWidth 获取元素的整个宽度(如果将显示设置为 none,则将设置为 0)。

似乎

您的浏览器框大小默认是选定元素的边框框。尝试放置框大小:内容框;在选择和jQuery上给你正确的结果。

Jquery使用"width"方法获取内容宽度,因此它去除了边距,填充和边框。使用框大小:边框框,给定的宽度考虑了填充和边框。

厄诺里尔

没有简单的方法来访问 CSS 中的指定值。

当你在jQuery中使用.css()时,你会得到计算值。您所追求的称为指定值

计算指定的值时,它将根据情况进行调整(在您的小提琴中,边框)。这就是宽度不同的原因。不过,我不知道为什么隐藏在父div 中的选择不适应边框。

解决方案 1:也许比获取元素的指定值更好的方法是查找其父级的宽度?看到无论如何都不要在特定元素上设置宽度(而是在它们的父元素上设置宽度,例如在使用网格系统或类似元素时)是一种很好的做法,这可能是您的方法。在父项上使用宽度有效地限制了其子项的最大宽度。

解决方案 2:现在,如果您确实想要指定的值,我想您可以浏览document.styleSheets,对于每个样式表,访问 cssRules 属性并向下工作,直到找到所需的值。当我在Chrome中尝试此操作时,cssRules似乎是空的,但是Firefox填充了它,并乖乖地列出了附加到页面的每个样式表中的所有样式。

我不推荐它,但如果你决定掉进那个洞,你可能会对以下任何一个问题感兴趣:

  • 将计算出的 CSS 样式映射到指定的样式?
  • 使用 Javascript 列出已知的 CSS 类

我也不建议更改box-sizing因为这会给你你想要的值,但元素的实际宽度会更宽(基本宽度 300px + 边框 = 302px 宽)。

如果这些都没有让你的船漂浮起来,也许是时候坐下来思考(并解释!)你想做什么以及为什么。每当我发现自己想为简单的任务做非标准的事情时,这种情况并不罕见,因为我的解决方案可能不是最佳的,我需要在继续之前缩小一点。

最新更新