【问题标题】:How to put a div always below a absolute position div that have dynamic content如何将 div 始终放在具有动态内容的绝对位置 div 下方
【发布时间】:2013-01-27 17:44:24
【问题描述】:

我有这些布局:

<div id='wrapper'>
    <div id="contentwrap">
         <div id='content'></div>
         <div id='lhs'></div>
         <div id='rhs'></div>
    </div>
    <div id='footer'></div>
</div>

和 CSS:

#content {
    margin: 0 300px auto 180px !important;
    position: absolute;
    top: 142px;
}    

#wrapper {
    margin: 0 auto;
}
#lhs {
    float: left;
    width: 170px;
}
#rhs {
    float: right;
    width: 300px;
    margin-left: -300px;
    margin-right: 10px;
}

#footer {
    clear: both;
    width: 100%;
}

只有一个要求:#content 必须是 [contentwrap] 中的第一个元素。

它的高度是动态的。

现在当它的高度增加时我遇到了问题:内容将与我的#footer 重叠。

如何确保“#footer”始终出现在“#content”下方并且没有发生重叠?

P/S:抱歉,图片太小了,imgur 做到了!

【问题讨论】:

  • 您是否有任何理由将 position:absolute 定义为您的内容 DIV?
  • 不是真的,只是为了 CSS 布局。因为我需要先渲染#content,所以我把我的 CSS 放在了这样的地方。是否没有绝对位置,仍然保留我的 HTML 并实现布局?其实我有左,右和内容(这是中心)
  • 您没有为页脚、右轴、左轴显示任何样式 - 您有任何定义吗?另外,您要实现的布局是什么?有时,多一点信息会有很长的路要走。
  • 我刚刚补充,P/S:有没有不涉及 Javascript 的解决方案?
  • 这样更好,但是你的页脚类是什么?

标签: jquery css layout css-position


【解决方案1】:

更新内容后自动推送页脚:

<style>
#content {
    margin: 0 300px auto 180px !important;
    position: absolute;
    top: 142px;
    background-color:red;
}    

#wrapper {
    margin: 0 auto;
}

#footer{
    position:absolute;
}
</style>

<div id='wrapper'>
    <div id="contentwrap">
         <div id='content'>
             Example Text<br>
             Two Lines
         </div>
         <div id='lhs'></div>
         <div id='rhs'></div>
    </div>
    <div id="footer">The is the Footer</div>
</div>
<script>
function updateFooter(){
footer=document.getElementById('footer');
content=document.getElementById('content');
contentBottom=content.offsetTop+content.offsetHeight;
footer.style.position='absolute';
footer.style.top=contentBottom + 'px'
}
window.setInterval(updateFooter,100)
</script>

【讨论】:

  • 不,谢谢,但我不能使用轮询。我已经考虑过了。没有 JS 有办法吗?
  • 你能改变 DOM,还是只改变 CSS?
  • 我可以更改 DOM,但 #content 必须是 中的第一个元素,以便它首先呈现,原因是谷歌机器人首先扫描它。而且我更喜欢不涉及 JS
  • 您可以将#content 更改为相对而不是绝对吗?
  • 是的,我可以,但是布局会不合适?
【解决方案2】:

好的,所以这使用了一种技术,其中所有 3 列都向左浮动,以便它们彼此相邻堆叠,并且使用负的左边距将左侧列拉回视图。

我没有对此进行广泛测试(仅 Firefox 18 / Windows7),因此它可能无法在所有浏览器/操作系统组合上运行:

#wrapper {
    margin: 0 auto;
    width: 100%;
}

#contentwrap {
    float: left;
    width: 100%;
}

#content {
    margin: 0 300px auto 170px !important;
}    

#lhs {
    float: left;
    width: 170px;
    margin-left: -100%;
}

#rhs {
    float: left;
    width: 300px;
    margin-left: -300px;
    margin-right: 0px;
}

#footer {
    clear: left;
    width: 100%;
}

【讨论】:

  • 我刚刚在 IE6 / IE7 中对此进行了测试,它工作正常 - 在 IE7 中它是如何损坏的?
【解决方案3】:

总有办法。但这并不意味着它是正确/安全的方式。这个例子只是一个演示,我鼓励你修改你的 html 并且使用这个技术。使用

<div id='lhs'></div>
<div id='content'></div>
<div id='rhs'></div>

还有float: left;

此示例使用 css3 中的 calc() 函数,因此它可能不适用于旧版浏览器。虽然这是有效的并且是响应式的(将根据页面宽度改变宽度),但您应该修改您的 html,因为我认为没有理由说明为什么“内容”必须排在第一位。

Fiddle

【讨论】:

  • 我必须把#content放在第一位,而不是#lhs。
  • #content 必须是第一个,对于 SEO。 Google bot 将扫描我们的内容以对我们的页面进行排名。这是“必须”的要求。
  • 你看到我附上的小提琴链接了吗?它首先有内容,然后是 lhs,然后是 rhs。这是我所知道的唯一可能的方法。注意:我已经给出了 div 的宽度百分比。您可以随意更改。
  • :( 我也需要支持IE7+, FF12+。感谢calc()。看来这个问题:必须先出现,真是头疼
【解决方案4】:

您可以在#content div 上使用样式max-height

或在页脚和内容之间放置一个空 div,如下所示:

<div id='wrapper'>
    <div id="contentwrap">
         <div id='content'></div>
         <div id='lhs'></div>
         <div id='rhs'></div>
    </div>
    <div style="clear:both;height:0px;overflow:hidden;"></div>
    <div id='footer'></div>
</div>

【讨论】:

  • 内容 DIV 有位置:绝对。所以,没有必要使用 clear:both。
  • 如果位置设置为绝对并且内容是动态的,那么我看不出有什么方法可以避免它与页脚重叠。必须将其设置为相对。但如果你能证明我错了那就太好了,因为我们都在这里学习。
猜你喜欢
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2014-01-08
相关资源
最近更新 更多