前几天我尝试通过添加左右填充来调整水平菜单项,使它们按文本加权,而不仅仅是将它们调整为相同的宽度。目标是填充容器的确切空间。(很脏)代码如下:
$(document).ready(function(){
var mmenuW = $('#navinner').width(); //space to fill
var mmCount = 0; //number of menu items
var mmLiW = 0; //current summa width of menu items
$('#navinner li a').each(function(){
mmLiW += $(this).outerWidth();
mmCount++;
});
alert(''); //THE NASTY ALERT, see below
var paddPlus = Math.floor((mmenuW-mmLiW)/(mmCount*2));
$('#navinner li a').css({'padding-left': paddPlus+'px', 'padding-right': paddPlus+'px'});
var nmmLiW = 0; // new summa width of items
$('#navinner li a').each(function(){
nmmLiW += $(this).outerWidth();
});
var mmGap = mmenuW-nmmLiW-1; //remaining gap because of Math.floor
alert((paddPlus)+'px');
alert((mmGap+paddPlus)+'px');
// adding the gap to the last elements right padding
$('#navinner li a').last().css('padding-right', (mmGap+paddPlus)+'px');
}
奇怪的行为是当第一个警报被注释掉时,脚本工作正常,但是对于警报存在的情况有一些像素不准确。
第一个警报脚本完美运行,警报值:'','46px','58px'
如果没有第一个警报,脚本会留下空白,警报值:'','46px','54px'
浏览器:FF 6.0,JQuery:1.7.1,还没有在线示例。
/////// 编辑 ////////
我发现这是因为计算发生在 $(document).ready 但显然并不意味着所有 css 内容都已加载,包括特殊字体(在这种情况下使用 google webfont)。该函数使用我认为的一些后备字体运行,导致差异。所以问题减少到如何在不使用 $(window).load 的情况下更好地处理字体加载。在格式化菜单之前等待所有图像加载并不那么优雅。