CSS 布局经典问题初步整理

CSS 布局经典问题初步整理

本文主要对 CSS 布局中常见的经典问题进行简单说明,并提供相关解决方案的参考链接,涉及到三栏式布局,负 margin,清除浮动,居中布局,响应式设计,Flexbox 布局,等等。

写在前面

  1. 很少在牛客发技术帖,应叶神要求特来发帖,希望小伙伴能点进我的个人主页 http://brianway.github.io 帮我刷刷访问量,要是再顺手扫扫二维码请我吃个甜筒🍦就更好了。
  2. 我主要是做 Java 研发/后台方向的,前端才入门一个月,有写的不对的地方还请各位大佬指出。

CSS 基础知识

下面几个入门教程不错:

CSS 定位问题

主要就是经典的绝对定位,相对定位问题。

三栏式布局

涉及浮动和清除浮动,主要讲解“圣杯”和“双飞翼”两种解决方法。这两种方法实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,它们实现的效果是一样的,差别在于其实现的思想。

圣杯布局

圣杯:父盒子包含三个子盒子(左,中,右)

  • 中间盒子的宽度设置为width: 100%;独占一行;
  • 使用负边距(均是margin-left)把左右两边的盒子都拉上去和中间盒子同一行;
    • .left {margin-left:-100%;}把左边的盒子拉上去
    • .right {margin-left:-右边盒子宽度px;}把右边的盒子拉上去
  • 父盒子设置左右的 padding 来为左右盒子留位置;
  • 对左右盒子使用相对布局来占据 padding 的空白,避免中间盒子的内容被左右盒子覆盖;
<!-- 圣杯的 HTML 结构 -->
<div class="container">
    <!-- 中间的 div 必须写在最前面 -->
    <div class="middle">中间弹性区</div>
    <div class="left">左边栏</div>
    <div class="right">右边栏</div>
</div>

双飞翼布局

双飞翼:父盒子包含三个子盒子(左,中,右),中间的子盒子里再加一个子盒子。

  • 中间盒子的宽度设置为width: 100%;独占一行;
  • 使用负边距(均是margin-left)把左右两边的盒子都拉上去和中间盒子同一行;
  • 在中间盒子里面再添加一个 div,然后对这个 div 设置margin-left和margin-right来为左右盒子留位置;
<!-- 双飞翼的 HTML 结构 -->
<div class="container">
    <!-- 中间的 div 必须写在最前面 -->
    <div class="middle">
         <div class="middle-inner">中间弹性区</div>
    </div>
    <div class="left">左边栏</div>
    <div class="right">右边栏</div>
</div>

圣杯和双飞翼异同

圣杯布局和双飞翼布局解决的问题是一样的,都是两边定宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。

  • 两种方法基本思路都相同:三栏全部 float 浮动。首先让中间盒子 100% 宽度占满同一高度的空间,在左右两个盒子被挤出中间盒子所在区域时,使用 margin-left 的负值将左右两个盒子拉回与中间盒子同一高度的空间。接下来进行一些调整避免中间盒子的内容被左右盒子遮挡。
  • 主要区别在于 如何使中间盒子的内容不被左右盒子遮挡
    • 圣杯布局的方法:设置父盒子的 padding 值为左右盒子留出空位,再利用相对布局对左右盒子调整位置占据 padding 出来的空位;
    • 双飞翼布局的方法:在中间盒子里再增加一个子盒子,直接设置这个子盒子的 margin 值来让出空位,而不用再调整左右盒子。

简单说起来就是双飞翼布局比圣杯布局多创建了一个 div,但不用相对布局了,少设置几个属性。

利用浮动实现

我自己使用浮动也实现了三栏式布局:左边盒子左浮动,右边盒子右浮动,中间盒子利用margin-left和margin-right来为左右盒子留位置,同时父盒子设置overflow: auto;来避免子盒子溢出。

<!-- 浮动实现的 HTML 结构 -->
<div class="container">
    <div class="left">左边栏</div>
    <div class="right">右边栏</div>
    <!-- 中间的 div 必须写在最后面 -->
    <div class="middle">中间弹性区</div>
</div>

三栏式布局参考下面几个链接:

三栏式布局涉及到负 magin 和 清除浮动的问题。

负 magin

这里引出了“负 margin”的问题:

