【问题标题】:CSS - 100% height / width issueCSS - 100% 高度/宽度问题
【发布时间】:2015-08-23 22:03:20
【问题描述】:

我需要你的帮助:

  1. html, body#content 的高度为 100% && #toolbar 的高度为 50px,他是静态的 => 我需要计算 #content 的高度来填充没有滚动条的内容
  2. #content > .a 的宽度必须为 300px,#content > .b 必须计算宽度以填充内容

jsfiddle.net

  1. https://jsfiddle.net/4uesapnt/2/
  2. https://jsfiddle.net/4uesapnt/2/embedded/result/

【问题讨论】:

  • 您应该为此使用 javascript。逻辑很简单:第一个问题 -> content.height = window.height - toolbar.height,第二个类似,(toolbar_width - total_A_buttons_width) / number_of_B_buttons = 单个按钮的宽度
  • 但是你为什么要把这个布局弄得这么“死板”呢?我不认为有任何通过 css 的解决方案。也许您可以尝试使用百分比来解决您的问题
  • 我在您提供的示例中没有看到那段代码,但我认为它是由不同的边距或填充或边框引起的(您必须采取一些像素考虑到),请尝试使用 outerHeight api.jquery.com/outerheight ,这对于您的情况更准确
  • 这是边界... :-D

标签: html css


【解决方案1】:

1) 为此,您可以使用 CSS3 calc() 函数 (docs) 和视口单元 (vh, vw) (docs)。

#content {
    height: calc(100vh-50px); /* substract #toolbar height from the entire page's height*/
}

2) 再次,您可以使用视口单位和calc() 函数:

#content > .a {
    width: 300px;
}

#content > .b {
    width: calc(100vw-300px); /* substract #content .a's width from the entire page's width */
}

在 JSFiddle 上:https://jsfiddle.net/hL7nxs6v/1/

请注意,如果您将窗口的宽度调整为小于300px + 一些合理的.b 宽度,如果没有分配任何合适的min-widths,布局可能会中断。

浏览器支持通过Can I Useviewport unitscalc function

【讨论】:

  • 它真的很管用...我可以在哪里了解这个新的 CSS 功能?
  • @MarekKobida 抱歉,我不小心删除了指向 Mozilla 开发人员网络文档的链接。我已经编辑了我的答案,请尝试带有文本“文档”的链接。 MDN 是阅读各种网络技术的绝佳资源。
  • 请注意CSS3 将是您的完美解决方案,前提是您不关心旧浏览器。
  • @hina10531 在 2015 年,世界上只有一小部分人在使用这些 浏览器。此外,拒绝支持像 IE8 这样的浏览器的开发人员和设计人员只会加速向现代浏览器的切换过程。对于那些老顽固的用户,您可以使用Browser-Update 之类的东西来告诉他们更新。或者他们可以只使用损坏的站点。他们的选择。正如我在帖子中所说,可以在Can I Use 上检查浏览器支持。
【解决方案2】:

这在 Chrome 中似乎对我有用。我之前从未使用过flex,所以我真的不知道支持是什么样的:

https://jsfiddle.net/eeesrkjr/

我给#content 提供了一个顶部填充来为标题留出空间,并且由于box-sizing:border-box; 它不会强制它超过100% 的高度。然后标题绝对位于该 50px 空间中。我简单地尝试将标题放入#content 中,以便不必绝对定位,但flex 正在做奇怪的事情。如果您对这些事物的交互方式有更好的了解,也许您可​​以尝试这条路线。

HTML:

<div id="toolbar" class="flex aic jcsb">
    <div class="a">A</div>

    <div class="b">B</div>

    <div class="c flex aic jcsb">
        <div class="b">C</div>
        <div class="c">D</div>
        <div class="d">E</div>
    </div>
</div>

<div id="content" class="flex">
    <div class="a">A</div>

    <div class="b">B</div>
</div>

样式:

* {
    box-sizing: border-box;
}

html, body {
    height: 100%;
}

body {
    background: #111;
    font-family: "Helvetica Neue";
    font-weight: 300;
}

#toolbar {
    background: linear-gradient(#333, #222);
    border-bottom: 1px solid #000;
    color: #bbb;
    height: 50px;
    padding: 0 25px;
    width:100%;
    position:absolute;
    top:0px;
}

#toolbar > .c > div {
    margin: 0 12.5px;
}

.flex {
    display: flex;
}

.flex.aic {
    align-items: center;
}

.flex.jcsb {
    justify-content: space-between;
}

.flex.fdc {
    flex-direction: column;
}

#content {
    color: #fff;
    height: 100%;
    padding-top:50px;
    box-sizing:border-box;
}

#content > .a {
    background: red;
    width: 300px;
    float:left;
}

#content > .b {
    background: blue;
    width:100%;
}

【讨论】:

  • min-width: 300px; 添加到#content &gt; .a,你就是金子了。
  • @PatrickAllen 为什么需要min-width 而不是width
  • 如果你检查#content div,你会发现它只有~250px。这是因为 flex-box 不考虑宽度。
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 2013-02-16
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
相关资源
最近更新 更多