【发布时间】:2016-04-13 02:09:09
【问题描述】:
目的:
我正在编写与此类似的代码来创建 其中输入字段具有嵌入式按钮的组件:
http://codepen.io/anon/pen/pgwbWG?editors=110
如您所见,按钮绝对定位,top 和 bottom 设置为 0,以实现 100% 高度元素。
还要注意的是,text-input 的边框必须保持可见,并且还必须包裹 button。
为了实现这一点,我在 button 中添加了一个margin: 1px,以便(应该)有空间来显示周围的 text-input 红色边框(通常在输入字段时内容无效)。
问题:
是在 Firefox 上它(大部分)正确呈现,而在 Chrome 上(显然在最新的 Safari 上)它会在 按钮的底部有一个 1px 的间隙强>。
CSS 看起来不错,但它似乎是渲染中的计算/舍入问题,按钮的底部或顶部边距并不是真正的 1px(可以看到它检查元素)。 而且输入的填充似乎也有影响。
在不同的缩放率下,它会在按钮的顶部或底部添加或删除 1px 的边距,从而产生 1px 的间隙或覆盖的边框强>。
当我将 button 边距设置为 0px 时,底部边距是固定的,但我在顶部松开了 1px 边距,最终覆盖了 text-input 的红色边框.
例子:
可能我解释不清楚或过于冗长,所以这里是一些错误的截图,来自 Chrome 上的不同缩放(注意 CSS 总是相同的):
解决办法:
我找不到跨浏览器解决方案。 如何处理它并获得一致的组件? (请不要使用 Javascript)
【问题讨论】:
-
在包装上设置边框可以吗?
-
实际上不是,因为样式(边框和其他规则)取决于来自浏览器验证 API 并在包含的 input 上执行的 :valid 状态。只要没有 CSS4 父选择器 (
>),我就无法设置包装器的样式。我也有兴趣了解如何在其他情况下处理子像素。 -
防止子像素渲染问题的一种方法是确保所有与大小、边距和填充相关的 css 属性都是可被 2 整除的固定像素数量。这并不适用于所有场景,但当它适用时,它会有所帮助。
-
是的,但是固定数量的像素然后我们可以完全丢弃响应能力。缩放页面可能会破坏这些计算。
标签: css cross-browser rendering subpixel