「CSS」布局

  • display
    • display:block
    • display:inline
    • display:inline-block
    • display:none
  • position
    • position:relative
    • position:absolute
    • position:fixed
    • top/right/bottom/left
    • z-index
      • z-index 栈
  • float
    • clear
  • flex
    • flex 方向
      • flex-direction
      • flex-wrap
      • flex-flow
      • order
    • flex 弹性
      • flex-basis
      • flex-grow
      • flex-shrink
      • flex
    • flex 对齐
      • justify-content
      • align-items
      • align-self
      • align-content

布局

学习布局前须知道 CSS 中的定位机制。

  • 标准文档流(Normal Flow)
  • 浮动(Float)
  • 绝对定位(Absolute Positioning)

标准文档流,从上到下,从左到右的输出文档内容。它由块级(block)元素和行级元素组成,且它们都是盒子模型。

下面为 Firefox 布局可视化 Gecko Reflow Visualisation,布局是指浏览器将元素以正确的大小摆放在正确的位置上。

gecko-reflow-visualisation.gif

display

设置元素的显示方式

display 默认宽度 可设置宽高 起始位置
block 父元素宽度 换行
inline 内容宽度 同行
inline-block 内容宽度 同行
display:block
  • 默认宽高为父元素宽高
  • 可设置宽高
  • 换行显示
  • 默认为block的元素:<div>, <p>, <h1> ~ <h6>, <ul>, <form>
display:inline
  • 默认宽度为内容宽度
  • 不可设置宽高
  • 同行显示(元素内部可换行)
  • 默认为inline的元素:<span>, <a>, <label>, <cite>, <em>
display:inline-block
  • 默认宽度为内容宽度
  • 可设置宽高
  • 同行显示
  • 整块换行
  • 默认为inline-block的元素:<input>, <textarea>, <select>, <button>
display:none
  • 设置元素不显示

display:nonevisibility:hidden 的区别为

  • display:none 不显示且不占位,
  • visibility:hidden 不显示但占位。

position

position 用于设置定位的方式与top right bottom left z-index 则用于设置参照物位置(必须配合定位一同使用)。

三种定位形式

  • 静态定位(static)
  • 相对定位(relative)
  • 绝对定位(absolute、fixed)
position: static | relative | absolute | fixed
/* 默认值为 static */
position:relative
  • 相对定位的元素仍在文档流之中,并按照文档流中的顺序进行排列。
  • 参照物为元素本身的位置。

tips: 最常用的目的为改变元素层级和设置为绝对定位的参照物。

position-relative.png
position:absolute

建立以包含块为基准的定位,其随即拥有偏移属性和 z-index 属性。

  • 默认宽度为内容宽度
  • 脱离文档流
  • 参照物为第一个定位祖先或根元素(<html> 元素)
position-absolute.png
position:fixed
  • 默认宽度为内容宽度
  • 脱离文档流
  • 参照物为视窗

tips: 宽高的100%的参照依然为视窗(例:网页遮罩效果)

position-fixed.png
top/right/bottom/left
layout-position.png

其用于设置元素边缘与参照物边缘的距离,且设置的值可为负值。在同时设置相对方向时,元素将被拉伸。

z-index

其用于设置 Z 轴上得排序,默认值为 0 但可设置为负值。(如不做设置,则按照文档流的顺序排列。后面的元素将置于前面的元素之上)

layouy-position-zindex.png
z-index 栈

父类容器的 z-index 优于子类 z-index 如图

layout-position-zindex-stack.jpg

float

CSS 中规定的定位机制,其可实现块级元素同行显示并存在于文档流之中。浮动仅仅影响文档流中下一个紧邻的元素。

float: left | right | none | inherit
  • 默认宽度为内容宽度
  • 脱离文档流(会被父元素边界阻挡与position脱离文档流的方式不同)
  • 指的方向一直移动
float-right.png

float 元素在同一文档流中,当同时进行 float 时它们会按照文档流中的顺序排列。(当所有父元素中的所有元素脱离文档流之后,父元素将失去原有默认的内容高度)

float-right-all.jpg

注意:float 元素是半脱离文档流的,对元素是脱离文档流,但对于内容则是在文档流之中的(既元素重叠但内容不重叠)。

float-half-off.png
clear
clear: both | left | right | none | inherit
  • 应用于后续元素
  • 应用于块级元素(block)

使用方法

