1.CSS是什么
层叠样式表
样式:文字大小、背景颜色、元素宽高
层叠:一层层”叠“上去
2.样式位置
2.1行内样式
写在标签的style属性中,又称内联样式
<div style="color:red;font-size:17px">
</div>
2.2 内部样式
<head>
<style>
div{
color:red;
font-size:17px;
}
</style>
</head>
<body>
<div>
xxx
</div>
</body>
2.3 外部样式
position.css
div{
color:red;
font-size:17px;
}
.html
<head>
<link rel="stylesheet" href="position.css">
</head>
2.4 样式表的优先级
行内样式的优先级 > 内部样式 = 外部样式(后面的覆盖前面的)
3.语法规范
h1 {color:green;font-size:40px}
/*选择器Selectors 声明块(属性名,属性值)*/
3.1 代码风格
-
展开风格——开发时推荐,便于维护和调试
h1 { color: red; font-size: 40px; }
-
紧凑风格——项目上线时推荐,可减小文件体积
h1{color:red;font-size:40px;}
4.选择器
4.1 通配选择器,元素选择器,类选择器,id选择器
-
通配选择器(选中全部标签),主要用于清除样式
* { color: red; }
-
元素选择器,为页面中某种元素设置统一样式
h1 { color: black; }
-
类选择器,使用class属性名进行分类
.container { color: black; }
<div class="container"> </div>
一个标签不可以有多个class属性,但是一个class属性可以有多个属性值,相同的属性后面的会覆盖前面的
<div class="contianer navbar"> </div>
-
ID选择器,不可以用数字作为开头,且多个元素的id不可以重复
#btn-delete { color: red; }
4.2 交集/并集选择器
-
复合选择器(交集选择器)
注意与后代选择器的区别,复合选择器两个条件之间没有空格
p.beauty { color:red; }
<p class="beauty"> xxx </p>
也可以使用类名 + 类名的复合选择器(很少用)
.beauty.rich { color: blue; }
-
并集选择器,可以任意组合类,id和元素,关系为或
含有rich或者beauty的class或者是p标签的标签获得以下样式
.rich, .beauty, p { font-size: 40px; background-color: red; width: 180px; }
4.3 后代/子代/兄弟选择器
-
元素之间的关系
父元素:直接包裹某个元素的元素
子元素:被父元素直接包裹的子元素
祖先元素:当前元素的父元素的父元素....的父元素
后代元素:当前元素子元素的子元素.....的子元素
-
后代选择器
ul
的所有的li
后代中的a
后代ul li a { color: red; }
同理,类名也可以作为后代选择器
.subject li a { color: blue; }
-
子代选择器
仅对
div
元素的子代中的a
标签添加样式,而对孙子代之后的都不考虑div > a { color: red; }
-
兄弟选择器
对
div
的最近右兄弟(在div以下的标签,最靠近div的那一个)中是p
标签的标签添加样式div + p { color: red; }
对
div
的全部右兄弟(在div以下的标签)中是p
标签的标签添加样式div ~ p { color: red; }
4.4 属性选择器
-
属性选择器
-
选中所有具有某种属性(例如name, type,也可以自定义属性)的元素
[title] { color: red; }
-
选中某种属性值为特定值的元素(例如name="gender")
[title="atguigu"] { color: blue; }
-
选中某种以特定字符开头属性的元素
[title^="a"] { color: red; }
-
选中某种以特定字符结尾属性的元素
[title$="u"] { color: blue; }
-
选中某种包含特定字符属性的元素
[title*="t"] { color: red; }
-
4.5 伪类选择器
-
伪类选择器
不是真正的类,而是元素特殊状态的描述
-
选中没有访问的元素
.a:link { color: orange; }
-
选中访问过的元素
.a:visited { color: gray; }
-
动态伪类
未选中 -> 悬浮 -> 选中点击 -> 访问完毕
link -> hover -> active -> visited
link 未被访问的
visited 被访问过的
hover 鼠标悬浮
active 选中激活状态的
必须按照lvha的顺序添加,否则会出现样式被覆盖
focus 选中焦点(只有input类有)
input:focus { background-color: red; }
-
结构伪类
div > p:first-child 选中div所有子元素中第一个元素,且这个元素必须是p元素,然后添加样式,搭配子类选择器使用
div > p:first-child{ color: red }
div p:firstchild 选中div后代中的第一个p元素,添加样式,搭配后代选择器使用
div p:first-child { color: red; }
p:firstchild 任意一个父类的第一个p元素
p:first-child { color: red; }
同理
last-child 最后一个孩子
nth-child(n) 第n个孩子
n=1, 2, ...(第几个) even(偶数项) odd(奇数项) n表示从第一个到最后一个
一个例子,如何选择前五个孩子
div > p:nth-child(-n + 5) { color: red; }
原理:
-n
表示从-n到0,加上5,实际上有效的项数就是1,2,3,4,5可以使用kn+b的格式选中特定的元素
first-of-type 获得满足该种类型的第一个孩子
div > p:first-of-type { color:red; }
<div> <span></span> <p></p><!--可以选中第一个p标签--> <p></p> </div>
同理
last-of-type 获得满足该种类型的最后一个孩子
nth-of-type(n) 获得满足该种类型的第n个孩子
nth-last-child(n) 获得倒数第n个孩子
nth-last-of-type(n) 获得满足该种类型的倒数第n个孩子
only-child 获得是父元素下唯一一个孩子(该孩子没有兄弟)
only-of-type 获得是父元素下唯一一个孩子(该孩子没有同类型的兄弟)
empty 获得没有内容的元素
div:empty
,必须完全为空,空格也不行 -
否定伪类
选择器1:not(选择器2) 选中选择器1中不符合选择器2的元素
并且not中可以嵌套伪类
为div下的第一个孩子p元素除外的其他元素添加某种样式
div > p:not(:first-child) { color:blue }
<div> <p></p><!--这个元素不获得样式> <p></p> <p></p> </div>
-
checked和focus
focus 只关注是否有焦点,而不关注是什么类型
checked 只有选中的焦点才会生效
例如:让一个复选框在选中时候或者某种样式
<style> input:checked { color: red; width:10px; height:10px; } </style> ... <input type="checkbox">
disabled 只有被禁用的input会获得样式
enabled 只有未被禁用的input会获得样式
-
目标伪类
target 当地址中#的内容与当前所在的id相同,会被应用样式
给锚点跳转的内容添加边框
<style> div:target { border: red solide 1px; } </style> ... <a href="#target">查看div</a> ... <div id="target"> xxx </div>
-
语言伪类
lang 指定语言类型获得样式
给标记为英文的内容添加样式(注意是标记的内容,浏览器无法识别文字是什么语言)
<style> div:lang(en) { background-color:red; } </style> <div> <p lang="en"> this sentence is used by English 即使有中文也会被应用样式 </p> </div>
-
4.6 伪元素选择器
-
伪元素选择器
选中的不是元素,是元素中一些特殊位置,所以是伪元素
选中p中第一个文字,添加某种样式
<style> p::first-letter { color: red; font-size: 40px; } </style> ... <p> dhsuiahdasddsadad </p>
first-line 选中第一行
selection 选中被鼠标选择的内容
placeholder 选中input中提示的内容
before 选中元素最开始的位置,创建一个子元素
举例:在所有class为yuan的前面增加"¥"符号
<style> .yuan::before { content: "¥"; } </style> ... <span class="yuan">139</span> <span class="yuan">77</span> <span class="yuan">98</span>
after 选中元素结束的位置,创建一个子元素
举例:清除浮动
.clearfix::after { content: ""; display: block; clear: both; }
4.7 选择器的优先级
- 行内样式 > 内部样式 = 外部样式
- 后来居上,相同类型的样式,后写的,或者在class中后出现最终显示
- 行内样式 > ID选择器 > 类选择器 > 元素选择器 > 通配选择器
- !important > 行内样式
一些复杂选择的结果
<style>
.slogan {
color: red;
}
.container span {
color: green;
}
</style>
...
<div class="container">
<p>
<span>xxx</span>
<span>xxx</span>
</p>
</div>
最终span元素获得什么样式取决于选择器的权重
格式:(a, b, c)
a:id选择器的个数
b:类、伪类、属性选择器的个数
c:元素、伪元素选择器的个数
在上述例子中,第一个选择器的权重为(0,1,0)第二个为(0,1,1)
然后比较每一位,当有一方的数字大于另一方,则该选择器优先,否则按照顺序后来者居上,通配选择器的权重为(0,0,0)
在一般IDE中(VS code、WebStorm),当鼠标放在选择器上方时候,会自动计算权值
5. CSS三大特性
5.1 层叠性
如果发生 样式冲突,会根据一定的规则进行样式的覆盖
5.2 继承
子元素会继承父或者祖先元素的一些属性,例如font-size
和color
5.3 优先级
important > 行内 > ID > 类选择器 > 元素选择器 > * > 继承的样式
6.颜色
方法一、使用名称
方法二、RGB&RGBA
RGB中三个参数分别代表红绿蓝
div {
rgb(138, 43, 226);
}
RGBA多一个参数表示透明度(范围0~1)
div {
rgba(138, 43, 226, 0.2);
}
可以使用取色器获取屏幕上某处某个颜色faststonecapture.cn/faststonecapture
方法三、HEX和HEXA
HEX
??????前两位表示红,中间两位表示绿色,后两位表示蓝色
div {
color: #ff0000;
}
HEXA
????????前两位表示红,然后两位表示绿色,然后两位表示蓝色,最后两位表示透明度(00表示完全透明,ff表示完全不透明)
div {
color: #39c5bbaa;
}
方法四、HSL和HSLA
hsl(色相, 饱和度, 亮度)
色相:0deg~360deg
饱和度:0%~100%
亮度:0%~100%
div {
color: hsl(60deg, 50%, 50%)
}
hsla(色相, 饱和度, 亮度, 透明度)
div {
color: hsla(60deg, 50%, 0.678)
}
7. CSS常用字体属性
7.1 字体大小
font-size 字体大小
默认当字体大小小于12px后可以在浏览器的 设置 -> 外观 中调整浏览器接受的最小字体(默认12px),以及默认的正常文字大小(默认16px)
font-size具有继承性
body { font-size: 20px; }
body中的所有内容默认都会有20px的font-size
7.2 字体族
font-family 字体族
例子:微软雅黑、楷体、宋体、华文彩云
可以通过
,
构建一个字体族,多个字体从第一个开始检测,有则使用,无则查询下一个body { font-family: "华文彩云", "楷体" }
字体分类:
衬线字体serif(也是一种字体属性,表示当前计算机中的第一个衬线字体)
例如楷体,宋体(笔画开始、结束的地方有额外的装饰)
非衬线字体(优先使用)sans-serif(也是一种字体属性,表示当前计算机中的第一个非衬线字体)
例如微软雅黑,黑体
7.3 字体风格
font-style 字体风格
属性值 效果 normal 默认 italic 斜体(非强制,该字体有倾斜风格就用,没有就正常) oblique 斜体(强制)
7.4 字体粗细
font-weight 字体粗细
属性值 效果 normal 正常 lighter 细 bold 粗 100~1000 自定义粗细
字体粗细中,100300表示lighter,400500表示normal,600一级以上为bold
7.5 字体复合属性
font 字体复合属性
最后两位必须按照字体大小、字体族的顺序写
body { font: bold italic 100px "华文彩云"; }
7.6 文本间距
letter-spacing 字符间隔
body { letter-spacing: 10px; }
word-spacing 单词间距(对中文不起作用)
7.7 文本修饰属性
text-decoration 文本修饰
属性值:
underline 下划线 标签ins自带
overline 上划线
line-through 删除线 标签del自带
none 没有线(可以删除超链接下的下划线)
并且可以修改划线的样式
dotted 虚线
wavy 波浪
并且可以修改颜色(三者顺序无所谓)
p { text-decoration: underline dotted red; }
7.8 首行缩进
text-indent 首行缩进
body { text-indent: 40px; }
7.9 文本对齐
text-align 文本对齐
属性值
left 居左
center 居中
right 居右
7.10 行间距
line-height 行间距(本质设置的是行高)
注意不要将line-height和font-size设置为一样的值,否则字体之间行间距会变成0,应该让line-height在font-size的1.5~2倍
或者也可以直接给line-height设置百分比(最常用)
body { line-height: 150%; }
行间距是可以继承的,所以如果出现对某个字的大小修改遮挡其他字,可能是因为包裹这个字的容器(例如span)出现了继承行高,需要添加一个line-height来修改高度(其实是在父容器的line-height基础上增加的值)
p {
line-height: 40px;
}
span {
font-size:200;
line-height:300
}
实际上最后span的行高是340
或者使用数字代替像素值
p {
line-height: 1.5;
}
span {
font-size: 200px;
}
span会直接继承p的行高,且 用在自己的font-size上,最终span的行高就是300px
关于height,如果没有设置值,那么实际上的高度就是行高×行数,所以说,当设置的line-height为0px的时候,实际上height也会变成0,那么背景色也就消失了
例子:如何实现单行句子垂直居中和水平居中?
div {
line-height: 100px;
height: 100px;
text-align: center;
}
例子2:如何实现单行句子居右下角(仅限中文,英文line-height在此基础上再减去一定的值)
div {
font-size: 20px;
height: 300px;
line-height: 580;
text-align: right;
}
7.11 移动基线
在前面无论是调整字体大小还是调整高度或者行距,都不会修改字符的基线条,如果要让一个字符在行内的上方或者下方,则需要用到vertical
vertical-align 垂直方向
属性值 参考都父元素的行高
baseline 默认值
top 顶端对齐
middle 行中线与父元素中的x交点对齐
bottom 底端对齐
注意:
-
vertical-align控制的是父元素中的子元素,所以直接给包裹文字的标签添加样式不会有效果
-
vertical-align只对行内元素有效果,如果子元素是块级元素例如div则不能控制
-
vertical-align不可以用在div上,但是可以用在单元格上,例如给td添加
vertical-align: top;
的样式,单元格内的文字就会在上方
8.列表相关属性
list-style-type 列表符号类型
属性值
none 删除列表前缀符号(最常用)
square 方块
lower-roman 小写罗马数字
upper-roman 大写罗马数字
decimal 数字
list-style-position 列表符号位置
属性值
inside 列表符号在单元元素盒子内部
outside 列表符号在单元元素盒子外部
list-style-image 自定义列表符号
ul { list-style-image: url("../static/image/xx.png"); }
list-style 符合属性
顺序无固定要求
9. 表格相关属性
9.1 通用属性
border-width 边框宽度
border-color 边框颜色
border-style 边框样式(solid、dashed、dotted、double)
border 复合属性
table { border: 2px green solid; } td, th { border: 2px orange solid; }
边框相关的属性也可以用在其他元素上面,例如div等
9.2 独有属性
table-layout 控制表格列宽
属性值
auto 默认效果,根据内容字数
fixed 全部相等
控制某一列宽度,可以给对应的
th
加一个自定义的widthborder-spacing 控制单元格之间的间距
border-class 合并单元格
属性值
separate 默认,不合并边框
collapse 合并边框,单元格的颜色会覆盖表格外边距
empty-cells 控制空单元格
属性值
hide 隐藏(在separate下能生效)
caption-side 设置表格标题位置
属性值
top 默认值,顶部
bottom 底部
10. 背景相关
background-image 使用图片作为背景
div { background-image: url("../static/image/xx.png"); }
background-repeat 设置背景图片重复方式
属性值
repeat 重复
no-repeat 不重复
repeat-x 水平重复
repeat-y 垂直重复
background-position 设置背景图片位置
属性值
left top 默认左上角
right top 右上
left bottom 左下
right bottom 右下
left center 左中
right center 右中
center center 中央
可以只写一个属性值,另一个默认就是center
也可以使用具体的数值,第一个代表距离左侧,第二个代表距离上侧
background 复合属性
属性值没有顺序要求,但是如果没有给对应的属性设置一个值,默认的属性会覆盖该样式中的例如background-color等样式
div { background-color: blue; background: url(../static/image/yy.jpg) no-repeat 70px 100px; }
蓝色会被下面的默认背景色覆盖,最终背景色是transparent,即透明
div { background: url(../static/image/yy.jpg) no-repeat 70px 100px; background-color: blue; }
这样不会被覆盖
11.鼠标相关
cursor 设置鼠标在元素上的样式
属性值
move 拖动样式
wait 等待样式
crosshair 十字架
pointer 点击
......(更多见MDN)
可以在属性值前加上图片的url自定义样式
div { cursor: url(../static/image/xx.png) pointer; }
12. 长度单位
px 像素
em font-size的值(font-size是可以继承的,如果当前元素没有,会先找
父元素的,如果都没有,会根据默认的值16px来设置)rem 根元素的font-size,即html标签的的
百分比 根据父元素的对应属性值进行设置
#d4 { width: 200px; height: 200px; font-size: 20px; background-color: gray; } #d4 .inside { width: 50%; height: 25%; font-size: 150%; background-color: orange; }
13. 元素的显示模式
display 显示模式
属性值
block 块级元素
html body
h1 h2 hr p pre div
ul ol li dl dt dd
table tbody thead tfoot tr caption
form option
inline 行内元素
br em strong sup sub del ins a label span
inline-block 行内块元素
img td th input textarea select buttton iframe
none 隐藏元素
14.盒子模型
14.1 盒子内容区
min-width 最小宽度,当父元素的宽度大于其时候,该元素充满行,否则最小为设定的值
min-height 最小高度,内容高度大于时候,按照内容的最小高度,否则最小为设定的值
max-width
max-height 与上述同理
如何解决外边距塌陷问题
如何解决外边距塌陷的问题?
如果在一个块元素中定义一个块元素,二者的margin可能会合并在一起,例如给父元素增加一个10px的外边距,给子元素添加一个20px的外边距,结果可能二者一共只有一个10px的外边距,且子元素紧挨着父元素上端
解决方法
方案一:给父元素添加1px透明边框
方案二:给父元素添加overflow: hidden属性
14.2 默认宽度
默认情况下,body中的子元素宽度没有设置就是占满整个body宽,但是如果给元素加上margin,元素的宽度会变化,如果加上border和padding,那么content的宽度也会变化
14.3 盒子内边距
修改盒子的内边距,盒子的实际宽度=设定的width + 两侧的padding
padding 符合属性
属性值
一个值 四个方向的值
两个值 第一个表示上下,第二个表示左右
三个值 第一个表示上,第二个表示左右,第三个表示下
四个值 第一个表示上,第二个表示左,第三个表示右,第四个表示下
行内元素的padding
行内元素可以设置左右padding,但是慎用设置上下padding,上下padding不会占据位置,即其他元素会默认这个高度不存在,可能导致重叠
14.4 盒子边框
border-width 边框宽度(默认情况下边框宽度是3,但由于操作系统的缩放,显示可能是2.4或者更低)
border-color 边框颜色
border-style 边框样式
同时,每个样式还有对应位置的不同
border-left-width 左边框宽度
border-top-color 上边框颜色
...
border-left 左边框符合属性
...
border 符合属性
div { border: 1px 2px 3px 4px solid dashed double dotted green blue red orange; }
14.5 外边距
margin 外边距
上、右、下、左
div { margin: 10px 20px 30px 40px; }
遵循:上、右、下、左
注意:
行内元素可以设置左右的margin,但是上下margin不生效
注意2:
当给一个元素设置左margin为auto时候,其会紧紧贴着父元素右侧,即左侧的margin要多宽有多宽
div { mragin-left: auto; }
当给一个元素的左右margin都设置为auto,这个元素会在父元素中居中
div { margin-left: auto; margin-right: auto; }
通常写作
div { margin: 0 auto; }
注意3:
margin的值也可以为负数
当margin的值为负数,其会覆盖上侧的元素
14.6 margin塌陷问题
在一个有多个块元素的父元素中,如果给贴着父元素上端第一个块设置margin-top,或者给贴着父元素下端的最后一个块设置margin-bottom,这些样式都会变成父元素的样式
如何解决?
方法一、给父元素设置边框
方法二、给父元素设置padding
方案三、给父元素设置overflow: hidden(溢出之后的显示模式:隐藏)
14.7 margin合并问题
上下两个元素之间的margin,会取比较大的一个作为二者之间的实际margin,这种情况即margin的合并问题
解决方法:不解决,修改对应的margin值规避即可,非要解决例如使用float等属性,会修改布局影响其他元素
15. 处理内容的溢出
当代码太长,使用VScode的格式化文档功能即可一键格式化
使用方法:
右键 -> 选择格式化文档
对于溢出内容的处理,需要在容器上添加对应的属性
overflow 溢出处理
属性值
hidden 隐藏
visible 显示(默认)
scroll 添加滚动条
auto 根据内容决定是否有滚动条
也可以根据横向和纵向分别设置
overflow-x
overflow-y(不可以一个是hidden一个是visible,并且是实验性功能不建议使用)
16. 隐藏元素的两种方式
16.1 方法一、display
设置display的格式为none即可隐藏元素(不占位)
16.2 方法二、visibility
设置visibility的属性值
visibility 元素可视性(占位)
属性值
show 显示(默认)
hidden 不显示
17. 样式的继承
会继承的css样式
字体属性、文本属性、文字颜色等等(vertical-align不会继承)
不会继承的css样式
边框、背景、内边距、宽高、溢出方式
规律:
继承的属性不会影响布局,即与盒子模型没有关系的
全部都有的情况下,从上到下依次是内联样式,内部样式,外部样式,默认样式,继承样式
18.默认样式
默认样式的级别高于继承样式
例如:给a标签的父元素修改color,这个颜色不会被继承,因为a标签有自己的初始颜色,这个颜色优先级高于继承样式
19.布局小技巧
19.1 块元素水平垂直居中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
background-color: chartreuse;
}
.box .element {
width: 200px;
height: 200px;
background-color: bisque;
margin: 150px auto;/*计算上下边距*/
}
</style>
</head>
<body>
<div class="box">
<div class="element"></div>
</div>
</body>
</html>
19.2 行内、行内块元素水平垂直居中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
background-color: chartreuse;
text-align: center;
line-height: 500px;
font-size: 30px;
}
.box .element {
background-color: bisque;
/*如果是行内块,这里要加上vertical-align: middle;*/
}
</style>
</head>
<body>
<div class="box">
这是没有span的文字<span class="element">这是一段文字</span>
</div>
</body>
</html>
19.3 让图片完全垂直居中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
background-color: chartreuse;
text-align: center;
line-height: 500px;
font-size: 0;
}
.box .element {
background-color: bisque;
font-size: 20px;
vertical-align: middle;
}
img {
width: 200px;
vertical-align: middle;
}
</style>
</head>
<body>
<div class="box">
<span class="element">这个图片垂直居中</span>
<img src="图片.png" alt="">
</div>
</body>
</html>
20. 元素之间的空白问题
行内元素在换行的时候,浏览器在渲染会自动为两个元素之间添加一个空格
方案一、去掉换行和空格
方案二、给父元素设置font-size: 0;
,再给需要显示文字的元素单独设置字体大小
21.行内块的幽灵空白问题
一个行内块元素如果是图片的时候,当父元素没有设定高度时候,底部会默认有一条细细的缝隙,这个缝隙来源于默认行内块元素是与基线对齐的
方案一、给行内块元素添加vertical-align
属性,注意属性值不可以是baseline
方案二、给行内元素修改display
为block
方案三、给父元素的font-size
设置为0
22. 浮动
浮动早期的效果:制作文字环绕图片或者文字环绕文字
现在的作用:布局(现在多用弹性盒子)
给一个元素添加浮动后的效果:
-
这个元素会浮在上层
-
原本布局中位于该元素下方的会跑到该元素的位置
-
被该元素遮挡的元素,其中的文字会呈现环绕该元素的状态
-
默认的特点会被浮动所覆盖(例如块的独占一行等)(脱离文档流 )
-
可以设置margin和padding,并且没有margin塌陷
-
不会像行内块一样被当作文本处理(没有行内块的空白问题)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .box { width: 500px; height: 500px; background-color: aqua; padding: 10px; } .box .element { height: 50px; padding: 10px; } .el1 { background-color: chartreuse; } .el2 { background-color: brown; float: left; } .el3 { background-color: chocolate; } </style> </head> <body> <div class="box"> <div class="element el1">盒子1</div> <div class="element el2">盒子2</div> <div class="element el3">盒子3</div> </div> </body> </html>
22.1 浮动练习
22.1.1 浮动在四个角落(2、4不浮动撑开父元素)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
background-color: gray;
border: 1px solid black;
}
.element {
width: 100px;
height: 100px;
background-color: cornflowerblue;
border: 1px solid black;
margin: 5px;
}
.el1 {
float: right;
}
.el3 {
float: right;
}
.el4 {
margin-top: 10px;
}
</style>
</head>
<body>
<div class="box">
<div class="element el1">盒子1</div>
<div class="element el2">盒子2</div>
<div class="element el3">盒子3</div>
<div class="element el4">盒子4</div>
</div>
</body>
</html>
22.1.2 浮动在一行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
background-color: gray;
border: 1px solid black;
}
.element {
width: 100px;
height: 100px;
background-color: cornflowerblue;
border: 1px solid black;
margin: 5px;
float: left;
}
</style>
</head>
<body>
<div class="box">
<div class="element">盒子1</div>
<div class="element">盒子2</div>
<div class="element">盒子3</div>
<div class="element">盒子4</div>
</div>
</body>
</html>
22.1.3 前两个浮动在第一行,后两个在第二行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
/*限制父元素的宽度*/
width: 224px;
background-color: gray;
border: 1px solid black;
}
.element {
width: 100px;
height: 100px;
background-color: cornflowerblue;
border: 1px solid black;
margin: 5px;
float: left;
}
</style>
</head>
<body>
<div class="box">
<div class="element">盒子1</div>
<div class="element">盒子2</div>
<div class="element">盒子3</div>
<div class="element">盒子4</div>
</div>
</body>
</html>
22.2 浮动产生的影响‘
22.2.1 父元素塌陷
当所有的子元素都有float后,父元素的高度如果没有设置就会变成0
22.2.2 兄弟元素的影响
当给浮动元素前后添加块元素时候,如果在后面添加,浮动元素会被拽到父元素中,而在前面添加则不会,因为浮动只会影响后面的元素的排列方式,而不会影响前面的
即:
- 对于后面的兄弟元素,会占据浮动元素之前的位置。在浮动元素的下面
- 对于前面的兄弟元素,则没有影响
22.3 解决浮动的影响
方法一、给父元素设置高度(解决1不解决2,不推荐)
方法二、给父元素设置float(解决1解决2,但是父元素的兄弟元素会占据父元素位置,不推荐)
方法三、overflow: hidden
(解决1不解决2,不推荐)
方法四、给非float的子元素添加clear: both
消除左右兄弟浮动产生的影响(推荐)
方法五、定义一个clearfix
样式,属性为clear:both
在多个float元素后面加上一个块元素,并添加该样式即可
方法六、给父元素添加一个伪元素,内容为空,display为block,clear为both(缺点:如果最后一个元素不是float,则在最后添加的伪元素无法解决问题2)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
/*限制父元素的宽度*/
width: 224px;
background-color: gray;
border: 1px solid black;
}
.box::after {
content: '';
display: block;
clear: both;
}
.element {
width: 100px;
height: 100px;
background-color: cornflowerblue;
border: 1px solid black;
margin: 5px;
float: left;
}
</style>
</head>
<body>
<div class="box">
<div class="element">盒子1</div>
<div class="element">盒子2</div>
<div class="element">盒子3</div>
<div class="element">盒子4</div>
</div>
</body>
</html>
22.4 浮动案例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>浮动布局</title>
<style>
/*清除默认样式*/
* {
margin: 0;
padding: 0;
}
/*定义常用样式*/
.leftfix {
float: left;
}
.rightfix {
float: right;
}
.clearfix::after {
content: '';
display: block;
clear: both;
}
.container {
width: 960px;
margin: 100px auto 0 auto;
}
.container > div:nth-child(-n + 3) {
margin-bottom: 10px;
}
/*头部*/
.band > div{
width: 200px;
height: 80px;
background-color: gray;
text-align: center;
line-height: 80px;
}
.band > div:nth-child(2) {
width: 540px;
margin: 0 10px;
}
/*菜单*/
.menu {
height: 30px;
background-color: gray;
text-align: center;
line-height: 30px;
}
/*栏目*/
.main > div:nth-child(-n + 2) {
width: 370px;
height: 410px;
}
.main > div:nth-child(2) {
margin: 0 10px;
}
.main > div:nth-child(3) {
width: 200px;
height: 410px;
}
.column {
background-color: grey;
text-align: center;
line-height: 200px;
}
#column1, #column2 {
width: 370px;
height: 200px;
}
#column3, #column4, #column5,#column6 {
width: 180px;
height: 200px;
margin-top: 10px;
}
#column4, #column6 {
margin-left: 10px;
}
#column7, #column8, #column9 {
width: 200px;
height: 130px;
line-height: 130px;
}
#column8, #column9 {
margin-top: 10px;
}
/*页脚*/
.foot {
height: 60px;
background-color: gray;
text-align: center;
line-height: 60px;
}
</style>
</head>
<body>
<div class="container">
<!-- 头部 -->
<div class="band clearfix">
<div id="logo" class="leftfix">logo</div>
<div id="banner1" class="leftfix">banner1</div>
<div id="banner2" class="rightfix">banner2</div>
</div>
<!-- 菜单 -->
<div class="menu">菜单</div>
<!-- 栏目 -->
<div class="main clearfix">
<div class="leftfix clearfix">
<div class="column leftfix" id="column1">栏目一</div>
<div class="column leftfix" id="column3">栏目三</div>
<div class="column leftfix" id="column4">栏目四</div>
</div>
<div class="leftfix clearfix">
<div class="column leftfix" id="column2">栏目二</div>
<div class="column leftfix" id="column5">栏目五</div>
<div class="column leftfix" id="column6">栏目六</div>
</div>
<div class="rightfix clearfix">
<div class="column leftfix" id="column7">栏目七</div>
<div class="column leftfix" id="column8">栏目八</div>
<div class="column leftfix" id="column9">栏目九</div>
</div>
</div>
<!-- 页脚 -->
<div class="foot">页脚</div>
</div>
</body>
</html>
23. 定位position
23.1 相对定位
position 定位
属性值
relative 相对定位(相对于发生定位之前的位置,并没有脱离文档流)
注意:
- 如果给一个元素开启了定位,其层级会高于原本的标签,即无论标签先后顺序,有定位的标签如果会与无定位的标签重叠,则一定显示的是有定位的,如果都有定位,则恢复后来居上的规则
- 如果开启了定位,建议不要再使用margin修正位置,否则会降低代码的可阅读性
- 开启定位后,也可以开启float,但是仍然不建议这样做,因为二者功能是重复的,会导致代码过于冗余
- 相对定位的应用场景:
- 微调元素(不会影响到其他任何元素)
- 与绝对定位配合
修改定位的值:
top bottom left right : + 定位的值(可以是负数)
注意:
left不能和right一起设置
top不能和bottom一起设置
23.2 绝对定位
属性值
absolute 绝对定位(会脱离文档流,且不会像float一样把文字剔除)
参考点:
如果父元素有relative,则参考父元素
否则参考网页的最左上角
即,含有绝对定位的元素,其参考点是他的“包含块”
- 没有脱离文档流元素,包含块就是父元素
- 脱离文档流的元素,第一个开启定位的祖先元素(子绝父相)
注意:
- 绝对定位也可以与margin共同使用,但是如果使用top就只能使用margin-top,如果使用left,就只能使用margin-left(建议不要再开启定位后使用margin)
- 开启绝对定位后使用float会失效
- 使用绝对定位后的元素是”定位元素“,即默认情况下其宽和高是由内容决定的,可以给元素设置宽高,使用相对定位的元素还是原本的元素
- 大规模使用定位可能导致某些浏览器的崩溃
一个样例:使用定位创造一个滑动盒子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 224px;
background-color: gray;
border: 1px solid black;
position: relative;
}
.element {
width: 100px;
height: 100px;
background-color: cornflowerblue;
border: 1px solid black;
}
.box .location {
position: absolute;
left: 0;
transition: left 1s;
}
.box:hover .location {
left: 100px;
}
</style>
</head>
<body>
<div class="box">
<div class="element">盒子1</div>
<div class="element location">盒子2</div>
<div class="element">盒子3</div>
</div>
</body>
</html>
23.3 固定定位
属性值
fixed 固定定位
参考点:
只有视口的左上角(),没有包含块,可以用于做冻结的窗口
注意事项与absolute一致
23.4 粘性定位
属性值
sticky 粘性定位
参考点:
离其最近的一个拥有滚动条件的祖先元素(overflow: scroll),如果都没有,body默认是有滚动行为的
注意:
- 粘性定位在未达到设定的位置时候不脱离文档流,到达后变成类似固定定位,是一种专门用于窗口滚动的定位方式
- 最常用的值是top
- float和margin生效,但不推荐
23.5 定位层级
定位 > 未定位
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>定位层级</title>
<style>
* {
margin: 0;
padding: 0;
}
.container {
width: 500px;
height: 500px;
background-color: skyblue;
margin: 100px;
position: relative;
}
.box {
height: 200px;
width: 200px;
background-color: gray;
font-size: 50px;
}
.box.box2 {
background-color: yellow;
position: relative;
top: -100px;
left: 100px;
}
.box.box3 {
background-color: greenyellow;
position: absolute;
top: 200px;
left: 200px;
}
.box.box4 {
background-color: brown;
position: fixed;
top: 400px;
left: 400px;
}
</style>
</head>
<body>
<div class="container">
<div class="box box1">1</div>
<div class="box box2">2</div>
<div class="box box3">3</div>
<div class="box box4">4</div>
</div>
</body>
</html>
如何自定义各个定位的层级?
z-index 调整同一水平的层级
属性值
层级数值,数值越大层级越高,同时,层级数值可以嵌套,父元素的z-index值决定子元素的层级上限;数值相同,后来者居上。
例如如果有两个div,第一个设置z-index值为1,第二个设置z-index为2,那么就算第一个div中的有个子元素z-index为999,也无法遮住第二个div中的任何元素
23.6 定位的特殊应用
问题1:开启绝对定位后,若包含块有padding,则参考位置是content的左上角吗?
答案:不是,开启绝对定位后,位置参考点是盒子模型的最左上角,即忽略padding
问题2:当一个子元素开启绝对定位后,有padding和margin,如何让其充满整个父元素的宽?
答案:给子元素设置left=0
,right=0
(在没有设置宽度的情况下)
.div-parent {
height: 500px;
background-color: gray;
}
.div-child {
height: 100px;
padding: 10px;
border: 10px solid black;
background-color: brown;
left: 0;
right: 0;
}
也可以不写高度,然后使用top=0
,bottom=0
使其充满整个行高
问题3:使用定位如何让子元素(块元素)垂直水平居中?
答案:
方法1:四周设置为0,通过margin=auto居中
.div-parent {
height: 500px;
width: 500px;
background-color: gray;
position: relative;
}
.div-child {
width: 100px;
height: 100px;
background-color: brown;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
方法二:通过子元素和父元素的宽度之比来调整(不推荐)
父元素500×500,子元素100×100,要让子元素居中,则子元素距离上和左的距离占整个父元素长或者宽的40%
.div-parent {
height: 500px;
width: 500px;
background-color: gray;
position: relative;
}
.div-child {
width: 100px;
height: 100px;
background-color: brown;
position: absolute;
top: 40%;
left: 40%;
}
方法三,设置左和上距离为50%,然后通过负的margin(应该是负的子元素的长度和宽度的一半)来往回拉
.div-parent {
height: 500px;
width: 500px;
background-color: gray;
position: relative;
}
.div-child {
width: 100px;
height: 100px;
background-color: brown;
position: absolute;
top: 50%;
left: 50%;
margin-top: -50px;
margin-left: -50px;
}
24.版心
对于不同的显示器有不同的屏宽,应该如何处理尽可能保证显示效果相似?
使用版心
中央位置留下960 ~ 1200的宽度作为整个页面的主体
一般命名:container
或者使用响应式布局,当窗口的宽度改变时候,修改样式以适应不同的个布局
25. 类名
位置 | |
---|---|
顶部导航条 | topbar |
页头 | header、page-header |
导航 | nav、navigator、navbar |
搜索框 | search、search-box |
横幅、广告、宣传图 | banner |
主要内容 | content、main |
侧边栏 | aside、sidebar |
页脚 | footer、page-footer |
26. 重置默认样式
方案一、使用全局选择器(不推荐)
* {
margin: 0;
padding: 0;
......
}
方案二、使用reset.css
选择具有默认样式的元素,清空具有默认的样式
方案三、使用Normalize.css
Normalize.css是一种最新方案,它在清除默认样式的基础上,保留了一些有价值的默认样式
下载地址:Normalize.css:使浏览器更一致地呈现所有元素。 (necolas.github.io)
相对于reset.css,normalize.css有更多的优点
- 保护有价值的默认样式
- 为大部分HTML元素提供一般化样式
- 新增HTML5元素设置