我将从代码和图片开始,这将使我更容易解释我想要实现的目标以及我所面临的问题。
body,
html {
width: 100%;
height: 100%;
margin: 0px;
padding: 0px;
}
.container {
box-sizing: border-box;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
padding: 10px;
border: 1px solid black;
}
.topPanel {
flex-grow: 1;
background-color: green;
}
.bottomPanel {
padding: 10px 0px;
position: relative;
background-color: black;
}
.bottomPanel .alert {
position: relative;
top: -35px;
background-color: grey;
text-align: center;
}
.bottomPanel .message {
color: white;
text-align: center;
}

<div class="container">
<div class="topPanel"></div>
<div class="bottomPanel">
<div class="alert">
alert
</div>
<div class="message">
message
</div>
</div>
</div>
&#13;
topPanel
占据容器的大部分高度,而bottomPanel
的高度可能不同。
alert
元素需要具有bottomPanel
的宽度并且正好在它之上(在代码/图像中,它们之间存在差距,但这只是为了显示它高于它,差距不应该存在)
alert
高度也可以变化,高度不应该是硬编码的,而是与bottomPanel
相关。
alert
在逻辑和语义两个方面都应该是bottomPanel
而不是topPanel
的孩子。
我面临的问题是,position: relative
topPanel
的高度包括alert
的高度,即使它溢出。
如果我添加overflow
,那么alert
就不可见了
如果我更改为position: absolute
,则alert
的宽度不会延长,而width: 100%
会使其宽度为container
,而不是父元素。
我有什么想法可以让它只用css吗?
我想也许在这里使用flex,但是想到也许有人会有更好的主意。
感谢。
答案 0 :(得分:1)
bottom:0
bottomPanel
padding:10px 0
提交给.alert
line-height
*,
*:before,
*:after {
box-sizing: border-box;
}
body,
html {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
line-height: 1;
}
.container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
padding: 10px;
border: 1px solid black;
}
.topPanel {
flex-grow: 1;
background-color: green;
}
.bottomPanel {
position: relative;
bottom: 0;
background-color: black;
}
.bottomPanel .alert {
background-color: rgba(255, 255, 255, .7);
text-align: center;
padding: 10px 0;
}
.bottomPanel .message {
color: white;
text-align: center;
padding: 10px 0;
}
&#13;
<div class="container">
<div class="topPanel"></div>
<div class="bottomPanel">
<div class="alert">
alert
</div>
<div class="message">
message
</div>
</div>
</div>
&#13;
答案 1 :(得分:1)
将.bottomPanel
设置为自己的flex容器,添加position:relative
。
然后.alert
可以是:
.bottomPanel .alert {
background-color: rgba(0, 0, 0, 0.5);
text-align: center;
position: absolute;
width: 100%;
bottom: 100%;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body,
html {
height: 100%;
}
.container {
height: 100%;
display: flex;
flex-direction: column;
padding: 10px;
}
.topPanel {
flex: 1;
background-color: green;
}
.bottomPanel {
display: flex;
flex-direction: column;
background-color: black;
position: relative;
}
.bottomPanel .alert {
background-color: rgba(0, 0, 0, 0.5);
text-align: center;
position: absolute;
width: 100%;
bottom: 100%;
color: white;
}
.bottomPanel .message {
color: white;
text-align: center;
}
<div class="container">
<div class="topPanel"></div>
<div class="bottomPanel">
<div class="alert">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima, voluptatum.
</div>
<div class="message">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis consequatur enim laboriosam excepturi ex nulla dolorum vitae, officia sapiente, laborum? Possimus eius odio, recusandae tempora, soluta harum minus consequatur quibusdam, blanditiis
in voluptatum sit laborum!
</div>
</div>
</div>