Jacleklm's Blog

CSS之页面布局详解

2019/10/09

布局基础知识

1、display 属性:block(块级元素),inline-block,none(会在页面看不到,并且不会在页面占据空间),flex(flex 布局),inline-block(应用场景:eg. 让很多个有宽高的 div 从左到右铺满页面;此时最好也设置 vertical-align:top)
2、div { max-width: 600px; margin: 0 auto; }
用 max-width 代替 width,防止浏览器页面表现出现水平滚动条;margin:0 auto 实现盒子的左右居中
3、盒模型的 box-sizing 属性:设成 border-box,元素的 padding 和 border 不会算进元素的 width 和 height 中;content-box 是常规盒模型;padding-box—高宽包括了内边距
4、positoin:static(默认值,元素不会被“positioned”,设成其他值元素都会被“positioned”);relative;absolute(相对于最近的“positioned”祖先元素,也是一个破环属性,脱离文档流);fixed(脱离文档流)。设置成后面三个属性之后,一般还需要写 top,right 等(relative 时不写的话会和 static 一样,没什么变化,但这时候其子元素可以写 position: absolute;)
z-index 属性:只对被“positioned”的元素有效;对父子元素,子元素 z-index 的默认值是等于其父元素的;当子的 z-index 是大于等于 0 的时候,就算小于父 z-index,也会显示在父元素之上,只有设置成负值才会被父元素覆盖
5、float 属性
其设计初衷是为了实现文字环绕效果。有以下特性:

  • 破坏性:一个 div 中只有一个 img(或有少量文字),当设置 img {float:left}之后,父 div 会坍塌,img 会溢出。因为设置了 float 的 img 会脱离文档流
  • 包裹性:div 被设置 float 之后,会变得不会默认铺满页面宽度,而是紧包裹住 div 中的文字
  • 清空格:当一个 div 中有多个 img 的时候,页码显示 img 从左到右且相互有间隔,但是 img 设置 float 之后,这种间隔会消失,img 紧紧挨着(有时候不希望有间隔,可用此法来清间隔)

