目录
八、盒子模型——垂直外边距的折叠(重叠)(兄弟元素、父子元素)
九、行内元素的盒模型(display属性,visiblity属性)
十二、轮廓阴影和圆角(outline属性、box-shadow属性、border-radius属性)
一、文档流
文档流(normal flow)
- 网页是一个多层的结构,一层摞着一层
- 通过CSS可以分别为每一层来设置样式
- 作为用户只能看到最顶上一层
- 这些层中,最底下的一层称为文档流,文档流是网页的基础
我们所创建的元素默认都是在文档流中进行排列
文档流是一个位置,网页的最底层,所创建的元素默认都是在文档流中进行排列的
文档流与元素的关系就像地球与人的关系
- 对于我们来将元素主要有两个状态
在文档流中
不在文档流中(脱离文档流)
元素在文档流中有什么特点:
- 块元素
- 块元素会在页面中独占一行(自上向下排列)
- 默认宽度是父元素的全部(会把父元素撑满)
- 默认高度是被内容撑开(子元素)
- 行内元素
- 行内元素不会独占页面的一行,只占自身的大小
- 行内元素在页面中自左向右排列,如果一行之中不能容纳下所有的行内元素
则元素会换到第二行继续自左向右排列(书写习惯一致)
- 行内元素的默认宽度和高度都是被内容撑开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.box1{
width: 100px;
background-color: yellow;
}
.box2{
width: 100px;
background-color: red;
}
</style>
</head>
<body>
<div class="box1">我是div1</div>
<div class="box2">我是div2</div>
<span>我是span1</span>
<span>我是span2</span>
</body>
</html>
二、盒子模型
盒模型、盒子模型、框模型(box model)
- CSS将页面中的所有元素都设置为一个矩形的盒子
- 将元素设置为矩形的盒子后,对页面的布局就变成将不同的盒子摆放到不同的位置
- 每一个盒子都由以下几个部分组成:
内容区(content)
内边距(padding)
边框(border)
外边距(margin)
内容区(content),元素中的所有子元素和文本内容都在内容区中排列
内容区的大小由width 和 height 两个属性来设置
width 设置内容区的宽度
height 设置内容区的高度
三、盒子模型——边框
边框(border), 边框属于盒子边缘,边框里边属于盒子内部,出了边框都是盒子的外部
边框的大小会影响到整个盒子的大小
设置边框,需要至少三个样式:
边框的宽度 border-width 默认值,一般都是3个像素
边框的颜色 border-color 默认值,color颜色值
边框的样式 border-style 默认值,none,表示没有边框
border-width 可以用来指定四个方向的边框的宽度
值的情况:
四个值:上 右 下 左
三个值:上 左右 下
两个值:上下 左右
一个值:上下左右
除了border-width 还有一组 border-xxx-width
xxx可以是 top right bottom left 用来单独指定某一个边的宽度
border-color 用来指定边框的颜色,同样可以分别指定四个边的颜色
规则和border-width一样
border-color 也可以省略不写,如果省略了则自动使用color颜色值
border-style 指定边框的样式,规则与border-width一样,默认值是none,表示没有边框
solid 表示实线
dotted 点状虚线
dashed 虚线
double 双线
border简写属性,通过该属性可以同时设置边框所有的相关样式,并且没有顺序要求
除了border以外还有四个 border-xxx
border - top
border - right
border - bottom
border - left
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.box1{
/* width 设置内容区的宽度, height 设置内容区的高度 */
width: 200px;
height: 200px;
background-color: #bfa;
/*设置边框,需要至少三个样式:边框的宽度 border-width,边框的颜色 border-color
,边框的样式 border-style */
/* border-width: 10px;可以不写,有默认值,一般是3px */
/* border-width: 10px 20px 30px 40px;
border-width: 10px 30px 40px;
border-width: 10px 20px;
border-top-width:10px;*/
/* border-color: red;
border-style: double; */
/* border: 10px solid orange; */
/* 设置三个边框 */
/* border-top: 10px solid red;
border-left: 10px solid red;
border-bottom: 10px solid red; */
border: 10px solid red;
border-right: none;
}
</style>
</head>
<body>
<div class="box1"></div>
</body>
</html>
四、盒子模型——内边距
内边距(padding)
- 内容区和边框之间的距离是内边距
- 一共右四个方向的内边距:
padding - top
padding - right
padding - bottom
padding - left
- 内边距的设置会影响盒子的大小
- 背景颜色会延伸到内边距上
一个盒子的可见框的大小,由内容区 内边距 边框共同决定,
所以在计算盒子的大小时,需要将这三个区域加到一起计算
padding 是内边距的简写属性,可以同时指定四个方向的内边距
规则和border-width 一样
注意:如果盒子本身没有指定 width/height 属性,则此时padding 不会撑开盒子大小。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.box1{
width: 200px;
height: 200px;
background-color: #bfa;
border: 10px solid orange;
padding-top: 100px;
padding-left:100px ;
padding-bottom: 100px;
padding-right: 100px;
}
.inner{
width: 100%;
height: 100%;
background-color: yellow;
}
</style>
</head>
<body>
<div class="box1">
<div class="inner"></div>
</div>
</body>
</html>
五、盒子模型——外边距
外边距(margin)
- 外边距不会影响盒子可见框的大小
- 但是外边距会影响盒子的位置
- 一个有四个方向的外边距:
margin - top
-上外边距,设置一个正值,元素会向下移动
margin - right
- 默认情况下设置margin-right不会产生任何移动
margin - bottom
- 下外边距,设置一个正值,其下边的元素会向下移动
margin - left
- 左外边距,设置一个正值,元素会向右移动
margin 也可以设置负值,若为负值则元素会向相反的方向移动
- 元素在页面中是按照自左向右的顺序排列的,
所以默认情况下如果我们设置左和上外边距则会移动元素自身
而设置下和右外边距会移动其它元素
- margin 简写属性
margin 可以同时设置四个方向的外边距,用法与padding一样
- margin 会影响到盒子实际占用空间
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.box1{
width: 200px;
height: 200px;
background-color: #bfa;
border: 10px solid orange;
margin-top: 100px;
margin-bottom: 100px;
}
.box2{
width: 220px;
height: 220px;
background-color: yellow;
margin-top: -50px;
}
</style>
</head>
<body>
<div class="box1">
</div>
<div class="box2"></div>
</body>
</html>
六、盒子模型——水平方向的布局
元素的水平方向的布局:
元素在其父元素中水平方向的位置由以下几个属性共同决定
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 = 其父元素内容区的宽度(必须满足)
以上等式必须满足,如果相加结果使等式不成立,则称为过度约束,则等式会自动调整
- 调整的情况:
- 如果七个值中没有 auto 的情况,则浏览器会自动调整margin-right 值以使等式满足
- 这七个值中有三个值可以设置为auto:
width
margin-left
margin-right
- 如果某个值为auto,则会自动调整为auto的那个值以使等式成立
- 如果将一个宽度和一个外边距设置为auto,则宽度会调整到最大,设置为auto的外边距会自动为0
- 如果将三个值都设置为auto,则宽度最大,外边距都是0
- 如果将两个外边距设置auto,宽度为固定值,则会将外边距设置为相同的值
所以我们经常利用这个特点,来使一个元素在其父元素中水平居中
示例:width: xxx px;
margin: 0 auto;
外边距典型应用,让块级盒子水平居中,但必须满足两个条件:
1.盒子必须指定了宽度(width)。
2. 盒子左右的外边距都设置为 auto。
注意:行内元素或者行内块元素水平居中给其父元素添加 text-align:center 即可
注意:width 默认值就是auto
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.outter{
width: 800px;
height: 200px;
border: 10px solid red;
}
.inner{
width: 200px;
height: 200px;
background-color: #bfa;
margin-right: 100px;
/* 0 + 0 + 0 + 200 + 0 + 0 + 0 = 800 不相等
以上等式必须满足,,如果相加结果使等式不成立,则称为过度约束,则等式会自动调整
0 + 0 + 0 + 200 + 0 + 0 + 600 = 800 */
}
</style>
</head>
<body>
<div class="outter">
<div class="inner"></div>
</div>
</body>
</html>
七、盒子模型——垂直方向的布局(overflow属性)
默认情况下,父元素的高度被内容撑开
子元素是在父元素的内容区中排列的
如果子元素的大小超过了父元素,则子元素会从父元素中溢出,
使用 overflow 属性来设置父元素如何处理溢出的子元素(overflow设置在父元素上)
可选值:
visible 默认值 子元素会从父元素中溢出,在父元素外部的位置显示
hidden 溢出的内容将会被裁剪不会显示
scroll 生成两个滚动条,通过滚动条来查看完整的内容
auto 根据需要生成滚动条
overflow-x
overflow-y
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.outter{
background-color: #bfa;
}
.inner{
width: 100px;
background-color: yellow;
height: 200px;
margin-bottom: 100px;
}
.box1{
width: 200px;
height: 200px;
background-color: #bfa;
overflow: auto;
}
.box2{
width: 100px;
height: 400px;
background-color: orange;
}
</style>
</head>
<body>
<!-- <div class="outter">
<div class="inner"></div>
<div class="inner"></div>
</div> -->
<div class="box1">
<div class="box2"></div>
</div>
</body>
</html>
八、盒子模型——垂直外边距的折叠(重叠)(兄弟元素、父子元素)
垂直外边距的重叠(折叠)
- 相邻的垂直方向外边距会发生重叠现象
- 兄弟元素
- 兄弟元素间的相邻垂直外边距会取两者之间的较大值(两者都是正值)
- 特殊情况:
如果相邻外边距一正一负,则取两者的和
如果相邻外边距都是负值,则取两者中绝对值较大的
- 兄弟元素之间的外边距的重叠,对于开发是有利的,所以我们不需要进行处理
- 父子元素
- 父子元素之间的相邻外边距,子元素的会传递给父元素(上外边距)
- 父子外边距的折叠会影响到页面的布局,必须要进行处理
目前处理方式:不用外边距(使用padding,注意盒子大小);使用特殊方式将外边距进行隔开(如使用border,同样注意盒子大小)
兄弟元素的垂直外边距折叠:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.box1,.box2{
width: 200px;
height: 200px;
}
.box1{
background-color: #bfa;
margin-bottom: 100px;
}
.box2{
background-color: orange;
margin-top: -100px;
}
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>
</html>
父子元素垂直外边距的折叠:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.box3{
width: 200px;
height: 199px;
background-color: #bfa;
/* padding-top: 100px; */
border-top: solid 1px red;
}
.box4{
width: 100px;
height: 100px;
background-color: orange;
margin-top: 99px;
}
</style>
</head>
<body>
<div class="box3">
<div class="box4"></div>
</div>
</body>
</html>
九、行内元素的盒模型(display属性,visiblity属性)
行内元素的盒模型
- 行内元素不支持设置宽度和高度
- 行内元素可以设置padding,但是垂直方向padding不会影响页面的布局
- 行内元素可以设置border,垂直方向的border不会影响页面的布局
- 行内元素可以设置margin,垂直方向的margin不会影响布局,且水平方向的margin不会折叠
display 用来设置元素显示的类型
可选值:
inline 将元素设置为行内元素
block 将元素设置为块元素
inline-block 将元素设置为行内块元素
行内块,既可以设置宽度和高度又不会独占一行
若两个相邻行内块在页面显示时可能会出现间隙,因为行内元素换行会被作为一个空格
table 将元素设置为一个表格
none 元素不在页面中显示,不会占据页面的位置
visibility 用来设置元素的显示状态
可选值:
visible 默认值,元素在页面中正常显示
hidden 元素在页面中隐藏不显示,但是依然占据页面的位置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.s1{
background-color: yellow;
width: 100px;
height: 100px;
/* padding: 100px;
border: 10px red solid;
margin: 100px; */
}
.box1{
width: 200px;
height: 200px;
background-color: #bfa;
}
a{
background-color: orange;
width: 100px;
height: 100px;
/* display: none; */
visibility: hidden;
}
</style>
</head>
<body>
<!-- 这样书写,当a被设置为display:inline-block时,会出现间隙 -->
<a href="javascript:;">超链接</a>
<a href="javascript:;">超链接</a>
<!-- 下面这样便不会出现间隙 -->
<a href="javascript:;">超链接</a><a href="javascript:;">超链接</a>
<span class="s1">我是span</span>
<div class="box1"></div>
</body>
</html>
十、浏览器的默认样式
默认样式:
-通常情况下,浏览器都会为元素设置一些默认样式
- 默认样式的存在会影响到页面的布局,
通常情况下编写网页时必须要去除浏览器的默认样式(PC端)
list-style 属性,设置项目符号的风格,如列表的符号,属性值为none时表示没有符号
直接利用通配选择器简单将所有的margin和padding设置为0去去除默认样式(适用临时练习)
<style>
*{
margin: 0;
padding: 0;
}
</style>
或者引入重置样式表去除浏览器默认样式
重置样式表,专门用来对浏览器的样式进行重置的
reset.css 直接去除了浏览器的默认样式(老师更推荐)
normalize.css 为默认样式进行了统一
reset.css 重置样式表 可以去CSS Tools: Reset CSS (meyerweb.com) 进行复制,创建一个css文件粘贴进去即可
十一、盒子的大小(box-sizing属性)
默认情况下,盒子可见框的大小由内容区、内边距和边框共同决定
box-sizing 属性 用来设置盒子尺寸的计算方式(设置width 和 height 的作用)
可选值:
content-box 默认值,宽度和高度用来设置内容区的大小
border-box 宽度和高度用来设置整个盒子可见框的大小
width 和 height 指的是内容区 和 内边距 和 边框的总大小
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.box1{
width: 100px;
height: 100px;
background-color: #bfa;
padding: 10px;
border: 10px red solid;
/* box-sizing: content-box; */
box-sizing: border-box;
}
</style>
</head>
<body>
<div class="box1"></div>
</body>
</html>
calc 函数(了解)
calc() 此CSS函数让你在声明CSS属性值时执行一些计算。
width: calc(100% - 80px)
括号里面可以使用 + 、-、*、/ 来进行计算。
在CSS函数中,运算符左右必须空格!否则用不了
<style>
.father {
width: 300px;
height: 200px;
background-color: pink;
}
.son {
/* 运算符左右必须空格!否则用不了 */
width: calc(100% - 30px);
height: 100px;
background-color: #bfa;
}
</style>
</head>
<body>
<!-- 需求:子盒子宽度永远比父盒子小 30 像素 -->
<div class="father">
<div class="son"></div>
</div>
</body>
十二、轮廓阴影和圆角(outline属性、box-shadow属性、border-radius属性)
outline 用来设置元素的轮廓线,用法和border一模一样
轮廓和边框不同的点,就是轮廓不会影响可见框的大小,不会影响页面布局
box-shadow 用来设置元素的阴影效果,阴影不会影响页面布局
第一个值 水平偏移量 设置阴影的水平位置 正值向右移动,负值向左移动
第二个值 垂直偏移量 设置阴影的垂直位置 正值向下移动,负值向上移动
第三个值 阴影的模糊半径 值越大越模糊
第四个值 阴影的颜色,一般使用 rgba ,能指定透明度
默认情况下,阴影与元素一样大,在元素的正下方,为了能看见阴影,需指定两个偏移量
注意:盒子阴影不占用空间,不会影响其他盒子排列。
border-radius 属性 用来设置圆角,圆角设置的圆的半径大小
可以分别指定四个角的圆角
四个值 左上 右上 右下 左下(顺时针)
三个值 左上 右上/左下 右下
两个值 左上/右下 右上/左下
一个值 为四个角的半径大小均为该值
当想用椭圆时,水平方向和垂直方向的半径用斜杠 / 隔开
将元素设置为圆形,盒子为正方形: border-radius:50%
border-top-left-radius 设置左上角的圆角,当给一个属性值时,为圆角
给两个属性值时为椭圆,且第一个值为水平方向的圆的半径大小,第二个值为垂直方向的
border-top-right-radius
border-bottom-left-radius
border-bottom-right-radius
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.box1{
width: 200px;
height: 200px;
background-color: #bfa;
/* border: 10px red solid; */
/* outline: 10px red solid; */
box-shadow:10px 10px 50px rgba(0,0,0,0.5) ;
}
.box2{
width: 200px;
height: 200px;
background-color: orange;
border-radius: 10px / 100px 20px 30px;
/* 将元素设置为圆形 */
border-radius:50%
/* border-top-left-radius:50px 100px;
border-top-right-radius:50px 100px ;
border-bottom-left-radius:100px 50px ;
border-bottom-right-radius: 20px; */
}
</style>
</head>
<body>
<div class="box1"></div>
<span>hello</span>
<div class="box2"></div>
</body>
</html>
疑难解惑:
1. 布局为啥用不同的盒子,我只想用div?
标签都是有语义的,合理的地方用合理的标签。比如产品标题就用 h,大量文字段落就用 p。
2. 为啥用那么多类名?
类名就是给每个盒子起了一个名字,可以更好的找到这个盒子,选取盒子更容易,后期维护也方便。
3. 到底用 margin 还是 padding ?
大部分情况两个可以混用,两者各有优缺点,但是根据实际情况,总有更简单的方法实现。
4. 自己做没思路?
布局有很多实现方式,可以开始模仿老师的写法,然后再做出自己的风格。