有没有一种方法来检测浏览器是否有元素亚像素精度的?
IE9,不同于任何其他的主流浏览器,有它的元素亚像素精度的(一个元素宽度可以50.25px),正因为如此,我需要区别对待的事情。
一种方法是使用jQuery来检测浏览器名称和版本,但是这是在jQuery的废弃,不推荐,而不是建议的特征的存在应该不浏览器的名称和版本进行测试。
有没有一种方法来检测浏览器是否有元素亚像素精度的?
IE9,不同于任何其他的主流浏览器,有它的元素亚像素精度的(一个元素宽度可以50.25px),正因为如此,我需要区别对待的事情。
一种方法是使用jQuery来检测浏览器名称和版本,但是这是在jQuery的废弃,不推荐,而不是建议的特征的存在应该不浏览器的名称和版本进行测试。
我不知道你在哪里得到的想法,IE9是支持分数像素单位唯一的浏览器,但这种假设是完全不正确的。
从该规范的第4.3节 (强调):
的长度值的格式(用<长度>在本说明书中表示)是一个<编号>(具有或不具有小数点)紧接着一个单元标识符(例如, 像素 ,EM,等)。
并限定<编号>:
一些值类型可以具有整数值(表示为<整数>)或实数的值(由<编号>表示)。 实数和整数只在十进制形式指定。 一个<整数>由一个或多个数字“0”至“9”。 A <编号>可以是一个<整数>,或者它可以是零个或多个数字后跟一个句点(。),随后一个或多个数字。 “ - ”整数和实数可以由前面或“+”来表示符号。 -0是相当于0并且不是负数。
因此,按规格,所述px
长度单位必须支持小数。
为了证明这一点,看看这个小提琴在全屏和使用浏览器的缩放功能放大所有的方式:
在这个浏览器的截图,请注意5.5px蓝盒子确实比5px的红框高。
我觉得混乱可能来自非标准的事实干element.clientHeight
返回计算(取整)的整数值,并四舍五入发生浏览器而不同。
在我的小提琴,对clientHeight
蓝色的<div>
,IE9和100%缩放火狐15给6
。 Chrome浏览器22和Opera 12给予5
。 在所有的浏览器,那属性更改用户的价值改变浏览器的缩放级别。
换句话说,它是不可靠的。
如果你想要做一个元素的实际,辅币单位计算,使用getComputedStyle
。
var el = $('#b')[0]; // the actual DOM element
var height = parseFloat(getComputedStyle(el).height); // => 5.5
你可以创建一个奇怪的大小容器,并在它下降2个50%的宽度的元素,并找出他们是否已经拆分50:50与否。
见http://jsfiddle.net/alnitak/jzrQ6/
它返回false
在Chrome 22.0.1229.79在MacOS X 10.8.2,和true
在Firefox 15.0.1。 我没有MSIE来测试它。
http://jsfiddle.net/KAW3d/1/
我们不得不最近做了一些严重的像素完美的计算,我需要检查浏览器是否打算支持子像素布局。 我创建了使用中的测试Conditionizr或Modernizr的使用一些其他的答案作为指南:
conditionizr.add('subpixel-layout', function() {
var $testWrap = $(
'<div style="width: 4px; height: 2px; position: absolute; right: 0; bottom: 0;">' +
'<div id="subpixel-layout-1" style="width: 2.5px; height: 1px; float: left;"></div>' +
'<div id="subpixel-layout-2" style="width: 2.5px; height: 1px; float: left;"></div>' +
'</div>'
).appendTo('body');
var supported = $('#subpixel-layout-1').position().top !== $('#subpixel-layout-2').position().top;
$testWrap.remove();
return supported;
});
然后,你可以使用:
conditionizr.on('!subpixel-layout', function () {
// subpixel layout is NOT available
});
你应该能够做同样的事情在Modernizr的与Modernizr.addTest()
但我没有测试它。
很显然,我使用jQuery
在这里,但应该是没有它相当简单为好。