CSS 布局

经过前期的准备工作,现在就可以正确的开始布局了。这里也将是页面布局开始的地方。

常规的文档流布局

这种是最基础的布局,从上至下从左向右。

浮动布局 float

浮动的效果已经讲解过就不再赘述

定位 position

使用不同的定位方式,得到不同的效果,绝对定位调整left top right和bottom来调整位置。

css表格 display:table

还有行内table display:inline-table
使用csstable有能力让你像table一样对元素进行布局,并且更符合语义化,对屏幕阅读器的用户更加友好。
值得一提是,虽然csstable有这么多优势,但是尽量只作用于小范围内,比如表单。
当父容器设置为table时,需要针对性的对子元素设计。

  • display:table-row 子元素将作为表行显示 tr
  • display:table-cell 子元素将作为单元格显示 td / th
  • display:table-column 子元素将作为表列显示 col
  • display:table-caption 子元素将作为表格标题 caption
  • display:table-header-group 子元素将作为一行或多行分组显示 thead
  • display:table-row-group 子元素将作为一行或多行分组显示 tbody
  • display:table-column-group 子元素将作为一列或多列分组显示 colgroup
  • display:table-footer-group 子元素将作为一行或多行分组显示 tfoot

table的行列合并

table中常见的 行列合,使用colspan和rowspan,但是csstable没有些属性,因此需要折返
使用table 将单元格内容拆分,再控制width,将单元格等列分布,使用百分比计算单元格宽度

  <div class="table">
    <div class="tr">
      <div class="td">
        <div class="inner-table">
          <div class="inner-tr">
            <div class="inner-td" style="width:50%"></div>
            <div class="inner-td" style="width:50%"></div>
          </div>
        </div>
      </div>
    </div>
    <div class="tr">
      <div class="td">
        <div class="inner-table">
          <div class="inner-tr">
            <div class="inner-td" style="width:100%"></div>
          </div>
        </div>
      </div>
    </div>
  </div>

嵌套table使用宽度达到满足合并列的效果,行合并也是一样的,将行分成需要的列,然后内容单独成行

比较有意思的table-caption属性,设置该元素为表格标题后,通过caption-side将标题放在表格的上面top还是下面bottom

弹性盒子 display:flex

弹性盒子最早在2009年纳入标准,现在主流的浏览器已经支持,对于webkit内核需要内核前缀-webkit-


MDN弹性盒子元素说明

父容器设置为flex后,父元素本身变成 flex container,内部的直接下级所有子元素变成flex item。

  • flex-direction 排列方向,按照横轴排列 row,纵轴排列column,横轴反向排列 row-reverse,纵轴反向排列column-reverse
    这里的排列方向是设定主轴,在flex container内部有两个轴,水平主轴 (row axis) 垂直主轴 (column axis)。
    默认主轴就是文档流从左到右从上到下的方向。

  • flex-wrap 默认情况下,所有子元素将会在主轴方向上排列一排,如果不够将被挤压,直到撑破容器。
    因此,对于多列情况就需要换行适应。默认情况下nowrap,设定为wrap,会按照主轴方向向下换行,设定为wrap-reverse,会在主轴方向向上换行。【不知道为什么总跟reverse过不去】

  • flex-flow flex流,是上面两个的简写形式。

  • justify-content 元素内容调整。向主轴开始方向靠近flex-start 、向主轴结束方向靠近flex-end、向中部center

    • space-between 两端对齐。第一个元素在flex-start,最后一个元素在flex-end ,其余元素的空白区域均匀分布。
    • space-around 空间上环绕对齐。和between相反,元素以center为中心在两侧均匀分布
  • align-items 元素在主轴的交叉轴上的对齐方式。和上面的主轴对齐方式一样,flex-start靠近交叉轴开始位置, flex-end 靠近交叉轴结束位置,center 靠近交叉轴中间位置。

    • baseline 这个是按照第一行的文本的基准线对齐。【这个有什么用么?跟晾衣服一样】
    • stretch 默认值,就是沾满整个交叉轴。
  • align-content 多轴时【其实也就是flexwrap换行情况下,主轴方向上换行操作后产生的多轴】,其对齐方式和justify-content相似,只是设定的内容是多轴的轴线排列。轴线排列的方向是主轴的交叉轴方向。类似将主轴的轴线变成交叉轴的元素,然后使用justify-content调整。

    多轴轴线

  • order 排列顺序。可以把order理解为index,从主轴方向上,从小到大排列。

  • flex-grow 放大比例,默认为0。如果空间剩余,将按照放大比例侵占剩余空间

  • flex-shrink 收缩比例,默认为1,如果空间不足,将按照收缩比例收缩空间

  • flex-basis 初始值。默认auto,即元素自身大小。

  • flex 上面三个的缩写

  • align-self 给子元素本身单独设定对齐方式,覆盖父元素的 align-items 属性。

大多数情况下,弹性盒子嵌套使用,以面对更复杂的情况。

网格布局 display:grid

网格布局和一般表格一样,有行(row)列(column) 还有行列之间的空隙称之为 沟槽(gutter)或者叫间隙(gap),每一个行列覆盖的元素叫轨道track。翻译过来的命名就是很奇怪啊。
除此之外,在显示创建的网格体系中,会创立网格线,每一条网格线有相应的编号,也可以设定名称。

除了display:gird还可以设定display:inline-gird,在行内元素使用网格布局,也可以嵌套使用display:

MDN网格布局
<div class="wrapper">
      <div class="col">1</div>
      <div class="col">2</div>
      <div class="col">3</div>
      <div class="col">4</div>
      <div class="col">5</div>
      <div class="col">6</div>