6、clear 属性,用来控制浮动。
基本功能:有两个盒子,第一个写了 float:left,第二个没有,则页面效果是两个盒子会重叠而不是上下分布。此时在第二个盒子(被影响的盒子,同级元素)中写 clear:left,即能实现上下分布(clear:both 也可以)。
7、清除浮动overflow 属性:也是写在被影响的盒子中(应用场景:over,即内外嵌套,内 div 超出的时候),大部分时候是写在外盒,写在同级盒子的情况是 BFC 的时候(见下面 BFC 部分)。有以下四种清除浮动的方法

  • 父元素设置 overflow:hidden,这样父元素就有高度了,不会坍塌(常用
  • 浮动父元素
  • 给父元素添加一个子 div,给其设置 clear:both
  • clearfix:给父元素添加一个:after 伪元素,里面写{content: ‘’, display: table, clear: both}; 父元素身要写 *zoom: 1(缩放比例); 以提高兼容性。其实本质和第三种方法是一样的。

8、百分比宽度:width 和 max-width 都可用百分比,相对父级元素的 width
9、媒体查询
@media screen and (min-width/max-width:600px) { }
使用 meta 标签中的 viewport 之后可以布局在移动浏览器上显示的更好
10、在一个 div 中实现里面文字/元素呈现多列分布:用column属性。设置 column-count 和 column-gap 即可
11、布局模型
流动模型(Flow)是浏览器默认的布局模式。块状元素默认从上到下分布,行内元素默认从左到右分布
浮动模型(Float)。设置了 float 属性的时候
层模型(Layer)。设置了 position 属性的时候

对齐方式

  • 水平居中

    • 行内元素的水平居中
      是 img,span 等行内元素的时候,父级元素写 text-align: center 即可
    • 块状元素的水平居中(定宽)
      margin: 0 auto
    • 块状元素的水平居中(不定宽)
      把块状元素写 display: inline-block/inline,再用行内元素的方法实现居中。定宽也能用此法
  • 垂直居中(假设父元素是盒子且高度已定)

    • 子元素是行内元素,高度是其内容撑开的。设定父元素的 line-height 即可
    • (差)子元素是块级元素且高度还没有设定。给父元素设定 display: table; vertical: middle 可解决.
    • (差)子元素是块级元素且高度已经设定。设子元素的 margin-top 为(父元素高度-子元素高度)/2
    • flex 布局法。对父元素写 display: flex; flex-direction: column; justify-content: center;(似乎 display: flex;align-items: center;也可以)
    • 相对+绝对定位法
  • 垂直水平居中

    • (差)在父元素写 text-align:center; vertical-align: middle; display: table-cell;并把子元素设置为 inline-block
    • 若子元素是图像,父元素写 text-align:center; 用行高替代高度,且字体大小设为 0。子元素本身设置 vertical-align:middle
    • 相对+绝对定位法。父元素设置为相对,子元素设为绝对,在 top、left、right、bottm 都为确定值(可都写成 0)的情况下,写 margin: auto
    • flex 布局。对父元素写 display: flex;justify-content: center;align-items: center;

两列布局(左盒定宽,右盒自适应)

需要知道左侧盒子宽度的方案:

  • 双 float 并且右盒设 margin-left = 左盒 width;或者双 float 并且右盒写 width: calc(100% - 左盒 width),此时由于右盒的 width 是计算的,所以子盒子都得写 box-sizing: border-box 。父元素都要清除浮动。
  • 双 inline-block 方案(inline-block + 设 vertical-align)并且 右盒写 width: calc(100% - 左盒 width),box-sizeing。并且父元素要写 font-size: 0,这也和 width 的计算有关
  • (少用)父元素设置 position:relative,左元素设成 absolute,右盒子 margin-left: 左盒子宽度,并且(当左盒高度大于右盒时要)设定父容器的 min-height

不需要知道左侧盒子宽度的方案

  • float+BFC 方法。左盒子 float: left,右盒子通过 overflow: auto,形成了 BFC,因此右侧盒子不会与浮动的元素重叠。父元素清除浮动
  • flex 布局(最好的)。父写 display: flex;align-items: flex-start(这一项能让两个子盒高度自动)。左写定宽,右写 flex: 1。
  • grid 布局。父元素写 display: grid;grid-template-columns: 120px 1fr;align-items: start。子元素都需要 box-sizing: border-box。左写 grid-column: 1,右写 grid-column: 2

三列布局(两侧定宽中间自适应)

  • 左右盒子 float + 中间盒子 margin

  • 绝对定位法。父元素设置 position:relative; 左右盒子元素设成 absolute,再用 top、left、right 固定位置。中间盒子用左右 margin 撑开

  • margin 负值法 都是三个盒子都 float:left。两种方案都是把中间盒子写在 DOM 最前面,优先渲染

    • 圣杯布局(父盒子写左右 padding,左右盒子通过相对定位确定位置)
    • 双飞翼布局(middle 的 div 里又插入一个 div,通过调整内部 div 的 margin 值,实现中间栏自适应,内容写到内部 div 中)
  • flex 布局:两侧定好宽度,父元素写 display: flex; 中间的子元素写 flex: 1 (DOM 中必须是先写左再写中最后写右)

BFC

帮助理解
BFC 全称”Block Formatting Context”, 中文为“块级格式化上下文”。是布局过程中生成块级盒子的区域(同时保持流体特性,存在于文档流中),也是浮动元素与其他元素的交互限定区域
(BFC 一般是出现在浮动元素周围的元素)当元素有下面情况的时候变成 BFC 元素

  • float 的值不为 none
  • overflow 的值为 auto,scroll 或 hidden
  • display 的值为 table-cell, table-caption, inline-block 中的任何一个
  • position 的值不为 relative 和 static ……

变成 BFC 元素后会有以下特性

  • BFC 就是页面上的一个隔离的独立容器,容器里面的布局与外面互不影响
  • BFC 的区域不会与其它 float 的元素区域重叠
  • 计算 BFC 的高度时,浮动子元素也参与计算

有用的其实是overflow:auto/hidden,display:inline-block 和 display:table-cell。主要用途:清除浮动,防止 margin 重叠,阻止文字环绕。

flex 布局

告诉你一个将 footer 保持在底部的最好方法

1、flex 容器的属性:flex-direction 主轴方向,justify-content 项目在主轴上的对齐方式,align-items 定义项目在交叉轴上如何对齐……
2、flex item 的属性:flex 属性是 flex-grow(项目的放大比例(与其他项目相比),默认为 0), flex-shrink(项目的缩小比例) 和 flex-basis 的简写,默认值为 0 1 auto。….
注意:设置为 Flex 布局后,子元素的 float 、clear 和 vertical-align 属性将失效
flex 布局
1、可以实现骰子任意面的任意布局(一个点位一个盒子)
2、网格布局(在骰子布局的基础上实现 item 的缩放)
3、圣杯布局 …

grid 布局

1、Grid 布局(二维布局)远比 Flex (一维布局)布局强大。它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。
2、概念:容器,项目,行,列,单元格(行与列的交叉部分),网格线。
注意:设置为 Grid 布局后,子元素的 float、display: inline-block、display: table-cell、vertical-align 和 column-*属性将失效
3、容器属性:grid-template-columns 和 grid-template-rows 定义每一列列宽和每一行行高(多少行/列就有多少个值,可以是 px、是百分比、fr;也可以直接写 repeat(3, 33.33%);),grid-gap: grid-row-gap grid-column-gap,单元格内容的水平和垂直位置 place-items: align-items justify-items ,整个内容区域在容器里面的水平和垂直位置 place-content: align-content justify-content ……

响应式布局

移动端布局

  1. 媒体查询,选取主流设备宽度尺寸作为断点进行样式编写(后面的样式会覆盖前面的样式)
  2. 加标签
    1
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/> 
    告诉浏览器,使用的设备的宽度作为视图宽度,并禁止初始的缩放
  3. 总结方案:(1)媒体查询+px ;(2)媒体查询+rem

从 Vue 项目中总结的
初始化:
1、在 index.html 的 meta 标签中的 viewport 的 content 中加 minimum-scale=1.0, maximum-scale=1.0, user-scalable=no
2、引入 reset.css 重置页面的样式,设定不同手机浏览器的初始化样式
3、引入 border.css 解决移动端的 1px 边框的问题
4、300ms 点击延迟的问题:在某些浏览器用 click 事件的时候,会延迟 300ms。用 npm 安装 fastclick 模块解决之
设计:
1、把 html 的 font-size 设置为 50px(reset.css 中),然后项目中所有的宽高和 font-size 都用 rem 来做单位。这是因为移动端的设计稿一半是二倍图,这样设计稿中的 10px 其实是 5px,写 css 的时候就是 0.1rem,比较方便。
2、图片加载防抖四件套:overflow:hidden; width:0; height:0; padding-bottom: 100%
3、加 1px 边框的方法:直接在 div 上添加 class=”border-top/bottom”
4、长文本省略:overflow: hidden; white-space: nowrap; text-overflow: ellipsis

参考资料
学习 CSS 布局
CSS 布局(四) float 详解
CSS 布局(六) 对齐方式
七种实现左侧固定,右侧自适应两栏布局的方法
我熟知的三种三栏网页宽度自适应布局方法
双飞翼布局
CSS 深入理解流体特性和 BFC 特性下多栏自适应布局

CATALOG
  1. 1. 布局基础知识
  2. 2. 对齐方式
  3. 3. 两列布局(左盒定宽,右盒自适应)
  4. 4. 三列布局(两侧定宽中间自适应)
  5. 5. BFC
  6. 6. flex 布局
  7. 7. grid 布局
  8. 8. 响应式布局
  9. 9. 移动端布局