浏览器将边框值截断为整数

2024-01-18

每当非整数像素值用于元素的边框时,浏览器都会将该值截断为整数。为什么会这样呢?

我知道边境不会actually占用像素的一部分,但这些类型的值有时与其他值结合使用以形成完整像素。例如,宽度为 1.6px 的左右边框应导致元素的总宽度增加 3px。这有效是因为完整值存储在内存中并用于计算 https://stackoverflow.com/questions/4308989/are-the-decimal-places-in-a-css-width-respected.

然而,即使宽度、填充和边距都表现正常,渲染边框时情况似乎并非如此。

var div = document.getElementsByTagName('div'),
    len = div.length,
    style;
for (var i = 0; i < len; i++) {
    style = getComputedStyle(div[i]);
    div[i].innerHTML = div[i].className + ': ' + style.getPropertyValue(div[i].className) + '<br>height: ' + style.getPropertyValue('height');
}
div {
    width: 300px;
    border: 1px solid black;
    padding: 50px 0;
    text-align: center;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
div.width {
    width: 300.6px;
}
div.padding-top {
    padding-top: 50.6px;
}
div.margin-top {
    margin-top: 0.6px;
}
div.border-top-width {
    border-top-width: 1.6px;
}
<div class="width"></div>
<div class="padding-top"></div>
<div class="margin-top"></div>
<div class="border-top-width"></div>

测试时,代码始终产生相同的结果(不考虑精确精度)。大多数主要浏览器(Chrome、Firefox、Opera)的行为都是相同的。 Safari 5.1(它呈现类似于边框的填充和边距,但这可能只是由于版本)和 Internet Explorer(它正确计算边框顶部宽度)是例外。

宽度、内边距和边距都被记住为十进制值,并允许内边距相应地影响高度,但边框则不然。它被截断为整数。为什么这只是案例宽度边框?有没有办法让边界值以更完整的形式被记住,以便true可以使用 JavaScript 检索元素的高度吗?


简单的解释是,浏览器在内部使用整数作为边框宽度(或者至少公开它们)。

一个例子是 Chrome (Chromium) 的源代码,它在文件 ComputedStyle.h 中将所有边框宽度定义为整数 ():

我们对此无能为力why:关于边框宽度的信息很少CSS 背景和边框的 W3C 规范 http://www.w3.org/TR/css3-background/#the-border-width。它仅说明line-width没有单位,关于如何处理该单位的类型或定义,除非它是绝对的(非负):

值:
[...]
计算值:绝对长度;如果边框样式为“无”或“隐藏”,则为“0”

And:

“薄”、“中”、“厚”对应的长度不是 指定的,但值在整个文档中是恒定的并且很薄 ≤ 中等 ≤ 厚。例如,UA 可以使厚度取决于 ‘medium’字体大小:当‘medium’时,一种选择可能是 1、3 和 5px 字体大小为 17px 或更小。不允许使用负值。

找到了同样的信息在盒子模型文档中 http://www.w3.org/TR/CSS2/box.html#value-def-border-width没有新的细节。

As all值最终成为像素值(因为我们的屏幕是像素设备)通过的数字em, vw, %当涉及到边框宽度时,等等似乎最终成为一个整数,而不考虑子像素化。

在使用整数作为边框宽度的浏览器中,甚至变换(缩放)似乎都不会影响这一点。

In the end, it seems to be up to the browser vendor how to treat these values (it could simply be aesthetic reasons for doing so, performance, .. we can only guess..).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器将边框值截断为整数 的相关文章

随机推荐

  • Spring MVC“重复”部分 URL

    我有一个简单的 Controller在一个spring mvc环境 这是控制器 Controller public class MessageController private static Logger LOG LoggerFactor
  • Quasar2 Vue3 Cypress 滑动切换状态与 Cypress 浏览器上显示的内容不匹配

    我的 vue 模板
  • 在 Angular 8 的新选项卡中打开 url 时如何使用状态传递数据

    在同一选项卡中打开网址时 我可以使用状态传递数据 我使用了以下代码片段 a click here a 但是 当我尝试使用 target blank 属性进行相同操作以在新选项卡中打开时 我无法从状态获取数据 a target blank c
  • ASP.NET MVC 3 最佳实践/设计

    我花了很多时间寻找使用 EF 4 1 或其他 ORM 设计 ASP NET MVC 3 网站的最佳实践 我找到了这个在 ASP NET MVC 应用程序中实现存储库和工作单元模式的教程 http www asp net mvc tutori
  • 如何清除绑定到 Google 地点自动完成的输入?

    这是我的问题 我正在使用 Google 地点自动完成功能从用户那里收集有关地点的信息 在事件 place changed 中 我保存此信息 不过 我想让用户可以添加多个位置 所以在保存这个地方后我想清除输入 但是 Google 自动完成功能
  • 修改foreach循环中的数组值[重复]

    这个问题在这里已经有答案了 我想知道是否可以编辑正在处理的当前对象foreach loop 我正在处理一系列对象 questions我想在我的数据库中浏览并查找与该问题对象相关的答案 因此 对于每个问题 获取答案对象并更新当前的 quest
  • 在显示表格单元格中使用边距[重复]

    这个问题在这里已经有答案了 我尝试在 li 中添加 margin left margin right 但它没有给它们之间留出空间 我应该添加什么来在列表之间留出一个空格 CSS btn top float right height 40px
  • Windows Azure 开发存储 Blob 服务未启动

    当我启动开发存储模拟器时 出现错误 The process cannot access the file because it is being used by another process 我猜这只发生在 BLOB 上 其他服务 即队列
  • 每次操作后的 MySQL SUM 和 MIN

    考虑以下表结构 Quantity BaseValue Id 0 3 1 1 0 8 1 2 0 5 1 3 0 2 1 4 假设这是一张表 名为Transactions 有什么方法可以对此表进行选择查询 它将对表中的值进行求和Quantit
  • Glibc 字符串操作函数的算法复杂度

    我意识到 Glibc 源代码经过了极其优化 并且是手工编码的汇编 是否有任何文档分析了常用字符串操作函数的算法复杂性 Big O 例如strmcp strncmp etc 可能没有这方面的文档 因为它很简单 其复杂度为 O n strcmp
  • 删除...创建与更改

    当涉及到创建存储过程 视图 函数等时 对对象执行 DROP CREATE 或 ALTER 哪个更好 我见过许多 标准 文档声称要执行 DROP CREATE 但我也见过许多提倡使用 ALTER 方法的评论和争论 ALTER 方法保留了安全性
  • 如何设置 HttpURLConnection 的内容类型?

    你知道如何设置吗Content Type on HttpURL连接 http developer android com reference java net HttpURLConnection html 以下代码适用于 Blackberr
  • 范围或地图返回什么?

    Go 有非常简洁的多返回值范例 但看起来像v ok map key and v k range m使用具有相同符号的不同机制 这是一个简单的例子 func f2 k v string return Hello World func main
  • Firebase - 应用程序分发无法获取应用程序信息:[403]调用者没有权限[重复]

    这个问题在这里已经有答案了 我正在使用 gradle 开发 Firebase App Distribution 我已经遵循了此中的所有步骤firebase 官方链接 https firebase google com docs app di
  • 修复 COM 引用:类型库导入程序无法转换成员 DISPPARAMS.rgvarg 的签名

    我有一个构建服务器 我在其中构建 Visual Studio 扩展 我最近迁移到另一台服务器 现在我收到以下警告 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common t
  • 在 Eclipse 中调试时如何跳过 JRE 代码?

    在 Eclipse 中调试时 我单步执行 F5 语句 如下所示 encryptedBytes LightWeightEncryptor encrypt messageBytes password toCharArray 调试器进入 JRE
  • 从逗号分隔的字符串中批量插入

    我有一个表 其中一列包含以下数据 abc 2 2 34 5 3 2 34 32 2 3 2 2 def 2 2 34 5 3 2 34 32 2 3 2 2 我想获取这些数据并将其插入到另一个表中 使用逗号作为分隔符 就像您可以指定FIEL
  • C# TCP 套接字错误 - 10060

    我有一个 Windows 服务作为服务器 我以 localhost 作为客户端运行一个 Windows 窗体应用程序 这两个程序都使用 TCP 套接字连接来发送 接收数据 服务器侦听端口 8030 程序运行正常 但是 当我增强客户端程序以在
  • 在画布上手动逐像素绘制一个圆圈[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在尝试做一些复杂的效果 为了做到这一点 我必须将其分解为各个组件 我可以在此基础上进行构建 并希望它们能够组合在一起 现在在画布上画一个
  • 浏览器将边框值截断为整数

    每当非整数像素值用于元素的边框时 浏览器都会将该值截断为整数 为什么会这样呢 我知道边境不会actually占用像素的一部分 但这些类型的值有时与其他值结合使用以形成完整像素 例如 宽度为 1 6px 的左右边框应导致元素的总宽度增加 3p