CSS 不需要清除浮动的圣杯布局~面试可能会问

不需要清除浮动的圣杯布局

网上很多关于圣杯和双飞翼布局的教程, 我看了下实现都是需要中间的三个元素 float 布局而且需要清除浮动. 但是真的需要三个元素都 float 吗? 不清除浮动可以吗?

先看效果
在这里插入图片描述

HTML

<header>header</header>
<main>
  <aside id="left">left</aside>
  <aside id="right">right</aside>
  <div id="main">main</div>
</main>
<footer>footer</footer>

HTML 的结构很清楚, 上中下分别是 header, mainfooter, 和常见圣杯布局的不同是, main 中间区域和两边区域的位置.

从下图中可以看出来的是, 中间的 divmain 的第一个元素变成了最后一个元素. 这样写的目的是什么? 因为我们想要 div 显示在中间, 如果 div 前面的元素为 float, 那么后面的 div 自然就会正常显示, 即水平填满父容器宽度且上边界和父元素的上边界重合.

在这里插入图片描述

在这里插入图片描述

但是这样问题又来了, 因为中间的 div 被两侧的遮挡住了, 别急, 马上用请 CSS 帮忙.

CSS

首先重置 <body> 元素的默认 paddingmargin0, 并设置其高度为 100vh, 即浏览器视口 viewport 的高度.

body {
  margin: 0;
  padding: 0;
  min-height: 100vh;
}

接着, 设置 headerfooter 的高度, 都固定为 70px.

header {
  height: 70px;
}
footer {
  height: 70px;
}

其次, 设置中间整个元素 <main> 的高度为父元素高度减去 headerfooter 高度. 好了, 不需要清除浮动的原因出现了, 因为父元素的高度不是由子元素撑起的, 而是手动设置的.

main {
  height: calc(100vh - 140px);
}

接下来, 设置两个 <aside> 元素分别向左和右 float, 宽度都是 100px, 高度和父容器相同.

#left {
  float: left;
  width: 100px;
  height: 100%;
}

#right {
  float: right;
  width: 100px;
  height: 100%;
}

最后的大难题的解决就是设置 <main> 中间 div 的左右 padding 分别为左侧 <aside> 和右侧 <aside> 的宽度, 就保证其不会被遮挡. 当然别忘了高度和父容器保持一致.

#main {
  margin-left: 100px;
  margin-right: 100px;
  height: 100%;
}

优化一下代码, 为了防止窗口宽度很小导致 float 布局失效, 在屏幕宽度小于等于 300px(稍大于左右侧区域宽度之和) 时不显示左右侧区域并取消 <main> 中间 divmargin.

@media screen and (max-width: 300px) {
  #main {
    margin: 0;
  }
  #left, #right {
    display: none;
  }
}

在这里插入图片描述

感谢你看到这里, 祝福你也顺利通过面试, 找到心仪的工作😀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值