CSS(三)-- 布局(盒子模型)
1.文档流(normal flow)
- 网页是一个多层的结构,一层叠着一层
- 通过CSS可以分别为每一层来设置样式,作为用户只能看到最顶上一层
- 这些层中,最底下的一层称为文档流。文档流是网页的基础,我们所创建的元素默认都是在文档流中进行排列
- 对于我们来说元素主要有两个状态
- 在文档流中
- 不再文档流中(脱离地球)
元素在文档流中有何特点
块元素
- 块元素会在页面中独占一行
- 默认宽度是父元素的全部(会把父元素撑满)
- 默认高度是被内容撑开
行内元素
- 行内元素不会独占页面的一行,只占自身的大小
- 行内元素在页面中从左向右水平排列,当一行中不能容纳所有的行内元素,则元素会换到第三行继续自左向右排列
- 行内元素的默认宽度和高度都是被内容撑开
2.盒子模型(盒模型、框模型、box model)
- CSS将页面中所有的元素都设置为一个矩形的盒子
- 将元素设置为矩形的盒子后,对页面的布局就变成将不同的盒子摆放到不同的位置
2.1每个盒子都由以下几个部分组成
-
内容区(content):元素中的所有的子元素和文本内容都在内容区中排列
- 内容区的大小由width和height两个属性来设置
- width设置内容区的宽度(默认值为auto)
- height设置内容区的高度
-
内边距(padding)
-
边框(border):边框属于盒子边缘,是盒子外部和内部的分界
- 要设置边框至少要设置三个样式
- 边框的宽度:border-width(边框的宽度会影响整个盒子的大小)
- 边框的颜色:border-color
- 边框的样式:border-style
border-width:10px;
border-color:red;
border-style:solid;//实现的边界
外边距(margin):当前盒子和其他盒子的距离
2.2border(边框)
border-width
- border-width可以不写,会有一个默认值,一般为2-3个像素
- border-width可以用来指定分别指定四个方向的border宽度
border-width: 10px,20px,30px,40px;//上,右,下,左
border-width:10px,20px,30px;//如果不写左边的值,左边会用右边的值;上,左右,下
border-width: 10px,20px;//同理,如果不写下边的值,会复用上边的值; 上下,左右
- 除了border-width还有一组 :border-xxx-width,用来单独指定某一个宽度
- xxx可以是top,right,bottom,left
- 同理也有border-xxx-color,border-xxx-style
border-color
- border-color用来指定边框的颜色,同样可以分别指定四个边的边框
规则和border-width一样 - border-color也可以省略不写,如果省略了则自动使用color的颜色值
border-style
- 指定边框的样式
- solid 表示实线
- dotted 点状虚线
- dashed 块状虚线
- double 双线
- 和border-width一样也可以分别指定四个边框的style
- border-style的默认值是null
border的简写属性(常用)
- 通过该属性可以同时设置边框所有的相关样式,并且没有顺序要求
border:10px orange solid;//没有先后顺序
- 除了border以外还有四个border-xxx
border-top(left,right,bottom)
2.3padding(内边距)
内容区和边框之间的距离
- 一共有四个方向的内边距
- padding-top
- padding-right
- padding-bottom
- padding-left
- 内边距的设置会影响到盒子的大小
- 背景颜色会延伸到内边距上
- 一个盒子的可见框的大小,有内容区、内边距、和边框共同决定,所以在计算盒子大小时,需要将则三个区域相加
- padding:内边距的简写属性,可以同时制定四个方向的内边距,规则和border-width一样
padding: 10px 20px 30px 40px;//上、右、下、左
2.4margin(外边距)
外边距不会影响盒子可见框的大小,但会影响盒子的位置
- 四个方向的外边距
- margin-top;设置一个正值,元素会向下移动
- margin-right
- 默认情况下设置margin-right不会有任何效果
- margin-bottom;设置一个正值,其下边的元素会向下移动
- margin-left;设置一个正值元素会向右移动
- margin也可以设置负值,如果是负值元素会向相反的方向移动
- 元素在页面中是自左向右排列的,所以在默认情况下我们设置左和上外边距会移动元素自身,而设置下和右外边距会移动其他元素
- margin的简写属性,可以同时设置四个方向的外边距,用法和padding一样
- margin会影响到实际占用空间的大小
2.5盒子的水平布局
元素在其父元素中水平方向的位置由以下几个属性共同决定
margin-left
border-left
padding-left
width
padding-right
border-right
margin-right
一个元素在其父元素中,水平布局必须要满足以下的等式
(margin-left)+(border-left)+(padding-left)+width+(padding-right)+(border-right)+(margin-right) = 其父元素内容区的宽度
(必须满足)
0+0+0+200+0+0+0 = 800
-
以上等式必须成立,如果相加结果使等式不成立,则称为过渡约束,则等式会自动调整模型,如果则七个值中没有为auto的情况,则浏览器会自动调整margin-right值使等式满足
自动调整为:0+0+0+200+0+0+600 = 800 -
这七个值中有三个值能设置为auto
width(默认为auto)
margin-left
margin-right- 如果某个值为auto,则会自动调整为auto的那个值以使等式成立
200+0+0+auto+0+0+200 = 800 auto=400 并且居中
0+0+0+auto+0+0+200 = 800 auto=600
- 如果将一个宽度和一个外边看设置为auto,则宽度会调整到最大,设置为auto的外边后会自动为0
- 如果将三个值都设置为auto,则其他都为0,width最大
- 如果将两个外边距设置为auto,宽度为固定值,则会将外边距设置为相同的值
auto+0+0+200+0+0+auto = 800 auto=300
所以我们经常利用这个特点来使一个元素在其父元素中水平居中
示例:
width:xxxpx;
margin:0 auto;
2.6垂直方向的布局
2.6.1 overflow处理溢出的子元素
如果子元素的大小超过了父元素,则子元素会从父元素中溢出
使用overflow属性来设置溢出处理
-
可选项
- visible(默认值):子元素会从父元素中溢出,在父元素外部的位置显示
- hidden:溢出内容将会被裁剪,不会显示
- scroll:生成垂直和水平的滚动条,通过滚动条查看完整的内容
- auto:根据需要生成滚动条(自适应生成滚动条)
-
overflow-x:处理水平方向的滚动条
-
overflow-y:处理垂直方向的滚动条
元素居中的方法
方法一使一个元素在其父元素中水平居中
width:xxxpx;
margin:0 auto;
2.7 外边距的折叠
垂直外边距的重叠(折叠)
- 相邻的垂直方向外边距会发生重叠现象
兄弟间的相邻垂直外边距
- 兄弟间的相邻垂直外边距,会取两者之间的最大值
- 特殊情况:如果相邻的外边距一正一负,则取两者的和
- 兄弟元素之间的外边距的重叠,对于开发时有利的,所以我们不需要进行处理
父子间相邻外边距
- 子元素的会传递给父元素(上外边距)
- 父子外边距的折叠会影响到页面的布局,必须要进行处理
解决方法
- 方法一:改变父元素的padding
给box1加一个100的padding-top
.box1{
width: 200px;
height: 200px;
background-color: #bfa;
padding-top: 100px;
}
.box2{
width: 100px;
height:100px;
background- color:orange;
}
- 方法二
为box1添加一个border,让子元素(box2)和父元素(box1)有了相对的参照物
.box1{
width: 200px;
height: 199px;
background-color: #bfa;
border-top:1px #bfa solid;
}
.box2{
width: 100px;
height:100px;
background- color:orange;
margin-top:99px;
}
2.8 行内元素的盒模型
- 行内元素不支持设置高度(height)和宽度(width)
- 行内元素可以设置padding,并且垂直方向的padding不会影响页面的布局
- 行内元素的padding不针对padding-top,
- 行内元素可以设置border,垂直方向的border不会影响页面的布局
- 行内元素可以设置margin,垂直方向的margin不会影响页面的布局
- 水平方向不会取和,而是相加
2.9盒模型的显示
display行内元素和块元素的相互转换
可选值:
- inline: 将元素设置为行内元素
- block:将元素设置为块元素
- inline block:将元素设置为行内块元素(尽量不用)
- 特点:既可以设置宽度和高度又不会独占一行
- table:将元素设置为一个表格
- none:元素不在页面中显示(隐藏元素)
visibility:用来设置元素的显示状态
- visible(默认值):元素在页面中正常显示
- hidden:元素在页面中隐藏,不显示(但是位置大小占地面积依然会保留)
- display:none和visibility:hidden的区别:visibility会保留所在位置
2.10浏览器的默认样式
通常情况浏览器都会为元素设置一些默认样式
- 默认样式的存在会影响到页面的布局,通常情况下,编写网页时必须要去除浏览器的默认样式
- div和li没有默认样式
- 由于不止p和body标签有默认样式,而依次改动很麻烦,可以使用别人写好的css代码进行去除
- reset.css:直接去除浏览器的所有默认样式
- normalize.css:对默认样式进行了自定义的统一
(具体两个文件看之前文章的百度网盘资料链接下载即可)
list-style(设置列表的样式):none表示没有
2.11 盒子的大小
默认情况下,盒子可见框的大小由内容区、内边距和边框共同决定
box-sizing用来设置盒子尺寸的计算方式(设置width和height的作用)
- 可选值
- content-box(默认值),宽度和高度用来设置内容区的大小
- border- box:宽度和高度用来设置整个盒子可见框的大小,width和height指的是内容区、内边距、边框的总大小
2.12 轮廓阴影和圆角
outline轮廓
用来设置元素的轮廓线,用法和border一样
轮廓和边框不同的点,就是轮廓不会影响到可见框的大小(不回影响到页面的布局)
box-shadow阴影
用来设置元素的阴影效果
- 默认阴影在元素的正下方
- 不影响布局
- box-shadow: 20px 20px 10px black;
- 20px:水平偏移量,设置阴影的水平位置 正值向右移动 负值向左移动
- 20px:垂直偏移量,设置阴影的水平位置 正值向下移动 负值向上移动
- 10px:阴影的模糊半径,值越大阴影越模糊
- black:阴影的颜色
border-radius圆角
- border-top-left-radius;
- border-top-right-radius;
- border-bottom-left-radius;
- border-bottom-right-radius;
不仅可以画圆角还可以画椭圆角- 可选值
border-top-left-radius:50px 100px;- 50px:水平方向的半径
- 100px:垂直方向的半径
- 可选值
border-top-left-radius:50px 100px;
对于border-radius
- 可以分别指定四个角的圆角
可选值1
- border-radius:10px 20px 30px 40px;
- 10px:左上方
- 20px:右上方
- 30px:右下方
- 40px:左下方
- 参数个数
- 四个值:左上 右上 右下 左下
- 三个值:左上 右上/左下 右下
- 两个值:左上/右下 右上/左下
border-radius:10px 20px 30px 40px;
可选值2
- border-radius:20px / 40px;
设置横向和纵向的半径
可选值3(圆形)
border-radius:50%
3.一些CSS属性
text-decoration(设置超链接样式)
none:去除下划线
font-weight(文字的粗细)
bold:加粗
display(切换元素的类型)
inline:设置为行内元素
block:设置为块元素
inline-block:设置为行内块元素
line-height(设置文本的高度)
- 如果等于父元素的height,则文本将会居中
box-sizing: 盒子尺寸的计算方式
box-sizing用来设置盒子尺寸的计算方式(设置width和height的作用)
- 可选值
- content-box(默认值),宽度和高度用来设置内容区的大小
- border- box:宽度和高度用来设置整个盒子可见框的大小,width和height指的是内容区、内边距、边框的总大小