Web/02-CSS基础/03-CSS样式表和选择器.md
2019-12-29 19:05:11 +08:00

963 lines
23 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)