首页 > 代码库 > 关于在IE浏览器中,文档模式为"杂项"即Quirks,position为absolute且页面有滚动条时设置right的问题
关于在IE浏览器中,文档模式为"杂项"即Quirks,position为absolute且页面有滚动条时设置right的问题
由于系统的html页面没有指定相应的DTD,即<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">或<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">,而是直接写<html><head></head><body></body></html>,导致在IE中的文档模式为“杂项(Quirks)”。
文档模式为Quirks的时候,对页面的样式及布局还是有很大的影响的。
比如:
<div id="tabPanel" style="display:none">
<ul class="tableTab">
<li class="more right"><a href="javascript:showOrHideMoreTabs(‘tabPanel‘);"><p></p></a></li>
</ul>
</div>
<div id="tabMore">
<ul>
</ul>
</div>
tabMore是一个隐藏的块,当tabPanel块里面的li超过指定的宽度之后,会把超过的li放到这个块里面,然后通过点击class="more"的li来展示更多的内容。
tabMore的显示位置一般与<li class="more">右齐且在其下方。
如此showOrHideMoreTabs()方法里面应该有
$("#tabMore").css("top", moreT + "px");
$("#tabMore").css("right", moreR + "px");
这样设置之后,你会发现,当IE的文档模式为“Quirks”的时候,不会与<li class="more">右齐而是偏左(页面存在滚动条)。
经过一番探索,初步认定是滚动条的影响(文档模式为“杂项”时,从滚动条的左边开始计算),于是从网上摘抄了一个计算滚动条宽度的例子:
var _scrollBarWidth = null;
function getScrollBarWidth(){
if (_scrollBarWidth) {
return _scrollBarWidth;
}
var scrollBarHelper = document.createElement("div");
scrollBarHelper.style.cssText = "overflow:scroll;width:100px;height:100px;";
document.body.appendChild(scrollBarHelper);
if (scrollBarHelper) {
_scrollBarWidth = {
horizontal: scrollBarHelper.offsetHeight - scrollBarHelper.clientHeight,
vertical: scrollBarHelper.offsetWidth - scrollBarHelper.clientWidth
};
}
document.body.removeChild(scrollBarHelper);
return _scrollBarWidth;
}
所以在showOrHideMoreTabs()方法里面设置top和right,修改为:
$("#tabMore").css("top", moreT + "px");
if($.browser.msie && !$.boxModel){
moreR -= getScrollBarWidth().horizontal;
$("#tabMore").css("right", moreR + "px");
}else{
$("#tabMore").css("right", moreR + "px");
}
这样tabMore的位置设置就可以正常显示了。
关于在IE浏览器中,文档模式为"杂项"即Quirks,position为absolute且页面有滚动条时设置right的问题