gpt4 book ai didi

html - 如何让 flexbox 不使用比容器更多的空间?

转载 作者:搜寻专家 更新时间:2023-10-31 23:17:53 25 4
gpt4 key购买 nike

我正在构建一个模式,并希望它在我的页面中居中并有机地增长,但仅在达到特定的宽度和高度之前。

我将这个模态 (.modal) 与 flexbox 居中,它工作正常。

在这个模态里我有另一个 flexbox(.modal-content),有一个主体(.modal-content__body)和一个页脚(.modal- content__footer) 元素。我希望主体一直增长,直到整个 .modal 达到我的 max-height,此时我希望 modal-content__body 开始滚动垂直。

HTML 层次结构是:

.modal-container // Full screen
.modal // Centred box with max-width and max-height
.modal-content // The content of the modal
.modal-content__body // Potentially growing content
.modal-content__footer

我无法让 .modal-content 不溢出。它只是忽略父项的 (.modal) 高度并增长以为内容提供空间。

如果我删除 .modal-content 的附加 div 并简单地将 .modal.modal- 合并content 它按预期工作,但因为我使用的是框架(Angular),所以我无法更改封装 HTML 元素的方式。

(注意:如果我在 .modal-content 上设置 max-height: -webkit-fill-available; 它有效,但是这个属性没有得到很好的支持所以我不能使用它)

这是演示问题的代码:

/* Centers the child */
.modal-container {
display: flex;
align-items: center;
justify-content: center;
}


/* The box in the middle, that should grow
organically, but be restricted as well */
.modal,
.modal-content--merged-with-modal {
width: 30rem;
max-width: calc(50vw - 3rem);
max-height: calc(100vh - 3rem);
/* Irrelevant styling */
background: rgba(255, 255, 255, 0.6);
border-radius: 3px;
line-height: 1.5rem;
}

.modal-content {
display: flex;
flex-direction: column;
min-height: 0;
}

.modal-content__body {
flex: 1;
min-height: 0;
overflow-y: scroll;
/* Irrelevant styling */
padding: 0.75rem;
background: rgba(0, 0, 255, 0.1);
}

.modal-content__footer {
/* Irrelevant styling */
border-top: 1px solid silver;
background: rgba(0, 255, 0, 0.1);
padding: 0.75rem;
}


/* Irrelevant styling to present the problem */

html {
font-family: arial, sans-serif;
font-size: 16px;
}

main {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
}

section {
flex: 1;
background: rgba(255, 0, 0, 0.1);
}
<main>

<section class="modal-container">
<div class="modal-content modal-content--merged-with-modal">
<div class="modal-content__body">
<code>BODY // </code> srollable<br>
<br> Container resizes as expected when<br> the container height is reduced.<br>
<br> In this case, the modal is the same<br> element, as the flexbox handling<br> the body and the footer.<br> .
<br> .
<br> .
<br> .
<br> .
<br> .
<br>
</div>
<div class="modal-content__footer">
<code>FOOTER // </code> Works
</div>
</div>
</section>

<section class="modal-container">
<div class="modal">

<div class="modal-content">
<div class="modal-content__body">
<code>BODY // </code>simply grows<br>
<br> Container overflows when<br> the container height is reduced.<br>
<br> In this case, the modal <strong>contains</strong><br> the flexbox, that handles the<br> body and the footer.<br> .
<br> .
<br> .
<br> .
<br> .
<br> .
<br>
</div>
<div class="modal-content__footer">
<code>FOOTER // </code> Doesn't work
</div>
</div>

</div>
</section>

</main>

最佳答案

一个简单的解决方法是使 .modal 成为具有列方向的 flex 容器。

/* Centers the child */
.modal-container {
display: flex;
align-items: center;
justify-content: center;
}

/* The box in the middle, that should grow
organically, but be restricted as well */
.modal, .modal-content--merged-with-modal {
width: 30rem;
max-width: calc(50vw - 3rem);
max-height: calc(100vh - 3rem);

/* Irrelevant styling */
background: rgba(255, 255, 255, 0.6);
border-radius: 3px;
line-height: 1.5rem;
}


.modal-content {
display: flex;
flex-direction: column;
min-height: 0;
}

.modal-content__body {
flex: 1;
min-height: 0;
overflow-y: scroll;

/* Irrelevant styling */
padding: 0.75rem;
background: rgba(0, 0, 255, 0.1);
}


.modal-content__footer {
/* Irrelevant styling */
border-top: 1px solid silver;
background: rgba(0, 255, 0, 0.1);
padding: 0.75rem;
}
.modal {
display:flex;
flex-direction:column;
}


/* Irrelevant styling to present the problem */
html {
font-family: arial, sans-serif;
font-size: 16px;
}
main {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;

display: flex;
}
section {
flex: 1;
background: rgba(255, 0, 0, 0.1);
}
<main>

<section class="modal-container">
<div class="modal-content modal-content--merged-with-modal">
<div class="modal-content__body">
<code>BODY // </code> srollable<br>
<br>
Container resizes as expected when<br>
the container height is reduced.<br>
<br>
In this case, the modal is the same<br>
element, as the flexbox handling<br>
the body and the footer.<br>
.<br>
.<br>
.<br>
.<br>
.<br>
.<br>
</div>
<div class="modal-content__footer">
<code>FOOTER // </code> Works
</div>
</div>
</section>

<section class="modal-container">
<div class="modal">

<div class="modal-content">
<div class="modal-content__body">
<code>BODY // </code>simply grows<br>
<br>
Container overflows when<br>
the container height is reduced.<br>
<br>
In this case, the modal <strong>contains</strong><br>
the flexbox, that handles the<br>
body and the footer.<br>
.<br>
.<br>
.<br>
.<br>
.<br>
.<br>
</div>
<div class="modal-content__footer">
<code>FOOTER // </code> Doesn't work
</div>
</div>

</div>
</section>

</main>

为什么?

最初 .modal 是一个设置了 max-height 的 block 元素,默认的溢出行为(当有溢出时)是可见的 并且您正面临溢出问题。

通过使 .modal 成为 flex 容器,您可以引入 shrink 效果,因为默认情况下 flex 元素将具有 flex-shrink:1 所以它的高度不会超过 flex 容器的高度(它会收缩以适应),你会得到需要的结果。

您可以将 flex-shrink:0 设置为 .modal-content 并且您会看到与没有 display 时相同的溢出问题:flex.

关于html - 如何让 flexbox 不使用比容器更多的空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50412725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com