</div>

当我们设定好布局为grid时,需要给grid设定模板。

显式网格设置

  • grid-template-columns 设定列数,以及每一列的宽度。比如grid-template-columns:15px 22px 22px;,定义了三列,每一列分别为 15,22,22个像素 。这里有用到一个非常好用的函数repeat()

    • repeat() 这个函数传递两个参数,第一个参数是填充多少次,第二个是每个值是多少。 比如 repeat(12, 1fr) 关于fr,可以查看 数值和单位 2.5 fr 的介绍。这里的就可以改写为 grid-template-columns:15px repeat(2,22px);
    • minmax() 使用这个函数为每一个网格设定最小到最大范围。当元素空间调整时,将会按照范围的最大和最小值进行扩张和收缩。
  • grid-template-rows 设定行数以及每一行的高度,如果超出预订的范围,超出的元素使用自身高度。

设定隐式网格

当template覆盖不完全时,可以使用隐式网格限定元素宽高。

  • grid-auto-columns 设定超出设定列元素的列宽

  • grid-auto-rows 设定超出设定行元素的行高

  • grid-column-gap 列间距

  • grid-row-gap 列间距

  • grid-gap 行列间距的缩写。

子元素设定

当我们设定好网格的行列和间距后,如果想对子元素单独设定,比如合并行合并列的操作前,先了解grid line——网格线。

比如我们在白纸上画一个2行3列网格,那这个网格的在水平方向上一共4条垂直网格线,分别记为col1-col4,在垂直方向上一共三条水平网格线 ,分别记为row1-row3。


网格线

使用template表示出来就是

grid-template-columns:[col1] 20px [col2]  60px [col3] 20px [col4] ;

grid-template-rows:[row1] 20px [row2]  60px [row3] ;

定义了每一列每一列的网格线,每一行和每一行的网格线。
网格线命名可以是重名的,同一个网格线可以明名为多个名称。重名的名称在使用时,根据元素所在的位置确定名称代表的是哪一条网格线。

假设我们需要合第一行的所有列时,在水平方向上,需要擦除中间的第二条和第三条垂直网格线。因此,第一行的列的跨度就是1/4——从第一个垂直网格线到第四个垂直网格线。垂直方向上也是等同。

记住这个概念,下面就可以来合并网格内容了。

  • grid-column-start 表格开始的列,代表当前元素从哪一列开始。比如 grid-column-start:1
  • grid-column-end 表格结束的列,代表当前元素宽度持续到哪一列 grid-column-end:4
    这里用的column比如说是grid lines。从第一个网格线到第4个网格线之间的区域。此之外,我们也可以用名称来指定跨度,实际上也是每一个网格线。无论时编号还是名称都指代的是网格线本身。
    上面的可以简写为
  • grid-column : 1/4 除此之外,还有一种和colspan rowspan一样的合并写法grid-column:1 / span 3
    这里使用span(跨度)关键字,计算的方式就是从第一个gridline开始 ,向后合并3列,所以跨度就是 1,1+3。本质上还是不变的。当我们没办法指定列从哪一列开始时,我们需要使用到auto关键字,代表表格从当前计算后得到的元素的位置开始。而auto实际上就是 默认值。grid-column : auto / span 3
    但是假如我们时从中间开始合并,但是又不太确定起始位置。

在行上也是一样的

  • grid-row-start 行开始

  • grid-row-end 行结束

  • grid-row 缩写

  • grid-area 这个是grid-column-start,grid-column-end,grid-row-start,grid-row-end的缩写
    书写形式为 grid-area:<grid-row-start> / <grid-column-start> / <grid-row-end> / <grid-column-end>
    比如 grid-area: 1 / 1 / 2 / 3

当我们指定了元素的开始列和行的开始位置和结束位置时,元素排列的位置可能被替换掉。比如上述的 1/1/2/3 ,假设这个属性应用在第二个元素上就会发生这样的情况


grid-area:1 / 1 / 2 / 3

假如我们指定了开始位置是默认值auto,而给了结束位置,这时候就可以完成元素的位置替换操作。


grid-area: auto / auto / 3 / 4

网格线也是可以使用负数,代表从正向的对角线位置开始。上述的修改可以是 grid-area:auto/auto/-1/-1。也就是正数和倒数的区别,加上正负号以区分方向。

切换横纵坐标 grid-auto-flow

默认情况下,grid的开始方向是水平方向,使用 grid-auto-flow:column 切换为垂直方向。但是定义的模板还是按照行列排序,只是修改元素的填充方向。这一点和flex布局的flex-direction有本质的区别。


row
column

当我们调试网格布局时,在chrome下可以方便的查看当前grid的排列情况,在elements里面,选中gird元素时,chrome会将当前表格的实际行列以及大小使用虚线展示出来,方便调试。


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

推荐阅读更多精彩内容

  • 前言 温馨提示:本文较长,图片较多,本来是想写一篇 CSS 布局方式的,但是奈何 CSS 布局方式种类太多并且实现...
    sunshine小小倩阅读 3,107评论 0 59
  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,410评论 5 15
  • 1. 正常文档流(Normal Flow) 默认情况下页面使用的正常流(normal flow)进行排版 在正常流...
    这一次我觉得我行阅读 418评论 0 0
  • 单列布局水平居中水平居中 水平居中的页面布局中最为常见的一种布局形式,多出现于标题,以及内容区域的组织形式,下面介...
    Osmond_wang阅读 311评论 0 1
  • CSS布局解决方案(终结版) 前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环。在页面框架的搭建之中,又...
    杀个程序猿祭天阅读 584评论 0 2