Webcourse/02-CSS基础/03-CSS样式表和选择器.md
2020-08-24 23:22:58 +08:00

943 lines
25 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

> 本文最初于 2015-10-03 发表于[博客园](http://www.cnblogs.com/smyhvae/p/4853995.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在 GitHub 上关注我,一起入门和进阶前端。
## 本文主要内容
- CSS 概述
- CSS HTML 结合的三种方式`行内样式表``内嵌样式表``外部样式表`
- CSS 四种基本选择器`标签选择器``类选择器``ID选择器``通用选择器`
- CSS 几种扩展选择器`后代选择器``交集选择器``并集选择器`
- CSS 样式优先级
## 前言
## CSS 概述
CSSCascading Style Sheet层叠样式表CSS 的作用就是给 HTML 页面标签添加各种样式**定义网页的显示效果**简单一句话CSS 将网页**内容和显示样式进行分离**提高了显示功能
css 的最新版本是 css3**我们目前学习的是 css2.1** 因为 css3 css2.1 不矛盾必须先学 2.1 然后学 3
接下来我们要讲一下为什么要使用 CSS
**HTML 的缺陷**
1. 不能够适应多种设备
2. 要求浏览器必须智能化足够庞大
3. 数据和显示没有分开
4. 功能不够强大
**CSS 优点**
1. 使数据和显示分开
2. 降低网络流量
3. 使整个网站视觉效果一致
4. 使开发效率提高了耦合性降低一个人负责写 html一个人负责写 css
比如说有一个样式需要在一百个页面上显示如果是 html 来实现那要写一百遍现在有了 css只要写一遍现在html 只提供数据和一些控件完全交给 css 提供各种各样的样式
### CSS 的重点知识点
盒子模型浮动定位
### CSS 整体感知
我们先来看一段简单的 css 代码
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style>
p {
color: red;
font-size: 30px;
text-decoration: underline;
font-weight: bold;
text-align: center;
font-style: italic;
}
h1 {
color: blue;
font-size: 50px;
font-weight: bold;
background-color: pink;
}
</style>
</head>
<body>
<h1>我是大标题</h1>
<p>
我是内容
</p>
</body>
</html>
```
解释如下
![](http://img.smyhvae.com/20170710_1605.png)
我们写 css 的地方是 style 标签就是样式的意思写在 head 里面后面的课程中我们将知道css 也可以写在单独的文件里面现在我们先写在 style 标签里面
如果在 sublime 中输入`<st`或者`<style`然后按 tab 可以自动生成的格式如下建议
```html
<style type="text/css"></style>
```
type 表示类型text 就是纯文本css 也是纯文本
但是如果在 sublime 中输入`st`或者`style`然后按 tab 可以自动生成的格式如下不建议
```html
<style></style>
```
css 对换行不敏感对空格也不敏感但是一定要有标准的语法冒号分号都不能省略
## CSS 语法
**语法格式**其实就是键值对
```html
选择器{ 属性名: 属性值; 属性名: 属性值; }
```
或者可以写成
```css
选择器 {
k: v;
k: v;
k: v;
k: v;
}
选择器 {
k: v;
k: v;
k: v;
k: v;
}
```
**解释**
- 选择器代表页面上的某类元素选择器后一定是大括号
- 属性名后必须用冒号隔开属性值后用分号最后一个属性可以不用分号但最好还是加上分号
- 冒号和属性值之间可以留一个空格编程习惯的经验
- 如果一个属性有多个值的话那么多个值用**空格**隔开
**举例**
```css
p {
color: red;
}
```
**完整版代码举例**
```html
<style type="text/css">
p {
font-weight: bold;
font-style: italic;
color: red;
}
</style>
<body>
<p>洗白白</p>
<p>你懂得</p>
<p>我不会就这样轻易的狗带</p>
</body>
```
效果
![](http://img.smyhvae.com/2015-10-03-css-01.png)
### css 代码的注释
**格式**
```html
<style type="text/css">
/*
具体的注释
*/
p {
font-weight: bold;
font-style: italic;
color: red;
}
</style>
```
注意CSS 只有`/* */`这种注释没有`//`这种注释而且注释要写在`<style>`标签里面才算生效哦
接下来我们要开始真正地讲 css 的知识咯
css 怎么学CSS 有两个知识部分
1 选择器怎么选
2 属性样式是什么
## CSS 的一些简单常见的属性
> 我们先来接触 CSS 的一些简单常见的属性因为接下来需要用到后期会专门用一篇文章来写 CSS 的属性
以下属性值中括号中的内容表示 sublime 中的快捷键
**字体颜色**c
```html
color:red;
```
color 属性的值可以是英语单词比如 redblueyellow 等等也可以是 rgb十六进制(后期详细讲)
**字号大小**fos
```html
font-size:40px;
```
font 就是字体size 就是尺寸px 像素单位必须加不加不行
**背景颜色**bgc
```html
background-color: blue;
```
background 就是背景
**加粗**fwb
```html
font-weight: bold;
```
font 字体 weight 重量的意思bold
**不加粗**fwn
```html
font-weight: normal;
```
normal 就是正常的意思
**斜体**fsi
```html
font-style: italic;
```
italic 就是斜体
**不斜体**fsn
```html
font-style: normal;
```
**下划线**tdu
```html
text-decoration: underline;
```
decoration 就是装饰的意思
**没有下划线**tdn
```html
text-decoration:none;
```
## CSS HTML 结合的方式样式表
CSS HTML 结合的方式其实就是问你 css 的代码放在哪里比较合适CSS 代码理论上的位置是任意的**但通常写在`<style>`标签里**只要是`<style>`标签里的代码那就是 css 代码浏览器就是这样来进行解析的
CSS HTML 的结合方式有 3
- **行内样式**在某个特定的标签里采用 style**属性**范围只针对此标签
- **内嵌样式表**在页面的 head 里采用`<style>`**标签**范围针对此页面
- **引入外部样式表 css 文件**的方式这种引入方式又分为两种 - 1采用`<link>`标签例如`<link rel = "stylesheet" type = "text/css" href = "a.css"></link>` - 2采用 import必须写在`<style>`标签中并且必须是第一句例如`@import url(a.css) ;`
> 两种引入样式方式的区别外部样式表中不能写<link>标签但是可以写 import 语句
下面来详细的讲一讲这三种方式
### 1CSS HTML 结合方式一行内样式
采用 style 属性范围只针对此标签适用
该方式比较灵活但是对于多个相同标签的同一样式定义比较麻烦适合局部修改
举例
```html
<p style="color:white;background-color:red">我不会就这样轻易的狗带</p>
```
效果
![](http://img.smyhvae.com/2015-10-03-css-02.png)
### 2CSS HTML 结合方式二内嵌样式表
head 标签中加入`<style>`标签对多个标签进行统一修改范围针对此页面
该方式可以对单个页面的样式进行统一设置但对于局部不够灵活
举例
```html
<style type="text/css">
p {
font-weight: bold;
font-style: italic;
color: red;
}
</style>
<body>
<p>洗白白</p>
<p style="color:blue">你懂得</p>
</body>
```
![](http://img.smyhvae.com/2015-10-03-css-03.png)
### 3CSS HTML 结合方式三引入外部样式表 css 文件
**引入样式表文件**的方式又分为两种
- 1**采用`<link>`标签**例如`<link rel = "stylesheet" type = "text/css" href = "a.css"></link>`
- 2**采用 import**必须写在`<style>`标签中并且必须是第一句例如`@import url(a.css) ;`
> 两种引入样式方式的区别外部样式表中不能写<link>标签但是可以写 import 语句
**具体操作如下**
我们先在 html 页面的同级目录下新建一个`a.css`文件那说明这里面的代码全是 css 代码此时就没有必要再写`<style>`标签这几个字了
`a.css`的代码如下
```css
p {
border: 1px solid red;
font-size: 40px;
}
```
上方的 css 代码中注意像素要带上 px 这个单位不然不生效
然后我们在 html 文件中通过`<link>`标签引入这个 css 文件就行了效果如下
![](http://img.smyhvae.com/2015-10-03-css-04.png)
这里再讲一个补充的知识**`<link>`标签的 rel 属性**其属性值有以下两种
- `stylesheet`定义的样式表
- `alternate stylesheet`候选的样式表
看字面意思可能比较难理解我们来举个例子一下子就明白了
举例
现在我们来定义 3 个样式表
a.css定义一个实线的黑色边框
```css
div {
width: 200px;
height: 200px;
border: 3px solid black;
}
```
ba.css蓝色的虚线边框
```css
div {
width: 200px;
height: 200px;
border: 3px dotted blue;
}
```
c.css来个背景图片
```css
div {
width: 200px;
height: 200px;
border: 3px solid red;
background-image: url('1.jpg');
}
```
然后我们在 html 文件中引用三个样式表
```html
<link rel = "stylesheet" type = "text/css" href = "a.css"></link>
<link rel = "alternate stylesheet" type = "text/css" href = "b.css" title="第二种样式"></link>
<link rel = "alternate stylesheet" type = "text/css" href = "c.css" title="第三种样式"></link>
```
上面引入的三个样式表中后面两个样式表作为备选注意备选的样式表中title 属性不要忘记写不然显示不出来效果的现在来看一下效果 IE 中打开网页
![](http://img.smyhvae.com/2015-10-03-css-05.gif)
## CSS 的四种基本选择器
CSS 选择器就是指定 CSS 要作用的标签那个标签的名称就是选择器意为选择哪个容器
CSS 的选择器分为两大类基本选择题和扩展选择器
**基本选择器**
- 标签选择器针对**一类**标签
- ID 选择器针对某**一个**特定的标签使用
- 类选择器针对**你想要的所有**标签使用
- 通用选择器通配符针对所有的标签都适用不建议使用
下面来分别讲一讲
### 1标签选择器选择器的名字代表 html 页面上的标签
标签选择器选择的是页面上所有这种类型的标签所以经常描述**共性**无法描述某一个元素的个性
举例
```html
p{ font-size:14px; }
```
上方选择器的意思是说所有的`<p>`标签里的内容都将显示 14 号字体
效果
![](http://img.smyhvae.com/2015-10-03-css-06.png)
再比如说我想让生命壹号学完了安卓继续学前端哟这句话中的前端两个变为红色字体那么我可以用`<span>`标签把前端这两个字围起来然后给`<span>`标签加一个标签选择器
代码如下
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style type="text/css">
span {
color: red;
}
</style>
</head>
<body>
<p>生命壹号学完了安卓,继续学<span>前端</span>哟</p>
</body>
</html>
```
总结需要注意的是
1所有的标签都可以是选择器比如 ullilabeldtdlinput
2无论这个标签藏的多深一定能够被选择上
3选择的所有而不是一个
### 2ID 选择器规定用`#`来定义
针对某一个特定的标签来使用只能使用一次css 中的 ID 选择器以#来定义
举例
```html
#mytitle{ border:3px dashed green; }
```
效果
![](http://img.smyhvae.com/2015-10-03-css-08.png)
id 选择器的选择符是#
任何的 HTML 标签都可以有 id 属性表示这个标签的名字这个标签的名字可以任取但是
- 1只能有字母数字下划线
- 2必须以字母开头
- 3不能和标签同名比如 id 不能叫做 bodyimga
另外特别强调的是**HTML 页面不能出现相同的 id哪怕他们不是一个类型**比如页面上有一个 id pp p一个 id pp div是非法的
**一个标签可以被多个 css 选择器选择**
比如我们可以同时让标签选择器和 id 选择器作用于同一个标签如下
![](http://img.smyhvae.com/20170710_1737.png)
然后我们通过网页的审查元素看一下效果
![](http://img.smyhvae.com/20170711_1540.png)
现在假设选择器冲突了比如 id 选择器说这个文字是红色的标签选择器说这个文字是绿色的那么听谁的
实际上css 有着非常严格的计算公式能够处理冲突.
一个标签可以被多个 css 选择器选择共同作用这就是**层叠式**的第一层含义第一层含义和第二层含义放到 css 基础的第三篇文章里讲
### 3类选择器规定用圆点`.`来定义
针对**你想要的所有**标签使用优点灵活
css 中用`.`来表示类举例如下
```html
.one{ width:800px; }
```
效果
![](http://img.smyhvae.com/2015-10-03-css-07.png)
id 非常相似任何的标签都可以携带 id 属性和 class 属性class 属性的特点
- 特性 1类选择器可以被多种标签使用
- 特性 2同一个标签可以使用多个类选择器**空格**隔开举例如下正确
```html
<h3 class="teshu zhongyao">我是一个h3啊</h3>
```
初学者常见的错误就是写成了两个 class举例如下错误
```html
<h3 class="teshu" class="zhongyao">我是一个h3啊</h3>
```
**类选择器使用的举例**
类选择器的使用能够决定一个人的 css 水平
比如我们现在要做下面这样一个页面
![](http://img.smyhvae.com/20170711_1639.png)
正确的思路就是用所谓公共类的思路就是我们类就是提供公共服务比如有绿线一旦携带这个类名就有相应的样式变化对应 css 里的代码如下
```html
<style type="text/css">
.lv {
color: green;
}
.da {
font-size: 30px;
}
.underline {
text-decoration: underline;
}
</style>
```
然后让每个标签去选取自己想要用的类选择器
```html
<p class="lv da">段落1</p>
<p class="lv xian">段落2</p>
<p class="da xian">段落3</p>
```
也就是说
1不要去试图用一个类名把某个标签的所有样式写完这个标签要多携带几个类共同完成这个标签的样式
2每一个类要尽可能小公共的概念能够让更多的标签使用
问题到底用 id 还是用 class
答案尽可能的用 class除非极特殊的情况可以用 id
原因id js 用的也就是说js 要通过 id 属性得到标签所以 css 层面尽量不用 id要不然 js 就很别扭另一层面我们会认为一个有 id 的元素有动态效果
举例如下
![](http://img.smyhvae.com/20170711_1706.png)
上图所示css js 都在用同一个 id会出现不好沟通的情况
我们记住这句话**类上样式id 上行为**意思是说`class`属性交给 css 使用`id`属性交给 js 使用
**上面这三种选择器的区别**
- 标签选择器针对的是页面上的一类标签
- ID 选择器是只针对特定的标签(一个)ID 是此标签在此页面上的唯一标识
- 类选择器可以被多种标签使用
### 4通配符`*`匹配任何标签
通用选择器将匹配任何标签不建议使用IE 有些版本不支持大网站增加客户端负担
效率不高如果页面上的标签越多效率越低所以页面上不能出现这个选择器
举例
```css
* {
margin-left: 0px;
margin-top: 0px;
}
```
效果
![](http://img.smyhvae.com/2015-10-03-css-09.png)
## CSS 的几种高级选择器
**高级选择器**
- 后代选择器用空格隔开
- 交集选择器选择器之间紧密相连
- 并集选择器分组选择器用逗号隔开
- 伪类选择器
下面详细讲一下这几种高级扩展选择器
### 1后代选择器: 定义的时候用空格隔开
对于`E F`这种格式表示**所有属于 E 元素后代的 F 元素**有这个样式空格就表示后代
后代选择器就是一种平衡共性特性的平衡当要把**某一个部分的所有的什么**进行样式改变就要想到后代选择器
后代选择器描述的是祖先结构
看定义可能有点难理解我们来看例子吧
举例 1
```html
<style type="text/css">
.div1 p {
color: red;
}
</style>
```
空格就表示后代`.div1 p` 表示`.div1`的后代所有的`p`
这里强调一下这两个标签不一定是连续紧挨着的只要保持一个后代的关联即可也就是说选择的是后代不一定是儿子
举例
```html
<style type="text/css">
h3 b i {
color: red;
}
</style>
```
上方代码的意思是说定义了`<h3>`标签中的`<b>`标签中的`<i>`标签的样式
同理h3 b i 标签不一定是连续紧挨着的只要保持一个后代的关联即可
效果
![](http://img.smyhvae.com/2015-10-03-css-11.png)
或者还有下面这种写法
![](http://img.smyhvae.com/2015-10-03-css-12.png)
上面的这种写法`<h3>`标签和`<i>`标签并不是紧挨着的但他们保持着一种后代关系
还有下面这种写法含类选择器id 选择器都是可以的
![](http://img.smyhvae.com/2015-10-03-css-13.png)
我们在开头说了**后代选择器描述的是一种祖先结构**我们举个例子来说明这句话
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style type="text/css">
div div p {
color: red;
}
</style>
</head>
<body>
<div>
<div class="div2">
<div class="div3">
<div class="div4">
<p>我是什么颜色?</p>
</div>
</div>
</div>
</div>
</body>
</html>
```
上面 css 中的`div div p`也能使文字的颜色变红通过浏览器的审查元素我们可以看到 p 元素的祖先列表
![](http://img.smyhvae.com/20170711_1836.png)
讲到这里我们再提一个 sublme 的快捷键
sublime 中输入`p#haha` tab 键后会生成`<p id="haha"></p>`
sublime 中输入`p.haha` tab 键后会生成`<p class="haha"></p>`
### 2交集选择器定义的时候紧密相连
定义交集选择器的时候两个选择器之间紧密相连一般是以标签名开头比如`div.haha`再比如`p.special`
如果后一个选择器是类选择器则写为`div.special`如果后一个选择器 id 选择器则写为`div#special`
来看下面这张图就明白了
![](http://img.smyhvae.com/20170711_1851.png)
```css
h3.special {
color: red;
}
```
选择的元素要求同时满足两个条件必须是 h3 标签然后必须是 special 标签
举例
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>交集选择器测试</title>
<style type="text/css">
h3.special {
color: red;
}
</style>
</head>
<body>
<h3 class="special zhongyao">标题1</h3>
<h3 class="special">我也是标题</h3>
<p>我是段落</p>
</body>
</html>
```
效果如下
![](http://img.smyhvae.com/20170711_1852.png)
注意交集选择器没有空格所以没有空格的`div.red`交集选择器和有空格的`div .red`后代选择器不是一个意思
交集选择器可以连续交一般不要这么写
```css
h3.special.zhongyao {
color: red;
}
```
上面这种写法 IE7 开始兼容的IE6 不兼容
### 3并集选择器定义的时候用逗号隔开
三种基本选择器都可以放进来
举例
```css
p,
h1,
#mytitle,
.one {
color: red;
}
```
效果
![](http://img.smyhvae.com/2015-10-03-css-10.png)
## 一些 CSS3 选择器
> 所有的 CSS3 选择器我们放在 CSS3 的内容里介绍本文暂时先接触一部分
### 浏览器的兼容性问题
> 我们可以用`IETester`这个软件测一下 CSS 在各个版本 IE 浏览器上的显示效果
IE 微软的浏览器随着操作系统安装的所以每个 windows 都有 IE 浏览器各版本如下
- windows xp 操作系统安装的 IE6
- windows vista 操作系统安装的 IE7
- windows 7 操作系统安装的 IE8
- windows 8 操作系统安装的 IE9
- windows10 操作系统安装的 edge
浏览器兼容问题要出就基本上就是出在 IE67 身上这两个浏览器是非常低级的浏览器
为了测试浏览器 CSS 3 的兼容性我们可以在网上搜"css3 机器猫"关键字然后在不同的浏览器中打开如下链接
- <http://www1.pconline.com.cn/pcedu/specialtopic/css3-doraemon/>
测试结果如下
![](http://img.smyhvae.com/20170711_1939.png)
我们可以在[百度统计](http://tongji.baidu.com/data/)里查看浏览器的市场占有率:
- IE9 5.94%
- IE8 21.19%
- IE7 4.79%
- IE6 4.11%
我们可以在<http://html5test.com/results/desktop.html>中查看
![](http://img.smyhvae.com/20170711_1948.png)
我们要知道典型的 IE6 兼容问题面试要问但是做项目我们兼容到 IE8 即可不解决 IE8 以下的兼容问题目的在于培养更高的兴趣和眼光别天天的跟 IE6 较劲
我们可以用IETester软件看看 css 在各个浏览器中的显示效果
### 1.子代选择器用符号`>`表示
> IE7 开始兼容IE6 不兼容
```css
div > p {
color: red;
}
```
div 的儿子 p div 的后代 p 的截然不同
能够选择
```html
<div>
<p>我是div的儿子</p>
</div>
```
不能选择
```html
<div>
<ul>
<li>
<p>我是div的重孙子</p>
</li>
</ul>
</div>
```
### 2.序选择器
> IE8 开始兼容IE67 都不兼容
设置无序列表`<ul>`中的第一个`<li>`为红色
```html
<style type="text/css">
ul li:first-child {
color: red;
}
</style>
```
设置无序列表`<ul>`中的最后一个`<li>`为红色
```css
ul li:last-child {
color: blue;
}
```
序选择器还有更复杂的用法以后再讲
由于浏览器的更新需要过程所以现在如果公司还要求兼容 IE67那么就要自己写类名
```html
<ul>
<li class="first">项目</li>
<li>项目</li>
<li>项目</li>
<li>项目</li>
<li>项目</li>
<li>项目</li>
<li>项目</li>
<li>项目</li>
<li>项目</li>
<li class="last">项目</li>
</ul>
```
用类选择器来选择第一个或者最后一个
```html
ul li.first{ color:red; } ul li.last{ color:blue; }
```
### 3.下一个兄弟选择器
> IE7 开始兼容IE6 不兼容
`+`表示选择下一个兄弟
```html
<style type="text/css">
h3 + p {
color: red;
}
</style>
```
上方的选择器意思是选择的是 h3 元素后面紧挨着的第一个兄弟
```html
<h3>我是一个标题</h3>
<p>我是一个段落</p>
<p>我是一个段落</p>
<p>我是一个段落</p>
<h3>我是一个标题</h3>
<p>我是一个段落</p>
<p>我是一个段落</p>
<p>我是一个段落</p>
<h3>我是一个标题</h3>
<p>我是一个段落</p>
<p>我是一个段落</p>
<p>我是一个段落</p>
<h3>我是一个标题</h3>
```
效果如下
![](http://img.smyhvae.com/20170711_1950.png)
这种选择器作用不大
## 我的公众号
想学习**代码之外的技能**不妨关注我的微信公众号**千古壹号**id`qianguyihao`
扫一扫你将发现另一个全新的世界而这将是一场美丽的意外
![](http://img.smyhvae.com/20190101.png)