Firefox 延迟调整 javascript/jquery
Firefox on resize delay with javascript/jquery
最近我很难使用 firefox(最新的 56.0.2),它似乎不能容忍子像素渲染(它似乎以自己的方式管理小数像素)。
例如,假设我有 7 个选项卡浮动在包含 div 的内容中,并且我为这些选项卡中的每一个应用了等于 "containerDiv/7" 像素的宽度,这将在Chrome、Safari、Opera(我测试过的那些)这些选项卡将水平排列,而在 Firefox 中,最后一个选项卡会在调整 window 大小时上下闪烁。调整大小结束后,它可能会排成一行或不排成一行,具体取决于它对像素值进行四舍五入的方式。
我做了一些研究,似乎所有浏览器在管理屏幕像素时都不会以相同的方式处理小数。
当然,这可以用 CSS 和百分比来处理,但是当您的某些元素有边框而其他元素没有时,这就变得困难了。
所以,我测试了一个小 jquery 脚本来解决这个问题:
function testWidth(){
var containingDivWidth= $('#containingDiv').width();
var numBorders = 6;
var numItems = 7;
var totalWidth = containingDivWidth - numBorders;
var itemWidth = (Math.round(totalWidth/numItems))
var remainder = totalWidth - (itemWidth*numItems);
$('.tab').css('width',itemWidth+'px');
$('.tab:nth-child(7)').css('width',itemWidth+remainder+'px');
};
$(document).ready(function() {testWidth();});
window.onresize = function(event) {testWidth();};
当然,这不是最优的,但很容易阅读。
这里是html,以防万一
<div id="containingDiv">
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
</div>
这里是CSS
<style>
#containingDiv{
width:100%;
height:40px;
background:red;
}
.tab{
float:left;
height:40px;
border-right:1px solid black;
background:green;
}
.tab:nth-child(7){
border-right:none;
}
</style>
所以,是的,现在它适用于所有浏览器,包括 Firefox。
...当 window 不调整大小时。
如果 window 调整大小,Firefox 将继续像以前一样运行,因为最后一个选项卡在调整大小时上下闪烁。
但有一点不同:在调整大小结束时,选项卡将排成一行。
我实时检查过,所有选项卡的总宽度始终等于容器的宽度 div,在任何时候,即使在调整大小时也是如此。
因此,似乎 Firefox 在调整大小时重新计算选项卡宽度需要几分之一秒。
这一假设得到以下事实的支持,即问题仅在水平向下调整 window 大小时出现,而不是向上调整。
这似乎表明,在缩小尺寸时,选项卡的总和在几分之一秒内大于包含 div,直到计算完成。
显然,在调整大小时,包含的 div 总是更大,所以不会出现问题。
所以这对我来说看起来像是一个 latency/delay 问题。
无论如何,我回到原点。
子像素渲染不起作用,重新计算时调整大小似乎意味着延迟,而这两者,仅适用于 Firefox(相对于 Chrome、Safari 和 Mac 上的 Opera,在这两种情况下都表现良好)。
我能做什么?
注意 1:我可以为此使用表格,但此示例只是一个示例,因为当我需要这种无法使用表格处理的计算时,会有多个实例。
这不是我第一次在各种情况下使用 Firefox 遇到这个问题。
这只是将问题置于清晰上下文中的示例。
因此,特别针对此示例提出表之类的变通方法无济于事。
注2:但是,如果有办法解决子像素渲染问题,我更愿意创建一个函数来防止获取带小数的像素,因为这看起来很耗时对其他浏览器来说微不足道(尽管 "on resize" 延迟问题困扰着我)。而且,像这样的功能,其中一个选项卡总是比其他选项卡更大或更窄,这作为解决方案并不优雅。
谢谢!
对于所有 CSS 没有 javascript 的解决方案,请尝试在您的容器上设置 display: flex
,并在容器的子容器上设置 flex: 1 1 auto
。这应该可以防止您在 Firefox 中看到的抖动发生。
设置 flex: 1 1 auto
让 flexbox 自动在 flex 行中的每个子项之间分配宽度。
要全面了解 flexbox,请查看 this guide。
#containingDiv{
width:100%;
height:40px;
background:red;
display: flex;
}
.tab{
flex: 1 1 auto;
height:40px;
border-right:1px solid black;
background:green;
}
.tab:nth-child(7){
border-right:none;
}
<div id="containingDiv">
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
</div>
最近我很难使用 firefox(最新的 56.0.2),它似乎不能容忍子像素渲染(它似乎以自己的方式管理小数像素)。
例如,假设我有 7 个选项卡浮动在包含 div 的内容中,并且我为这些选项卡中的每一个应用了等于 "containerDiv/7" 像素的宽度,这将在Chrome、Safari、Opera(我测试过的那些)这些选项卡将水平排列,而在 Firefox 中,最后一个选项卡会在调整 window 大小时上下闪烁。调整大小结束后,它可能会排成一行或不排成一行,具体取决于它对像素值进行四舍五入的方式。
我做了一些研究,似乎所有浏览器在管理屏幕像素时都不会以相同的方式处理小数。
当然,这可以用 CSS 和百分比来处理,但是当您的某些元素有边框而其他元素没有时,这就变得困难了。
所以,我测试了一个小 jquery 脚本来解决这个问题:
function testWidth(){
var containingDivWidth= $('#containingDiv').width();
var numBorders = 6;
var numItems = 7;
var totalWidth = containingDivWidth - numBorders;
var itemWidth = (Math.round(totalWidth/numItems))
var remainder = totalWidth - (itemWidth*numItems);
$('.tab').css('width',itemWidth+'px');
$('.tab:nth-child(7)').css('width',itemWidth+remainder+'px');
};
$(document).ready(function() {testWidth();});
window.onresize = function(event) {testWidth();};
当然,这不是最优的,但很容易阅读。
这里是html,以防万一
<div id="containingDiv">
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
</div>
这里是CSS
<style>
#containingDiv{
width:100%;
height:40px;
background:red;
}
.tab{
float:left;
height:40px;
border-right:1px solid black;
background:green;
}
.tab:nth-child(7){
border-right:none;
}
</style>
所以,是的,现在它适用于所有浏览器,包括 Firefox。 ...当 window 不调整大小时。
如果 window 调整大小,Firefox 将继续像以前一样运行,因为最后一个选项卡在调整大小时上下闪烁。
但有一点不同:在调整大小结束时,选项卡将排成一行。 我实时检查过,所有选项卡的总宽度始终等于容器的宽度 div,在任何时候,即使在调整大小时也是如此。
因此,似乎 Firefox 在调整大小时重新计算选项卡宽度需要几分之一秒。
这一假设得到以下事实的支持,即问题仅在水平向下调整 window 大小时出现,而不是向上调整。 这似乎表明,在缩小尺寸时,选项卡的总和在几分之一秒内大于包含 div,直到计算完成。 显然,在调整大小时,包含的 div 总是更大,所以不会出现问题。 所以这对我来说看起来像是一个 latency/delay 问题。
无论如何,我回到原点。 子像素渲染不起作用,重新计算时调整大小似乎意味着延迟,而这两者,仅适用于 Firefox(相对于 Chrome、Safari 和 Mac 上的 Opera,在这两种情况下都表现良好)。
我能做什么?
注意 1:我可以为此使用表格,但此示例只是一个示例,因为当我需要这种无法使用表格处理的计算时,会有多个实例。 这不是我第一次在各种情况下使用 Firefox 遇到这个问题。 这只是将问题置于清晰上下文中的示例。 因此,特别针对此示例提出表之类的变通方法无济于事。
注2:但是,如果有办法解决子像素渲染问题,我更愿意创建一个函数来防止获取带小数的像素,因为这看起来很耗时对其他浏览器来说微不足道(尽管 "on resize" 延迟问题困扰着我)。而且,像这样的功能,其中一个选项卡总是比其他选项卡更大或更窄,这作为解决方案并不优雅。
谢谢!
对于所有 CSS 没有 javascript 的解决方案,请尝试在您的容器上设置 display: flex
,并在容器的子容器上设置 flex: 1 1 auto
。这应该可以防止您在 Firefox 中看到的抖动发生。
设置 flex: 1 1 auto
让 flexbox 自动在 flex 行中的每个子项之间分配宽度。
要全面了解 flexbox,请查看 this guide。
#containingDiv{
width:100%;
height:40px;
background:red;
display: flex;
}
.tab{
flex: 1 1 auto;
height:40px;
border-right:1px solid black;
background:green;
}
.tab:nth-child(7){
border-right:none;
}
<div id="containingDiv">
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
<div class="tab"></div>
</div>