简单总结几点:

  • 不使用 float 的话,负 margin 元素是不会破坏页面的文档流。所以如果你使用负 margin 上移一个元素,所有跟随的元素都会被上移(而 relative 定位的元素则不同,会保留原位置,影响文档流)。
  • 当 static 元素的 margin-top/margin-left 被赋予负值时,元素将被拉进指定的方向。
  • 如果你设置 margin-bottom/right 为负数,元素并不会如你所想的那样向下/右移动,而是将后续的元素拖拉进来,覆盖本来的元素。
  • 当元素不存在 width 属性或者width: auto的时候,负 margin 会增加元素的宽度.
  • margin-top 为负值不会增加高度,只会产生向上位移;margin-bottom 为负值不会产生位移,会减少自身的供 CSS 读取的高度,影响下方的元素位置;上下相邻的元素两者均为负时,效果不叠加,取负值更多的那个效果。

清除浮动

清除浮动主要是为了解决高度塌陷问题。而简单的clear: both并不能解决这个问题,所以引出了许多解决方案。

各种解决方案在上面的链接里有很详细的说明了,这里就不赘述了。大体分为两类:

  • 其一,通过在浮动元素的末尾添加一个空元素,设置clear: both属性,after 伪元素其实也是通过 content 在元素的后面生成了内容为一个点的块级元素;
  • 其二,通过设置父元素overflow或者display: table属性来闭合浮动

顺便补充一句,clear float(例如clear: left) 是对某个元素设置,以避免其某一边有浮动元素,即对当前元素产生约束,约束的边界为其他的浮动元素。对于已经浮动的元素,设置 clear float 是无效的。

居中布局

  • Centering in CSS: A Complete Guide:非常全面的居中定位博客,包括各种情况下的水平居中,垂直居中和水平垂直居中方案。有展示示例及相应的 HTML 和 CSS 代码

文章大致结构:

  • 水平居中
    • 对于行内元素(inline):text-align: center;
    • 对于块级元素(block):设置宽度且marigin-left和margin-right是设成 auto
    • 对于多个块级元素:对父元素设置text-align: center;,对子元素设置display: inline-block;;或者使用 flex 布局
  • 垂直居中
    • 对于行内元素(inline)
      • 单行:设置上下 pandding 相等;或者设置line-height和height相等
      • 多行:设置上下 pandding 相等;或者设置display: table-cell;和vertical-align: middle;;或者使用 flex 布局;或者使用伪元素
    • 对于块级元素(block):下面前两种方案,父元素需使用相对布局
      • 已知高度:子元素使用绝对布局top: 50%;,再用负的margin-top把子元素往上拉一半的高度
      • 未知高度:子元素使用绝对布局position: absolute; top: 50%; transform: translateY(-50%);
      • 使用 Flexbox:选择方向,justify-content: center;
  • 水平垂直居中
    • 定高定宽:先用绝对布局top: 50%; left: 50%;,再用和宽高的一半相等的负 margin 把子元素回拉
    • 高度和宽度未知:先用绝对布局top: 50%; left: 50%;,再设置transform: translate(-50%, -50%);
    • 使用 Flexbox:justify-content: center; align-items: center;

响应式设计

“响应式设计(Responsive Design)” 是一种让网站针对不同的浏览器和设备“呈现”不同显示效果的策略。

媒体查询(Media Queries)是做此事所需的最强大的工具。

注: Responsive Web Design = RWD,Adaptive Web Design = AWD

RWD:

  • 采用 CSS 的 media query 技术
  • 流体布局(fluid grids)
  • 自适应的图片/视频等资源素材

(为小、中、大屏幕做一些优化,目的是让任何尺寸的屏幕空间都能得到充分利用)

AWD:

  • CSS media query 技术(仅针对有限几种预设的屏幕尺寸设计)
  • 用 JavaScript 来操作 HTML 内容
  • 在服务器端操作 HTML 内容(比如为移动端减少内容,为桌面端提供更多内容)

以上 RWD 和 AWD 解释引自 知乎 @屹峰

可以参考 Bootstrap 的网格系统:http://getbootstrap.com/css/#grid-less

The Bootstrap 3 grid system has four tiers of classes: xs (phones), sm (tablets), md (desktops), and lg (larger desktops).

自己实现网格系统: Creating Your Own CSS Grid System

