说到 CSS 布局这块的内容,首当其冲的就是咱们的盒模型宽度计算问题,在开始咱们的问题以前,咱们首先要搞懂这些概念:css
content
): 也就是实实在在要展示的内容,好比 P 标签里面的文字。在没有设置box-sizing: border-box
以前咱们能够把它的宽度理解为就是width
的值,不包括padding
和border
padding
): 是内容与边框内部之间的距离border
): 边框也能够设置宽度margin
): 盒模型的边框外部与其余盒模型边框外部之间的距离了解了这些,咱们再来看下面的几个进阶概念:html
offsetWidth
: 指的是盒模型的边框(border
) + 内边距(padding
) + 内容的宽度(width
)clientWidth
: 指的是盒模型的内边距(padding
) + 内容的宽度(width
)scrollWidth
: 若是内容超出边框,须要有滚动条,那么scrollWidth
获取的是整个文档的内容(而clientWidth
获取的只是可见部分的宽度)OK,咱们来看一道简单的计算题浏览器
<style> #main { width: 100px; border: 1px solid #ccc; padding: 10px } </style> //offsetWidth => 122px
很明显,咱们想要的结果offsetWidth
就等于 100+20+2=122px。那么,咱们若是想要offsetWidth
=100px,代码该怎么写呢?很简单,加入一句box-sizing: border-box
就能够了。app
咱们先来看一段代码:布局
/*css*/ p{ margin-top: 10px; margin-bottom: 15px; } /*HTML*/ <p>小宏</p> <p></p> <p></p> <p></p> <p>小宏</p>
运行出来的效果是这样的:字体
很明显,并无像咱们想象中的,两者之间应该会有很大的距离。因此咱们不可贵出:相邻元素的margin-top
和margin-bottom
是会重叠的,以数值大的为主。空白内容的块级标签也是会重叠的,只不过他们的margin
咱们能够忽略不计。flex
咱们直接把知识点摆出来:spa
margin-top
、margin-left
设置负值,元素会分别向上、向左移动相应的长度margin-right
设置负值,当前元素的右侧元素左移相应的长度,自身不受影响。若是右边没有元素,自身也不会受到影响margin-bottom
设置负值,当前元素的下侧元素上移相应的长度,自身不受影响。若是下边没有元素,自身也不会受到影响咱们来看看效果:3d
何谓 BFC 呢?大部分都将其解析为块级格式化上下文,是 Web 页面中盒模型布局的 CSS 渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器。其内部元素的渲染不会影响到边界之外的元素。咱们主要从如下几个方面来理解它。code
阻止元素被浮动元素覆盖
两栏布局,左边固定宽度,右边不设宽,随浏览器自适应
/*html*/ <div class="column"></div> <div class="column"></div> /*css*/ .column:nth-of-type(1) { float: left; width: 200px; height: 300px; margin-right: 10px; background-color: red; } .column:nth-of-type(2) { overflow: hidden;/*建立BFC */ height: 300px; background-color: purple; }
阻止相邻元素的 margin 合并
咱们在 margin 负值的问题中提到过合并问题。咱们能够经过设置 BFC 来解决:
/*html*/ <div class="container"> <div class="box1"></div> <div class="box2"></div>//会出现合并的状况 <div class="wrapper"> <div class="box1"></div>//让两者其一处于另外一个BFC中 </div> <div class="box2"></div> </div> /*css*/ .container { overflow: hidden; width: 100px; height: 100px; background-color: red; } .wrapper { overflow: hidden;//设置BFC } .box1 { height: 20px; margin: 10px 0; background-color: green; } .box2 { height: 20px; margin: 20px 0;//未设置BFC,以大的为准,两者距离本为20px background-color: green; }
阻止字体环绕
很简单,给咱们的 p 标签设置 BFC 就行了
float 是咱们 CSS 中很是经常使用的属性了,咱们在开发中常常用它来实现三栏布局。主要特色是:
1.中间一栏最早加载和渲染 2.两侧内容固定,中间内容随宽度自适应 3.主要用于 PC
圣杯布局
圣杯布局的方法实现主要是针对容器 div 的padding
这块来下手的,咱们整理一下实现步骤:
padding-left
设置为 left 栏的宽度,padding-right
设置为 right 栏的宽度float:left
属性width:100%
position:relative
;right:[自身宽度]
;margin-left:-100%
margin-right:-[自身宽度]
; 6.注意:要给body
设置min-width
属性,且值要大于或等于2*left的width+1*right的width
,否则中间会被挤上去这是 HTML 方面的代码
<div class="container"> <div class="center">中间</div> <div class="left">左</div> <div class="right">右</div> </div>
双飞翼布局
双飞翼布局的方法实现主要是针对margin
这块来下手的,相比于圣杯布局,理解起来也方便一些,只是在 HTML 代码方面咱们要与圣杯布局的稍做区别:
<div class="main-container col"> <div class="main">中间(将中间包裹在div中,方便留白)</div> </div> <div class="left col">左</div> <div class="right col">右</div>
咱们整理一下实现步骤:
float: left
属性,即上面的col
main-container
处留白。给main
框设置margin: 0 left的宽度 0 right的宽度
。left
框设置margin-left: -100%
right
框设置margin-left: -[自身宽度]
body
设置min-width
属性,且值要大于或等于left的width+right的width
,否则中间会被挤上去回到咱们的圣杯布局,咱们总以为好像缺点什么要素。没错,这三栏就像咱们的网页中主要内容,咱们还应该要有咱们的头部和尾部布局。因而咱们理所固然的把上面的 HTML 代码改为了下面这样:
<div class="header">头部内容</div> <div class="container"> <div class="center">中间</div> <div class="left">左</div> <div class="right">右</div> </div> <div class="footer">底部内容</div>
可渲染出的效果,并非很理想
能够看到,咱们的底部内容跑到了右边,而且被 container 框压住了,这是由于有 float 的缘由。固然,咱们给 footer 一个clear:both
就可让他下去了,这里呢,咱们不许备操做 footer,咱们尝试着本身写一个 clearFix 来实现这个功能。
/*html*/ <div class="container clearFix"> <div class="center">中间</div> <div class="left">左</div> <div class="right">右</div> </div> /*css*/ .clearFix:after { content: ''; display: table; clear: both; }
flexBox 布局,指的是在display: flex
下的布局操做。首先呢,咱们要记住一些咱们常见的有关 flex 的 css 属性:
flex-direction
定义容器要在哪一个方向上堆叠 flex 项目。有四个属性值,分别为:
column
[设置垂直堆叠 flex 项目(从上到下)]column-reverse
[垂直堆叠 flex 项目(从下到上)]row
[水平堆叠 flex 项目(从左到右)]row-reverse
[水平堆叠 flex 项目(从右到左)]justify-content
用于对齐 flex 项目。有五个属性值,分别为:
center
[将 flex 项目在容器的中心对齐]flex-start
[将 flex 项目在容器的开头对齐(默认)]flex-end
[将 flex 项目在容器的末尾对齐]space-around
[显示行以前、之间和以后带有空格的 flex 项目]space-between
[显示行之间带有空格的 flex 项目]align-items
用于垂直对齐 flex 项目。也有五个属性值,分别为:
center
[将 flex 项目在容器的中心对齐]flex-start
[将 flex 项目在容器的顶部对齐]flex-end
[将 flex 项目在容器的底部对齐]stretch
[拉伸 flex 项目填充容器]space-between
[使 flex 项目基线对齐]flex-wrap
规定是否应该对 flex 项目换行.有三个属性值,分别为:
wrap
[规定 flex 项目将在必要时进行换行]nowrap
[规定 flex 项目不要换行(默认)]wrap-reverse
[规定 flex 项目将在必要时以相反的顺序进行换行]align-self
这个属性其实是重写了align-items
,咱们主要来用它实现居中对齐,所以,咱们记住center
这一经常使用属性值就行了,其余的属性值和align-items
差很少。也能够理解为align-self: center;
=justify-content: center;align-items: center;
ok,咱们来一个简单的案例:色子。为了方便你们看,咱们只实现点数为3的这一面
/*主要代码*/ .container{ display: flex; justify-content: space-between;/*容器*/ } .item:nth-child(2){ align-self: center;/*第二个点*/ } .item:nth-child(3){ align-self: flex-end;/*第三个点*/ }
以上就是css常考的一些重要知识点,我也会在后面作出适当的更新补充。下次见!