CSS布局学习

以前对CSS布局有些接触,但是因为没有系统的学习过,导致每次在调整和修改起来都觉得比较困难,为了解决这个难啃的骨头花了两天时间系统的把目前比较主流的CSS布局方式系统的看了一遍,解决了之前的一些模糊的知其然不知其所以然的问题,在此记录供后续参考。

一、盒模型(Box Model)

所有HTML元素可以看作盒子,CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:

  • margin:边距/外边距,清除边框外的区域,外边距是透明的;
  • border:边框,围绕在内边距和内容外的边框;
  • padding:填充/内边距,清除内容周围的区域,内边距是透明的;
  • content:内容,盒子的内容,显示文本和图像。

下面的图片展示了盒模型:

盒模型示意图

元素的高度和宽度

通过CSS设置元素的高度和宽度,实际设置的是content(内容)部分的高度和宽度而不是整个盒子的宽度和高度,而整个盒子的宽度是:(内容宽度 +padding宽度 + border宽度 + margin宽度)之和,如下图:

默认情况下width设置的区间

这样我们改四个中的其中一个,都会导致盒子宽度的改变,这对我们来说不友好,为了消除这种差异,CSS新增了box-sizing属性,现在通过CSS设置的宽度300px是content+padding+border,如下图:

设置之后width表示的区间

想要页面上所有的元素在高度和宽度的设置上都有统一的表现,所以建议为系统写css时候,第一个样式是:

*{
  margin:0;
  padding:0;
  -webkit-box-sizing: border-box;       /*兼容webkit内核浏览器,如:Chrome,Safari等*/
     -moz-box-sizing: border-box;       /*兼容火狐浏览器*/
          box-sizing: border-box;
}

二、display属性

display 是CSS中最重要的用于控制布局的属性,决定元素属于那种盒子(指定元素的显示类型)。每个元素都有一个默认的 display 值,这与元素的类型有关。对于大多数元素它们的默认值通常是 blockinline

块级元素(block)

一般是其他元素的容器,可容纳内联元素和其他块状元素,块状元素排斥其他元素与其位于同一行,宽度(width)高度(height)起作用。常见块状元素为divph1li

内联元素(inline)

内联元素只能容纳文本或者其他内联元素,它允许其他内联元素与其位于同一行,其宽度(width)和高度(height)只与其包含的内容有关,通过CSS设置高度和宽度不起作用。常见内联元素为aspan

可以通过设置display属性让块级元素和内联元素相互转换,如:

li{
  display:inline;       /*将内联元素设置为块级元素*/
}

span{
  display:block;        /*将块级元素设置为内联元素*/
}

隐藏元素(none)

一些特殊元素的默认 display 值就是none,如:script

隐藏一个元素可以通过display:none,或visibility:hidden。但是请注意,这两种方法会产生不同的结果:

  • 通过visibility:hidden隐藏的元素仍需占用与未隐藏之前一样的空间,也就是说,该元素虽然被隐藏了,但仍然会影响布局;
  • display:none,不会占据它本来应该占据的空间,不会影响布局。

块级内联元素(inline-block)

将对象呈递为内联对象,但是对象的内容作为块对象呈递。旁边的内联对象会被呈递在同一行内,允许空格。准确地说,应用此特性的元素呈现为内联对象,周围内联元素保持在同一行,但保留设置宽度和高度地块元素的属性。


三、position属性

display决定了盒子种类,position就用来确定盒子的位置。

标准文档流(static)

static 是positon属性的默认值,指按照文档至上而下的标准文档流,被 position: static 修饰的元素不会受到top, bottom, left, right影响。

绝对定位(fixed)

元素的位置相对于浏览器窗口固定,配合top、right、bottom、left进行定位,脱离标准文档流,不会受到父元素overflow:hidden影响,即使窗口是滚动的它也不会移动,常用示例:二维码、广告的悬浮;

绝对定位(absolute)

绝对定位的元素的位置相对于最近的已定位(position属性值不为static)父元素,如果元素没有已定位的父元素,那么它的位置相对于body,配合top、right、bottom、left进行定位,脱离标准文档流,会受到父元素overflow:hidden影响,并且它会随着页面滚动而移动。

相对定位(relative)

默认参照父级的原始点为原始点,配合top、right、bottom、left进行定位,当父级内有padding等CSS属性时,当前级的原始点则参照父级内容区的原始点进行定位。


四、float属性

元素的水平方向浮动,意味着元素只能左右移动而不能上下移动,一个浮动元素会尽量向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止,浮动元素之后的元素将围绕它,浮动元素之前的元素将不会受到影响,其属性值如下:

  • left(向左浮动)
  • rigth(向右浮动)
  • top(向上浮动)
  • bottom(向下浮动)

清除浮动(clean)

使用浮动后会影响到后面的元素所以需要及时的清除浮动,而且会造成父级元素高度塌陷。