Flexbox 布局

Flexbox 布局参考下面几篇文章就可以了,几篇文章大同小异,看一两篇就知道大概了,讲的挺详细的,在此不赘述


作者@brianway更多文章:个人网站|CSDN |oschina

#前端工程师#
全部评论
光是罗列资料没什么太***价值,建议大家沉下心来看看CSS2.1/2.2标准,可以参考别人的最佳实践思考一下为什么要这么布局,CSS没看上去的容易啊
点赞 回复
分享
发布于 2017-05-19 15:55
整理的挺好的啊,学习了。赞!
点赞 回复
分享
发布于 2017-09-20 21:00
滴滴
校招火热招聘中
官网直投

相关推荐

一面全场43分钟,八股为主,注重基础1.第一个项目里面有什么亮点吗2.地图功能在技术层面有什么印象深刻的点3.第二个项目中有什么值得分享的吗4.数据存到localStorage中什么时候进行数据的清除和更新5.数据存localStorage中会不会遇到有上限的情况?什么时候清除合适6.页面性能上有什么别的优化手段吗7.职业发展规划和后续期望的城市8.ES6常用API或者语法9.let&nbsp;const有什么区别10.块级作用域怎么理解11.箭头函数和普通函数的区别12.原型链13.Promise和async&nbsp;await的区别14.假如一个async函数没有return任何东西的话会怎么样15.那这样的一个async执行完之后会返回什么东西?(不太确定,试了一下返回的是一个fulfilled的Promise,值为undefined,现场答对了)16.那这个promise执行then之后会返回什么(前面不确定这个就不敢说了)17.BFC18.什么叫父元素塌陷问题,怎么解决19.三栏布局,左右固定中间自适应20.圣杯布局如何实现21.flex:122.了解过响应式布局吗23.v-model的原理,这个语法糖怎么实现的(忘了)24.vue2中数组如何实现响应式25.vue2的数组push等方法能实现响应式吗(答错了还回答的很果断,Vue中重写了数组的原型方法)算法题:[1, [2, [3, 4, 5]], 6] =>&nbsp;[1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5,&nbsp;6]数组展平(用api,不用api)面试官临时变题:只展平一层怎么操作[1, [2, [3, 4, 5]], 6] =>&nbsp;[1,&nbsp;2,&nbsp;[3,&nbsp;4,&nbsp;5],&nbsp;6]#美团##前端##25届暑期实习##软件开发2024笔面经##我的实习求职记录#
点赞 评论 收藏
转发
💼公司岗位岗位介绍:我们是天猫技术品牌线的行业前端团队,目前负责消费电子、3C数码、运动、家装家居、汽车、奢品等行业的线上线下模式的探索,面向淘内淘外,提供商家、门店、消费者最佳用户体验。团队在XR、3D、2D渲染引擎这些创新体验上有不错的沉淀,同时面向全栈领域团队探索了&nbsp;Serverless&nbsp;云端研发模式,在消费者前台,通过数据挖掘消费、意图识别提升消费者效率,同样面向工程领域,在跨端、前端工程化、中后台微前端都有一些沉淀,如果你是一位充满想象的终端极客,欢迎你的加入,通过自己的技术想法去改变天猫行业的终端表达。我们这里技术氛围浓厚,有师兄师姐一对一指导和定期的技术分享,加入我们,一起打开有意思的未来!----------------------相关人员要求:1、精通各种前端基础技术(包括HTML/CSS/JavaScript等),熟悉ES6语法,熟悉常见前端框架,熟悉网络协议(HTTP/SSL),熟悉常见安全问题和对策;2、熟悉前端工程化与模块化开发,并有实践经验(如gulp/webpack、VueJS/React、ide研发等);3、至少熟悉一门非前端的语言(如NodeJS/Java/PHP/C/C++/Python/Ruby等),并有实践经验;4、对前端技术有持续的热情,良好的团队协作能力,有复杂业务系统/技术体系建设经验,提升团队研发效率,实现极致性能,通过创新交互优化产品体验;5、有&nbsp;Node.js&nbsp;经验、前端可视化经验优先&nbsp;#25届校招#&nbsp;&nbsp;#25届前端校招#
投递淘天集团等公司10个岗位
点赞 评论 收藏
转发
9 85 评论
分享
牛客网
牛客企业服务