这是我参与「第四届青训营 」笔记创作活动的的第二天
一.理解css
什么是css?
css也叫层叠式样式表,主要负责样式的书写样式,比如元素的color,width等,使用html+css可以完成页面的静态布局,当然使用css也可以用来书写一些交互的操作(比如使用伪类,为按钮添加鼠标的样式),不过交互还是交给js吧
css书写的位置
- 外部样式表
- 内联样式
- 内部样式表
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 引入外部样式表 -->
<link rel="stylesheet" href="style.css">
<!-- 内联样式 -->
<style>
p{
color: antiquewhite;
}
</style>
</head>
<body>
<!-- 内部样式 -->
<p style="color: red;"></p>
</body>
</html>
css的大致工作原理
可以看出,css是在加载完html元素后才加载的。
注意:浏览器渲染网页的过程是很复杂的,并不像图中那么简单,此图主要关注css,后面我会把完整的浏览器渲染原理总结一下。
css选择器(重要)
本人认为,css选择器是非常之重要的,选择器用来选择具体的元素的,如果对选择器不熟悉,是无法书写特定元素的样式的(内部样式除外)。 常用的选择器:
常用的选择器
- id选择器:
#id - 类选择器:
.类名 - 通配选择器:
*
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
/*
将所有的段落设置为红色(字体)
元素选择器
作用:根据标签名来选中指定的元素
语法:标签名{}
例子:p{} h1{} div{}
*/
/* p{
color: red;
}
h1{
color: green;
} */
/*
id选择器
作用:根据元素的id属性值选中一个元素
语法:#id属性值{}
例子:#box{} #red{}
*/
/* #red{
color: red;
} */
/*
类选择器
作用:根据元素的class属性值选中一组元素
语法:.class属性值
*/
/* .blue{
color: blue;
}
.abc{
font-size: 20px;
}
*/
/*
通配选择器
作用:选中页面中的所有元素
语法: *
*/
*{
color: red;
}
</style>
</head>
<body>
<h1 class="blue abc">我是标题</h1>
<p>锄禾日当午</p>
<p>汗滴禾下土</p>
<p id="red">谁之盘中餐</p>
<p>粒粒皆辛苦</p>
<!--
class 是一个标签的属性,它和id类似,不同的是class可以重复使用
可以通过class属性来为元素分组
可以同时为一个元素指定多个class属性
-->
<p class="blue">秋水共长天一色</p>
<p class="blue">落霞与孤鹜齐飞</p>
</body>
</html>
复合选择器
- 交集选择器
作用:选中同时复合多个条件的元素
语法: 选择器1 选择器2 选择器n {}
- 并集选择器
作用:同时选择多个选择器对应的元素
语法: 选择器1,选择器2,选择器3,选择器n{}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
/* 将class为red的div字体大小设置为30px */
/*
交集选择器
作用:选中同时复合多个条件的元素
语法:选择器1选择器2选择器3选择器n{}
注意点:
交集选择器中如果有元素选择器,必须使用元素选择器开头
*/
div.red{
font-size: 30px;
}
.a.b.c{
color: blue
}
/* div#box1{} */
/*
选择器分组(并集选择器)
作用:同时选择多个选择器对应的元素
语法:选择器1,选择器2,选择器3,选择器n{}
#b1,.p1,h1,span,div.red{}
*/
h1, .red{
color: green
}
</style>
</head>
<body>
<div class="red">我是div</div>
<p class="red">我是p元素</p>
<div class="red2 a b c">我是div2</div>
<h1>标题</h1>
<span>哈哈</span>
</body>
</html>
关系选择器
- 子类选择器
作用:选中指定父元素的指定子元素
语法: 父元素 > 子元素
div > span{
}
div > span > h1{
}
- 后代选择器
作用:选中指定元素内的后代元素
语法: 祖先 后代
div span{
}
-
兄弟选择器
-
选择下一个兄弟
语法:
前一个兄弟元素+下一个兄弟元素p+span{ } -
选择下边所有兄弟元素
语法:
兄元素~弟元素p~span{ }
-
属性选择器
- 选择元素[属性名]:选择含有指定属性的元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
/*
[属性名] 选择含有指定属性的元素
[属性名=属性值] 选择含有指定属性和属性值的元素
[属性名^=属性值] 选择属性值以指定值开头的元素
[属性名$=属性值] 选择属性值以指定值结尾的元素
[属性名*=属性值] 选择属性值中含有某值的元素的元素
*/
/* p[title]{ */
/* p[title=abc]{ */
/* p[title^=abc]{ */
/* p[title$=abc]{ */
p[title*=e]{
color: orange;
}
</style>
</head>
<body>
<p title="abc">少小离家老大回</p>
<p title="abcdef">乡音无改鬓毛衰</p>
<p title="helloabc">儿童相见不相识</p>
<p>笑问客从何处来</p>
<p>秋水共长天一色</p>
<p>落霞与孤鹜齐飞</p>
</body>
</html>
伪类选择器
-
伪类(不存在的类,特殊的类)
-
伪类用来描述一个元素的特殊状态
比如:第一个子元素、被点击的元素、鼠标移入的元素...
-
伪类一般情况下都是使用:开头
:first-child 第一个子元素
:last-child 最后一个子元素
:nth-child() 选中第n个子元素
:only-child
-
:not() 否定伪类
- 将符合条件的元素从选择器中去除
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
/* ul > li:first-child{
color: red;
} */
/* ul > li:last-child{
color: red;
} */
/* ul > li:nth-child(2n+1){
color: red;
} */
/* ul > li:nth-child(even){
color: red;
} */
/* ul > li:first-of-type{
color: red;
} */
ul > li:not(:nth-of-type(3)){
color: yellowgreen;
}
</style>
</head>
<body>
<ul>
<span>我是一个span</span>
<li>第〇个</li>
<li>第一个</li>
<li>第二个</li>
<li>第三个</li>
<li>第四个</li>
<li>第五个</li>
</ul>
</body>
</html>
a标签的伪类
- :link 用来表示没访问过的链接(正常的链接)
- :visited 用来表示访问过的链接
- :hover 用来表示鼠标移入的状态
- :active 用来表示鼠标点击
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
a:link{
color: red;
}
a:visited{
color: orange;
/* font-size: 50px; */
}
a:hover{
color: aqua;
font-size: 50px;
}
a:active{
color: yellowgreen;
}
p:first-child{
color: red;
}
</style>
</head>
<body>
<p>123</p>
<a href="https://www.baidu.com">访问过的链接</a>
<br><br>
<a href="https://www.baidu123.com">没访问过的链接</a>
</body>
</html>
伪元素选择器
伪元素:表示页面中一些特殊的并不真实存在的元素(特殊的位置)
语法: 伪元素使用 :: 开头
::first-letter表示第一个字母::fitst-line表示第一行::selection表示选中的元素::before表示元素开始的位置::after表示元素的最后
注意: 使用::before和::after必须结合content使用,content的内容无法选中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
p{
font-size: 20px;
}
p::first-letter{
font-size: 50px;
}
p::first-line{
background-color: yellow;
}
p::selection{
background-color: greenyellow;
}
div::before{
content: '『';
}
div::after{
content: '』';
}
</style>
</head>
<body>
<div>Hello Hello How are you</div>
<p>abcdefghijklmnopqrstuvwxyz</p>
</body>
</html>
选择器可以组合
二.深入css
选择器的权重(特异度)
CSS中会默认使用权重较大的样式
权重的计算:
不同的选择器有不同的权重值:
-
内联样式:权重是 1000
-
id选器:权重是 100
-
类、属性、伪类选择器:权重是 10
-
元素选择器:权重是 1
-
通配符:权重是 0
计算权重需要将一个样式的全部选择器相加,优先级越高越优先显示,样式后加上!important表示最高优先级。
样式的继承
样式的继承:我们为一个元素设置的样式同时也会应用到它的后代元素上。 继承是发生在祖先后代之间的,利用继承我们可以将一些通用的样式统一设置到共同的祖先元素上。
注意:并不是所有的样式都会被继承:比如 背景相关的,布局相关等的这些样式都不会被继承。一般css中和文字相关的样式都是可以继承的,和布局相关的都是无法继承的
显示继承: 可以让不可继承的元素可以从父级继承,使用inherit关键字
初始值:
CSS中,每个属性都有一个初始值
- background-color的初始值为transparent
- margin-left的初始值为О
可以使用initial关键字显式重置为初始值
- background-color: initial
布局
网页是一个多层的结构,通过css可以分别为每一层来设置样式,作为用户来讲只能看到最顶上的一层,这些层中,最底下的一层成为文档流。文档流是网页的基础,我们所创建的元素默认都是在文档流中进行排列。 对于我们来说元素主要有两个状态:
- 在文档里中
- 脱离文档流
元素在文档流中的特点:
块元素:
- 在页面中独占一行
- 默认宽度是父元素的全部(会把父元素撑满)
- 默认高度是被内容撑开(子元素的内容)
行内元素:
- 行内元素不会独占页面的一行,只占自身的大小
- 行内元素在页面中从左向右排列,如果一行中不能容纳所有的行内元素,则元素会换到第二行继续自左向右排列
- 行内元素的默认宽度和高度都是被内容撑开
三.总结
css的内容很多,不可一蹴而就,学习的时候要多动手,在实践中才能加深印象。flex布局,grid布局要掌握。可以多模仿各大官网进行html和css的学习,仿几个之后会逐渐找到布局的感觉。