.clean{
  clean:left;   /*清除左浮动*/
  clean:right;  /*清除右浮动*/
  clean:top;    /*清除上浮动*/
  clean:bottom; /*清除下浮动*/
  clean:both;   /*清除所有浮动*/
}
/*清除浮动并防止父级元素高度塌陷*/
.clearfix:before, .clearfix:after {
    content: '\0020';
    display: block;
    overflow: hidden;
    visibility: hidden;
    width: 0; height: 0;
}
.clearfix:after { clear: both }
.clearfix { *zoom: 1 }

五、响应式布局

使用媒体查询 (@media) 可以针对不同的媒体类型定义不同的样式,达到响应式布局的目的,在不同尺寸的设备上都有完美的展示。

@media screen and (min-width:600px) {
  nav {
    float: left;
    width: 25%;
  }
  section {
    margin-left: 25%;
  }
}

@media screen and (max-width:599px) {
  nav li {
    display: inline;
  }
}

同时可以针对不同的媒体引用不同的 stylesheets

<link media="screen and (max-device-width:299px)" rel="stylesheet" href="small.css" />
<link media="screen and (min-device-width:300px) and (max-device-width:900px)" rel="stylesheet" href="middle.css" />
<link media="screen and (min-device-width:901px)" rel="stylesheet" href="big.css" />

六、弹性布局(Flex)

Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。

采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"。容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。图示如下:

flex布局基础说明

任何一个容器都可以指定为flex布局

.box{
  display: -webkit-flex;
  display: flex;
}

行内元素也可以使用flex布局

.box{
  display: -webkit-inline-flex;
  display:inline-flex;
}

** 注意:** 设为Flex布局以后,子元素的floatclearvertical-align属性将失效,如果元素不是弹性盒模型对象的子元素,则 flex 属性不起作用。

下面了解一下弹性布局的威力:

.container {
  display: -webkit-flex;
  display: flex;
}
.initial {
  -webkit-flex: initial;
          flex: initial;
  width: 200px;
  min-width: 100px;
}
.none {
  -webkit-flex: none;
          flex: none;
  width: 200px;
}
.flex1 {
  -webkit-flex: 1;
          flex: 1;
}
.flex2 {
  -webkit-flex: 2;
          flex: 2;
}
flex1布局设置宽度

实现棘手的垂直居中:

.vertical-container {
  height: 300px;
  display: -webkit-flex;
  display:         flex;            /*设置容器为flex布局*/
  -webkit-align-items: center;      /*设置交叉轴方向上的对齐方式为居中*/
          align-items: center;      
  -webkit-justify-content: center;  /*设置主轴方向上的对齐方式为居中*/
          justify-content: center;
}
flex2布局实现垂直居中

对使用flex布局的容器的属性:

  • flex-direction 定义主轴的方向(即项目的排列方向)
  • flex-wrap 定义当一条轴线排不下时换行的方式
  • flex-flowflex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
  • justify-content 定义了项目在主轴上的对齐方式。
  • align-items 定义项目在交叉轴上如何对齐。
  • align-content 定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

和使用flex布局容器里子元素的属性:

  • order 定义项目的排列顺序。数值越小,排列越靠前,默认为0。
  • flex-grow 定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
  • flex-shrink 定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
  • flex-basis 定义了在分配多余空间之前,项目占据的主轴空间(main size),也可以设为跟widthheight属性一样的值(比如350px),则项目将占据固定空间
  • flex 是 flex-grow、flex-shrink 和 flex-basis 属性的简写属性,默认值为0 1 auto后两个属性可选。该属性有三个快捷值:auto (1 1 auto) 、 none (0 0 auto)和initial(0 1 auto)。
  • align-self 允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性,默认值为auto,表示继承父元素的align-items属性。

因flex布局涉及到的属性比较多在此只做属性描述待深入学习后再做总结。

七、Grid布局

CSS Grid现在已经被W3C纳入到CSS3的一个布局模块当中,但由于其目前仅在IE10+上支持,而且也仅支持部分属性,目前各浏览器对其支持程度不一致,致使无法全面使用,就算是学习做一些测试示例都还需要做一些设置,所以暂时不做学习,等后续标准规范之后再学习总结。

不过“大漠”在W3cplus中已经有了详细的教程,感兴趣的可以提前了解学习,链接如下:

CSS Grid布局学习

八、参考资料

学习CSS布局

Flex 布局教程:语法篇

css知多少(7)——盒子模型

css布局-盒模型,定位和浮动

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,733评论 0 2
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,304评论 0 11
  • 一般而言,一个静态web页面的呈现需要通过html和css配合实现。html相当于页面的骨架,规定了文档的结构。c...
    夏木与晴空阅读 1,058评论 0 3
  • 先在本地新建security.json文件,并添加如下内容: { "authentication":{ "clas...
    杨沁瑜dad阅读 832评论 2 0