html - CSS 全高,div 分配剩余空间
问题描述
我正在构建一个带有标题、描述和答案的消息框。我已经为此苦苦挣扎了好几天,甚至用 Codepen 玩过,但无法正确处理这个问题。
我需要:
- 标题在滚动前扩展至最大 300 像素
- 描述如果没有答案(或很少)扩展到最大左侧空间,分配空间说80%的空间,否则(我将添加一个按钮来隐藏这个空间)在滚动之前也
- 消息编号标题的固定高度
- 消息 div 扩展到最大剩余空间
- 如果有任何用户输入,输入区域保持在底部并能够放大(再次假设滚动前的 20%?)
<div class="demoContainer">
<div class="page">
<div class="title">
<h1>My awesome title that is so long i will move everything down</h1>
<button>Some stuff to click</button>
</div>
<div class="row">
<div class="colLeft">
<div class="description">
<h2>Author</h2>
<p>lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsumipsum lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsumipsum lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsumipsum lorem ipsum lorem ipsum lorem ipsumlorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum </p>
</div>
<div class="between">
<p>Answers</p>
</div>
<div class="messages">
<ul>
<li>
toto
</li>
<li>
tAta
</li>
<li>
tAta
tAta
</li>
<li>
tAta
</li>
<li>
tAta
</li>
<li>
tAta
</li>
>
<li>
tAta
</li>
>
<li>
tAta
</li>
>
<li>
tAta
</li>
>
<li>
tAta
</li>
</ul>
</div>
<div class="input">
<textarea placeholder="Input height adapt to size until a maximum"></textarea>
</div>
</div>
<div class="colRight">
<ul>
<li>
some
</li>
<li>
stuff
</li>
</ul>
</div>
</div>
</div>
<div class="divider"></div>
<div class="page">
<div class="title">
<h1>My awesome short title</h1>
<button>Some stuff to click</button>
</div>
<div class="row">
<div class="colLeft">
<div class="description">
<h2>Author</h2>
<p>lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum </p>
</div>
<div class="between">
<p>Answers</p>
</div>
<div class="messages">
<ul>
<li>
toto
</li>
<li>
tAta
</li>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
</ul>
</div>
<div class="input">
<textarea placeholder="Input height adapt to size until a maximum"></textarea>
</div>
</div>
<div class="colRight">
<ul>
<li>
some
</li>
<li>
stuff
</li>
</ul>
</div>
</div>
</div>
</div>
* {
box-sizing: border-box;
}
.demoContainer {
display: flex;
flex-direction: row;
}
.divider {
width: 8px;
}
.page {
height: 600px;
width: 550px;
background-color: lightgrey;
display: flex;
flex-direction: column;
overflow: auto;
}
.title {
display: inline-flex;
justify-content: space-between;
align-items: center;
max-height: 200px;
}
.title button {
width: 90px;
height: 30px;
}
.row {
display: flex;
/*flex: 1 1 100%;*/
min-height: 0;
height: 100%;
}
.colLeft {
flex: 3 1 auto;
min-height: 0;
height: 100%;
border: 1px solid blue;
display: block;
flex-direction: column;
position: relative;
/*align-items: stretch;
align-content: stretch;*/
}
.description {
border: 1px dashed black;
/*flex: 4 1 100%;*/
max-height: 60%;
overflow: scroll;
}
.between {
border: 1px solid green;
height: 1, 1em;
}
.between>p {
margin: 0;
}
.messages {
border: 1px dashed red;
/*flex: 2 100 auto;*/
overflow: scroll;
}
ul {
max-width: 100%;
}
.input {
width: 100%;
min-height: 1rem;
flex: 1 1 3rem;
display: flex;
border: 1px solid yellow;
position: relative;
bottom: 0;
}
.input>textarea {
width: 100%;
}
.colRight {
flex: 1 1 auto;
border: 1px solid black;
min-width: 150px;
overflow: scroll;
}
右边是我想要的一个简短示例,但删除<br/>
以查看问题。
我试过了display: grid
,isplay: block
display: flex
。我似乎找不到任何能满足我需求的东西。
我的问题是:这可能吗?仅使用 CSS?
解决方案
对于每个想知道的人,我在研究 css 时发现了一些东西。
首先,如果另一个元素在其中,您可以在 div 上设置 100% 的高度以占用可用空间,但当且仅当您设置父元素时display: flex;
!考虑到这一点,它就变得更容易了。
在那之后,我决定深入研究 JS,因为我的问题似乎不能仅用 CSS 解决。我利用了“新”position: sticky;
属性,我的 JS 可以根据滚动位置来处理它top: 0;
的bottom: 0;
位置。
CSS 添加:
.stickyBottom{
position: sticky;
bottom: 0;
}
.stickyTop{
position: sticky;
top: 0;
}
JS代码添加:
var colLeft = document.getElementsByClassName("messagesInput")[0];
colLeft.onscroll = function(){myFunction()};
// Get the navbar
var between = document.getElementsByClassName("between")[0];
var desc = document.getElementsByClassName("description")[0];
// Get the offset position of the navbar
var sticky = between.offsetTop;
//between.classList.remove("stickyBottom")
function myFunction() {
if (colLeft.scrollTop >= sticky) {
between.classList.remove("stickyBottom")
between.classList.add("stickyTop")
} else {
between.classList.add("stickyBottom")
between.classList.remove("stickyTop");
}
}
它最终以一种比我最初想要的更好的方式结束了用户体验!:) CodePen 链接相应更新。
推荐阅读
- python - ConnectN游戏检查横胜
- java - Jsoup:循环遍历表行
- android - 网络绑定不适用于 jni 代码吗?
- cassandra - 跟随 Cassandra 表需要分页
- video - 必须手动设置权限以启用 1-1 通话的摄像头和麦克风
- reactjs - React useHook 导致我的 API 后端进入无限循环
- python - 如何在为 PYTHON 安装 WSGI 时修复错误
- android - 无法将图像从 Android 中的 ImageView 保存到图库
- r - 将数据集导出/导入到 markdown 以使用 stargazer 运行
- python - 使用 IBM Watson 进行文本转语音的简单 Python 代码