网上很多关于圣杯和双飞翼布局的教程, 我看了下实现都是需要中间的三个元素 float
布局而且需要清除浮动. 但是真的需要三个元素都 float
吗? 不清除浮动可以吗?
HTML
<header>headerheader>
<main>
<aside id="left">leftaside>
<aside id="right">rightaside>
<div id="main">maindiv>
main>
<footer>footerfooter>
HTML
的结构很清楚, 上中下分别是 header
, main
和 footer
, 和常见圣杯布局的不同是, main
中间区域和两边区域的位置.
从下图中可以看出来的是, 中间的 div
从 main
的第一个元素变成了最后一个元素. 这样写的目的是什么? 因为我们想要 div
显示在中间, 如果 div
前面的元素为 float
, 那么后面的 div
自然就会正常显示, 即水平填满父容器宽度且上边界和父元素的上边界重合.
但是这样问题又来了, 因为中间的 div
被两侧的遮挡住了, 别急, 马上用请 CSS
帮忙.
CSS
首先重置 元素的默认
padding
和 margin
为 0
, 并设置其高度为 100vh
, 即浏览器视口 viewport
的高度.
body {
margin: 0;
padding: 0;
min-height: 100vh;
}
接着, 设置 header
和 footer
的高度, 都固定为 70px
.
header {
height: 70px;
}
footer {
height: 70px;
}
其次, 设置中间整个元素 的高度为父元素高度减去
header
和 footer
高度. 好了, 不需要清除浮动的原因出现了, 因为父元素的高度不是由子元素撑起的, 而是手动设置的.
main {
height: calc(100vh - 140px);
}
接下来, 设置两个 元素分别向左和右
float
, 宽度都是 100px
, 高度和父容器相同.
#left {
float: left;
width: 100px;
height: 100%;
}
#right {
float: right;
width: 100px;
height: 100%;
}
最后的大难题的解决就是设置 中间
div
的左右 padding
分别为左侧 和右侧
的宽度, 就保证其不会被遮挡. 当然别忘了高度和父容器保持一致.
#main {
margin-left: 100px;
margin-right: 100px;
height: 100%;
}
优化一下代码, 为了防止窗口宽度很小导致 float
布局失效, 在屏幕宽度小于等于 300px
(稍大于左右侧区域宽度之和) 时不显示左右侧区域并取消 中间
div
的 margin
.
@media screen and (max-width: 300px) {
#main {
margin: 0;
}
#left, #right {
display: none;
}
}
感谢你看到这里, 祝福你也顺利通过面试, 找到心仪的工作