制作 HTML5 details 标签以获取最大可用高度

Make HTML5 details tag to take maximum available height

我有一个 HTML 页面 header/content/footer 使用 flexbox 模型并包含 <details> 标签。 我需要让详细信息内容使用最大可用高度,这意味着当处于打开状态时,其内容应占据其容器中的所有 space(当然摘要除外)。

这是我的 HTML/CSS 代码 (http://jsfiddle.net/rtojycvk/2/):

HTML:

<div class="wrapper">
    <div class="header">Header</div>
    <div class="main">
        Some text before details
        <details class="details" open>
            <summary>Details summary</summary>
            <div class="content">Details content</div>
        </details>
    </div>
    <div class="footer">Footer</div>
</div>

CSS:

html, body {
  height: 100%;
  margin: 0; padding: 0;
}

.wrapper {
    display: flex;
    flex-direction: column;
    width: 100%;
    min-height: 100%;
}

.header {
    height: 50px;
    background-color: yellow;
    flex: 0 0 auto;
}
.main {
    background-color: cyan;
    flex: 1;
    display: flex;
    flex-direction: column;
}
.footer {
    height: 50px;
    background-color: green;
    flex: 0 0 auto;
}
.content {
    background-color: blue;
    color: white;
    flex: 1;
}
.details {
    background-color: red;
    flex: 1;
    display: flex;
    flex-direction: column;
}

如您所见,详细信息标签本身占用了所有可用的 space,但不占用其内容。

P.S。我需要它只在 Chrome.

中工作

绝对定位的内容和相对的细节。 fiddle

html, body {
  height: 100%;
  margin: 0; padding: 0;
}

.wrapper {
  display: flex;
  flex-direction: column;
  width: 100%;
  min-height: 100%;
}

.header {
  height: 50px;
  background-color: yellow;
  flex: 0 0 auto;
}
.main {
  background-color: cyan;
  flex: 1;
  display: flex;
  flex-direction: column;
}
.footer {
  height: 50px;
  background-color: green;
  flex: 0 0 auto;
}
.content {
  background-color: blue;
  color: white;
  flex: 1;
  position: absolute;
  top: 3%;
  bottom: 0;
  height: 97%;
  width: 100%;
}
details {
  position: relative;
}
summary{
  height: 3%;
}
.details {
  background-color: red;
  flex: 1;
  display: flex;
  flex-direction: column;
}

http://jsfiddle.net/rtojycvk/16/

在内容上使用绝对位置,在细节上使用相对位置,并使用 calc() css(以抵消摘要高度)

.content {
    background-color: lightgray;
    color: black;
    flex: 1;
    display:flex;
    position:absolute;
    height:  calc(100% - 18px);
    width: 100%;
}
.details {
    background-color: gray;
    flex: 1;
    display: flex;
    flex-direction: column;
    position:relative;
}

希望这对您有所帮助! (我改变了颜色,因为它们对我来说有点亮 :p)

对于那些不喜欢设置绝对位置或不能设置绝对位置的人,还有另一种方法可以实现:使用 vh 作为 .content 的高度:

html,
body {
  margin: 0;
  padding: 0;
  height:100vh;
  background: orange;
}

.wrapper {
  display: flex;
  flex-direction: column;
  width: 100%;
  height:100vh;
  background: pink;
}

.header,
.footer {
  height: 10vh;
  min-height: 25px;  /* (or max-height, or both!)  */
  max-height: 50px;
  background-color: yellow;
  flex: 0 0 auto;
}

.footer {
  background-color: green;
}

.main {
  background-color: cyan;
  flex: 1;
  display: flex;
  flex-direction: column;
  height: calc(100vh - 20vh);   /*  10vh * 2 (.header + .footer sizes) */
}

.content {
  background-color: blue;
  color: white;
  flex: 1;
  display: flex;
  flex-direction: column;
  height: calc(100vh - 20vh);  /*  10vh * 2 (.header + .footer sizes) */
}

.details {
  background-color: red;
  flex: 1;
  display: flex;
  flex-direction: column;
}
<div class="wrapper">
    <header class="header">Header</header>
    <main class="main">
        Some text before details
        <details class="details" open>
            <summary>Details summary</summary>
            <div class="content">Details content</div>
        </details>
    </main>
    <footer class="footer">Footer</footer>
</div>

Fiddle 在这里:http://jsfiddle.net/ALXWebDev/wxm0v49c/

希望对您有所帮助!