【问题标题】:Height 100% on several levels多个级别的高度 100%
【发布时间】:2014-08-18 21:49:47
【问题描述】:

为了解释我在寻找什么,我制作了一个 jsfiddle 来说明它。这意味着我有一个解决方案,但这不是代码审查问题。我已经查看了自己的代码,发现我不喜欢它。因此,它仅用于说明目的,以显示我想要用更好的解决方案替换的内容。这个包含太多的嵌套 div 和一些 JS/jQuery;如果可能的话,我更喜欢纯 CSS 解决方案。

基本点是:

1) body/main wrapper 的高度应始终为100%,即使视口大小已更改(调整小提琴窗口的大小以查看会发生什么)

2) 边界在div#content内的两个div,即#nav#article,高度也应该是100%(与padding/margin /border-spacing)

3) 无论文字多么少,#nav 内灰色区域的高度都应始终为 100%(同样还有一些 margin/padding) /它包含的其他东西。如果内容不适合屏幕,则应出现垂直滚动条,并且背景颜色应向下延伸到可滚动区域内的内容,并具有与以前相同的边距/填充。

4) 右侧区域的绿色图像高度也应为100%,并且图像的大小应调整到容器的高度(最大为全尺寸的图像;之后它下面应该有空白空间,但#nav#article 的底部边框仍应在屏幕底部水平同步)。

有什么想法(最好不加载其他框架,如引导程序或使用 CSS flex 或其他支持不佳的技术)?

这是jsfiddle

代码是:

HTML

<div id="wrapper-block">
    <div id="wrapper">
        <div id="header">
           Banner and stuff
        </div>
        <div id="content">
        <div id="nav">
            <div id="inner-nav">
                <div id="v">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ullamcorper bibendum tortor, a euismod diam laoreet sed. Nunc massa augue, aliquam convallis erat id, rhoncus placerat lacus. Nullam tincidunt vulputate lacus, sit amet ullamcorper tellus egestas vel. Duis tincidunt faucibus erat et eleifend. In hac habitasse platea dictumst. In varius tincidunt augue ut ullamcorper. Quisque vestibulum sit amet orci in ullamcorper. Integer at erat et diam lacinia volutpat vitae sed purus. Ut rutrum erat nunc, a adipiscing purus bibendum ac.</div>
                </div>
            </div>
            <div id="article">
                <div id="inner-art">
                    <img id="pic" src="http://i58.tinypic.com/30ijbc3.jpg" />
                </div>
            </div>
        </div>
    </div>
</div>

CSS

* {
    -moz-box-sizing: border-box; 
    -webkit-box-sizing: border-box; 
    box-sizing: border-box;
    outline: 0;
}
html,body,caption,div,dd,dl,dt,fieldset,form,h1,h2,h3,h4,h5,h6,li,ol,ul,p,table,tr,th,td {
    margin: 0;
    padding: 0;
}
html, body {
    height: 100%;
}
body.js {
    overflow: hidden;
}
#wrapper-block {
    max-width: 842px;
    margin: 0 auto;
    width: 100%;
}
#wrapper {
    background-color: #FFFFFF;
    width: 100%;
    box-shadow: 0 0.0625em 0.375em 0.0625em #777777;
    padding: 0 0.5em 0.5em;
    display: table;
    border-collapse: separate;
    border-spacing: 1em;
    padding: 0;
}
#content {
    display: table-row;
    border-spacing: 0;
    width: 100%;
}
#nav {
    width: 36%;
    height: 100%;
    float: left;
    margin: 0;
}
#wrapper-block, #wrapper, #content {
    height: 100%;
}
.js #wrapper {
    visibility: hidden;
}
#nav {
    border: 1px solid #000000;
    overflow: auto;
    font-size: 0.8125em;
    margin-bottom: -1px;
}
#article {
    width: 62%;
    height: 100%;
    float: right;
    border: 1px solid #000000;
    background-color: #FFFFFF;
}
#inner-nav {
    border: 1em solid #FFFFFF;
    height: 100%;
    background-color: #E6E6DC;
}
#v {
    background-color: #E6E6DC;
    margin-bottom: 1em;
    padding: 0.75em;
}
#inner-art {
    padding: 0.75em;
    height: 100%;
}
#pic {
    max-height: 100%;
    max-width: 100%;
    display: block;
    margin: 0 auto;
}

JS/jQuery

var cont = $('#content').height(),
    wrap = $('#wrapper').height(),
    win = $(window).height(),
    head = $('#header').height(),
    twoems = (wrap - head - cont);

$('#nav, #article').height(win - twoems - head - 2);

$('#wrapper').css('visibility','visible');

$(window).resize(function() {
    var newWin = $(window).height();
        if($('#wrapper').height() > newWin) {
            $('#nav, #article').height(newWin - twoems - head);
        } else {
            $('#nav, #article').height($('#content').height()-2);
        }
});

【问题讨论】:

  • 根据您的 div:您可以使用 HTML5 新标签代替 div,例如 &lt;header&gt;,&lt;footer&gt;,&lt;aside&gt;, &lt;main&gt;, &lt;nav&gt; 等(例如,代替 &lt;div id="article"&gt; &lt;/div&gt; 使用 &lt;article&gt; &lt;/article&gt;。关于 JS/jQuery:我不知道不觉得 15 行脚本代码太多了 :) 希望对你有帮助。
  • 感谢您的回复。是的,我知道 HTML5 标签,但我选择使用 div,因为无论如何我都需要一些“不必要的”div 来使布局正常工作。至于脚本代码,我应该只说“JS/jQuery”,而不是“太多 JS/jQuery”,因为一行太多了。 :) 我更喜欢纯 CSS 解决方案。我已经编辑了我的问题以澄清这一点。但是,如果我只想依靠 JS 来完成设计,也许我可以跳过“display: table”的麻烦,尽管我可能需要更多的 JS?
  • @linurb 据我所知,如果#header 有明确的height,则只能通过纯CSS 来完成。
  • 你的意思是:jsbin.com/lopej/1/edit
  • 完整视图:jsbin.com/lopej/1 -- 它是 100% 高、粘性页脚(如果需要,还有页眉),内部列是 100%。如果高度足够高,则没有垂直滚动条,否则,当页脚命中时,它会显示滚动条。这是一种痛苦。

标签: javascript jquery html css height


【解决方案1】:

根据 OP 的 comment:

不需要支持 IE8-

因此,作为纯 CSS 解决方案,您可以使用 calc() 表达式来正确计算和指定元素的 height

你需要做的是:

  1. #header 上指定显式height
  2. 使用 CSS calc() 函数计算 #content 元素的 height

你最终会得到:

EXAMPLE HERE

#header {
    height: 2.5em;
}

#content {
    width: 100%;
    height: calc(100% - 2.5em);
}

您可能还想考虑使用 -webkit--moz- 前缀 to support 旧版本的基于 Webkit 的网络浏览器和 Mozilla Firefox。

值得注意的是calc()is supported in IE9+


PS:我已经改进了 HTML 结构和一些 CSS 声明以去除多余的东西。此处无需使用 CSS 表格。

【讨论】:

  • 太好了,谢谢!它似乎按应有的方式工作。我完全错过了 calc() 功能。非常好。 :)
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
相关资源
最近更新 更多