当左边没有时,在右边绝对定位div导致滚动条

时间:2010-02-17 21:34:26

标签: html css css-position

我正试图“侧翼”一个居中的div,其中一些设计元素绝对位于主div的宽度之外。由于右边的元素,我得到一个滚动条,但左边没有元素(IE6 / 7/8,Chrome,Firefox)。如何摆脱水平滚动条?

<html>
<head>
<style type="text/css">
    html, body { 
        height: 100%; 
        width: 100%;
        margin: 0;
    }

    body { text-align: center; }

    .wrapper {
        margin: 0 auto;
        position: relative;
        width: 960px;
        z-index: 0;
    }

    .main {
        background: #900;
        height: 700px;
    }

    .right, .left {
        position: absolute;
        height: 100px;
        width: 100px;
    }

    .right { 
        background: #090;
        top: 0px;
        left: 960px;
        z-index: 1;
    }

    .left {
        background: #009;
        top: 0px;
        left: -100px;
        z-index: 1;
    }           
</style>
</head>
<body>
    <div class="wrapper">
        <div class="main"></div>
        <div class="left"></div>
        <div class="right"></div>
    </div>
</body>
</html>

11 个答案:

答案 0 :(得分:15)

这适用于IE6-9,FF3.6,Safari 5和Chrome 5.似乎并不重要我扔了什么doctype(无,xhtml 1过渡,html5)。希望这有帮助,这是一个有趣的问题。

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html,
body { 
    margin: 0;
    padding: 0;
    text-align: center;
}

body {
    overflow: auto;
}
#container {
    min-width: 960px;
    zoom: 1; /*For ie6*/
    position: relative; /*For ie6/7*/
    overflow: hidden;
    margin: 0 auto;
}

#main {
    background: #cea;
    width: 960px;
    margin: 0 auto;
    height: 700px;
    position: relative;
    top: 0;
}

#right,
#left {
    position: absolute;
    height: 100px;
    width: 100px;
    top: 0;
    z-index: 100;
}

#right { 
    background: #797;
    right: -100px;
}

#left {
    background: #590;
    left: -100px;
}      
</style>
</head>
<body>
    <div id="container">
        <div id="main">
            <div id="left">left</div>
            <div id="right">right</div>
        </div>
    </div>
</body>
</html>

答案 1 :(得分:4)

抛出body-x:隐藏在body标签上的任何东西都不适用于IE6 / 7 ......但是对于这两个浏览器,你还需要在html标签中添加overflow-x:hidden。 / p>

因此,请使用您现在所做的调整:

html, body { 
        height: 100%; 
        width: 100%;
        margin: 0;
        *overflow-x: hidden;
    }

body { text-align: center; overflow-x: hidden; }

请注意,在html,body声明中使用“*”hack的原因是因为IE8是非常规的。如果你不使用它,IE8也会失去垂直滚动条,而不仅仅是水平滚动条。我不知道为什么。但是那个解决方案应该没问题。

答案 2 :(得分:1)

我遇到了类似的问题并完全撕裂了我的头发,因为我发现上面的解决方案对我来说并不适用。我通过在主容器div之外创建一个div并使用min-width和max-width来解决这个问题。

#boxescontainer {
    position: relative;
    max-width: 1100px;
    min-width: 980px;
}   

    #boxes {    
        max-width: 1100px;
        min-width: 900px;
        height: 142px;
        background:url(../grfx/square.png) no-repeat;
        background-position: center;
        z-index: 100;
    }

然而我发现我还需要将square.png图像设为div的大小,所以我将其设为1100px的透明png。这是我解决问题的方法,希望它可以帮助其他人。

另一方面,我在左侧也有一个图像,我使用的绝对定位与右侧没有相同的滚动条问题。显然,右侧和左侧确实采取了与我对此事所做的研究不同的属性。

对于使用overflow-x:hidden的人,我不得不不同意这种方法,主要是因为你正在剥夺用户完全水平滚动的能力。如果您的网站设计为1024px分辨率,那么800px分辨率的用户如果取消水平滚动功能,将无法看到您网站的一半。

答案 3 :(得分:0)

你的身体不是亲戚。

答案 4 :(得分:0)

不知道你想做什么,我可能会在身体上设置一个背景图片。

答案 5 :(得分:0)

只有当视口比主要加上右侧框更薄时,才会获得滚动条,对吧? (不要认为某些人很清楚。)这是内容溢出的预期浏览器行为。

根据你想要发生的事情(为什么你希望它在这种情况下消失,如果你这样做?),你可以设置overflow:hidden on .wrapper。这总是会隐藏它 - 如果你想在其他事件上动态显示它,那就行了。

如果我没有弄错的话,你只是不希望它的视口只有960px宽。如果没有一些js / jQuery,你不能这样做。我的建议实际上是 - 特别是如果你不想搞乱javascript - 如果你想要这个内容可见,请接受窄宽度的滚动条。它可能会让你觉得自己是一名设计师,但大多数人都不会注意到它,那些做过的人仍然可以访问你的内容 - 这是一场胜利,对吗?

答案 6 :(得分:0)

我有一个在IE7 / IE6中不起作用的解决方案,但在其他地方似乎都很好。

围绕&lt; #bodyInner&gt;内的所有内容创建包装器(body)标签

应用此CSS规则:

#bodyInner {
    width:100%;
    overflow:hidden;
    min-width:960px;
    }

太糟糕了,您无法在&lt; body&gt;上应用此功能。元件。

答案 7 :(得分:0)

包裹div中的所有元素,使div位置相对并溢出隐藏。它每次都解决了这个问题。 :d

答案 8 :(得分:0)

如果页面语言是从左到右,则左侧非拟合元素不会导致滚动条。

试试这个:

<html dir="rtl">...</html>

这会将页面的文本方向更改为从右到左,现在左边的div将导致滚动条而不是右边的滚动条。

您可以使用方向:rtl css property。

如果您希望页面渲染与文本方向无关,那么您可以以不同方式排列页面元素以避免这种情况。

答案 9 :(得分:0)

老问题我知道,但可能会帮助其他人。以下内容扩展了James的反应,但适用于IE6 / 7/8/9,FF和Webkit。是的,它使用邪恶的表达式,但你可以把它放在IE6特定的样式表中。

#bodyInner {
       width: 100%;
       min-width: 960px;
       overflow: hidden;       
       width:expression(((document.compatMode && document.compatMode=='CSS1Compat') ? document.documentElement.clientWidth : document.body.clientWidth) > 980 ? "100%" : (((document.compatMode && document.compatMode=='CSS1Compat') ? document.documentElement.clientWidth : document.body.clientWidth) #LT# 980 ? "960px" : "97.5%"));
}

答案 10 :(得分:0)

我也需要这样的解决方案 - 感谢所有建议使用overlow-x隐藏的100%全包装的人。但是,我认为你不必添加额外的#bodyInner div - 我已经成功测试了它将宽度和溢出属性直接应用于Safari,Opera,Firefox,Chrome和IE8中的body。