优先级自上而下

  1. clearfix 于父元素
  2. 浮动后续空白元素 .emptyDiv {clear: both}
  3. 为受到影响的元素设置 width: 100% overflow: hidden 也可
  4. 块级元素可以使用 <br> 不建议使用,影响 HTML 结构
/* clearfix */
.clearfix:after {
   content: "."; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}
.clearfix {zoom: 1;} /* 针对 IE 不支持 :after */

flex

flex-container-and-item.jpg

弹性布局可用于多行自适应,多列自适应,间距自适应和任意对齐。

创建 flex container

display: flex
/* 弹性容器内的均为弹性元素*/

flex item

只有弹性容器在文档流中的子元素才属于弹性元素。

<div style="display: flex;">
  <div>Block Element</div>
  <!-- flex item: YES-->
  <span>Inline Element</span>
  <!-- flex item: YES-->
  <div style="position:absolute;">Absolute Block Element</div>
  <!-- flex item: YES-->
</div>
flex 方向
flex-direction
<!-- 默认值为 row -->
flex-direction: row | row-reverse | column | column-reverse
flex-direciton.png
flex-wrap
<!-- 默认值为 nowrap -->
flex-wrap: nowrap | wrap | wrap-reverse
flex-wrap.png
flex-flow

flex-flowflex-wrapflex-direction 的简写,建议使用此属性(避免同时使用两个属性来修改)。

flex-flow: <'flex-direction'> || <'flex-wrap'>
flex-flow.png
order

order 的值为相对的(同被设置和未被设置的值相比较),当均为设置时默认值为 0 则按照文档流中的顺序排列。

order: <integer>
<!-- 默认为 0 -->
flex-order0.png
flex-order1.png
flex 弹性
flex-basis

其用于设置 flex-item 的初始宽高(并作为弹性的基础)。如果 flex-direction 是以 row 排列则设置,如以 column 排列则设置

flex-basis: main-size | <width>
flex-grow

伸展因子,其为弹性布局中最重要的元素之一,flex-grow 设置元素可用空余空间的比例。flex-container 先安装宽度(flex-basis)进行布局,如果有空余空间就按照 flex-grow 中的比例进行分配。

Width/Height = flex-basis + flex-grow/sum(flow-grow) * remain

flex-grow: <number>
initial: 0
<!-- 默认值为 0 -->
flex-grow0.png
flex-grow1.png
flex-grow2.png
flex-shrink

收缩因子,用于分配超出的负空间如何从可用空间中进行缩减。

flex-shrink: <number>
initial: 1
<!-- 默认值为 1 -->

Width/Height = flex-basis + flow-shrink/sum(flow-shrink) * remain

remain 为负值,既超出的区域。

flex-shrink.png
flex

其为 flex-grow flex-shrink flex-basis 的值缩写。

flex: <'flex-grow'> || <'flex-shrink'> || <'flex-basis'>
initial: 0 1 main-size
flex 对齐
justify-content

其用于设置主轴(main-axis)上的对其方式。弹性元素根据主轴(横向和纵向均可)定位所以不可使用 leftright 因为位置为相对的。(行为相似的属性有 text-align

justify-content: flex-start | flex-end | center | space-between | space-around
<!-- 默认值为 flex-start -->
flex-justify-content.png
align-items

其用于设置副轴(cross-axis)上的对其方式。(行为相似的属性有 vertical-align

align-items: flex-start | flex-end | center | baseline | stretch
<!-- 默认值为 stretch -->
flex-align-items.png
align-self

其用于设置单个 flex-item 在 cross-axis 方向上的对其方式。

align-self: auto | flex-start | flex-end | center | baseline | stretch
<!-- 默认值为 auto -->
flex-align-self.png
align-content

其用于设置 cross-axis 方向上的对其方式。

align-content:flex-start | flex-end | center | space-between | space-around | stretch
<!-- 默认为 stretch -->
flex-align-content.png

tips: 分享一个 Flexbox 演示网站 ,支持可视化调整每个属性,及时看到效果反馈

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,453评论 5 15
  • 前言 温馨提示:本文较长,图片较多,本来是想写一篇 CSS 布局方式的,但是奈何 CSS 布局方式种类太多并且实现...
    sunshine小小倩阅读 3,139评论 0 59
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,754评论 1 92
  • 一般而言,一个静态web页面的呈现需要通过html和css配合实现。html相当于页面的骨架,规定了文档的结构。c...
    夏木与晴空阅读 1,068评论 0 3
  • 就这样 像打开一道门 我打开了你 秋天 我的灵魂赶着马车 慢慢收获你
    孟小繁阅读 126评论 0 0