css基础

# CSS样式规则 overflow

使用HTML时,需要遵从一定的规范。CSS亦如此,要想熟练地使用CSS对网页进行修饰,首先需要了解CSS样式规则,具体格式如下:           

在上面的样式规则中:

1.选择器用于指定CSS样式作用的HTML对象,花括号内是对该对象设置的具体样式。

2.属性和属性值以“键值对”的形式出现。

3.属性是对指定的对象设置的样式属性,例如字体大小、文本颜色等。

4.属性和属性值之间用英文“:”连接。

5.多个“键值对”之间用英文“;”进行区分。# CSS字体样式属性

# CSS字体样式属性

## font-size:字号大小

font-size属性用于设置字号,该属性的值可以使用相对长度单位,也可以使用绝对长度单位。其中,相对长度单位比较常用,推荐使用像素单位px,绝对长度单位使用较少


## font-family:字体

font-family属性用于设置字体。网页中常用的字体有宋体、微软雅黑、黑体等,例如将网页中所有段落文本的字体设置为微软雅黑,可以使用如下CSS样式代码:

p{ font-family:"微软雅黑";}

可以同时指定多个字体,中间以逗号隔开,表示如果浏览器不支持第一个字体,则会尝试下一个,直到找到合适的字体。


1. 现在网页中普遍使用14px+。

2. 尽量使用偶数的数字字号。ie6等老式浏览器支持奇数会有bug。

3. 各种字体之间必须使用英文状态下的逗号隔开。

4. 中文字体需要加英文状态下的引号,英文字体一般不需要加引号。当需要设置英文字体时,英文字体名必须位于中文字体名之前。

5. 如果字体名中包含空格、#、$等符号,则该字体必须加英文状态下的单引号或双引号,例如font-family: "Times New Roman";。

6. 尽量使用系统默认字体,保证在任何用户的浏览器中都能正确显示。

## font-weight:字体粗细

字体加粗除了用 b  和 strong 标签之外,可以使用CSS 来实现,但是CSS 是没有语义的。

font-weight属性用于定义字体的粗细,其可用属性值:normal、bold、bolder、lighter、100~900(100的整数倍)。

数字 400 等价于 normal,而 700 等价于 bold。  但是我们更喜欢用数字来表示。 

## font-style:字体风格

字体倾斜除了用 i  和 em 标签之外,可以使用CSS 来实现,但是CSS 是没有语义的。

font-style属性用于定义字体风格,如设置斜体、倾斜或正常字体,其可用属性值如下:

normal:默认值,浏览器会显示标准的字体样式。

italic:浏览器会显示斜体的字体样式。

oblique:浏览器会显示倾斜的字体样式。

## font:综合设置字体样式 (重点)

font属性用于对字体样式进行综合设置,其基本语法格式如下:

选择器{font: font-style  font-weight  font-size/line-height  font-family;}

使用font属性时,必须按上面语法格式中的顺序书写,不能更换顺序,各个属性以空格隔开。

注意:其中不需要设置的属性可以省略(取默认值),但必须保留font-size和font-family属性,否则font属性将不起作用。

## id选择器和类选择器区别

W3C标准规定,在同一个页面内,不允许有相同名字的id对象出现,但是允许相同名字的class。

类选择器(class) 好比人的名字,  是可以多次重复使用的, 比如  张伟  王伟  李伟  李娜

id选择器    好比人的身份证号码,  全中国是唯一的, 不得重复。 只能使用一次。

***id选择器和类选择器最大的不同在于 使用次数上。***

## 通配符选择器

通配符选择器用“*”号表示,他是所有选择器中作用范围最广的,能匹配页面中所有的元素。其基本语法格式如下:

* { 属性1:属性值1; 属性2:属性值2; 属性3:属性值3; }

例如下面的代码,使用通配符选择器定义CSS样式,清除所有HTML标记的默认边距。

* {

  margin: 0;                    /* 定义外边距*/

  padding: 0;                  /* 定义内边距*/

}

注意:

  这个通配符选择器,就像我们的电影明星中的梦中情人, 想想它就好了,但是它不会和你过日子。 


## 伪类选择器

  伪类选择器用于向某些选择器添加特殊的效果。比如给链接添加特殊效果, 比如可以选择 第1个,第n个元素。

为了和我们刚才学的类选择器相区别,  类选择器是一个点 比如 .demo {}  而我们的伪类 用 2个点 就是 冒号  比如  :link{}

### 链接伪类选择器

-:link      /* 未访问的链接 */

-:visited  /* 已访问的链接 */

-:hover    /* 鼠标移动到链接上 */

-:active    /* 选定的链接 */

   注意写的时候,他们的顺序尽量不要颠倒  按照  lvha 的顺序。  

a {  /* a是标签选择器  所有的链接 */

font-weight: 700;

font-size: 16px;

color: gray;

}

a:hover {  /* :hover 是链接伪类选择器 鼠标经过 */

color: red; /*  鼠标经过的时候,由原来的 灰色 变成了红色 */

}

### 结构(位置)伪类选择器(CSS3)

-:first-child :选取属于其父元素的首个子元素的指定选择器

-:last-child :选取属于其父元素的最后一个子元素的指定选择器

-:nth-child(n) : 匹配属于其父元素的第 N 个子元素,不论元素的类型

-:nth-last-child(n) :选择器匹配属于其元素的第 N 个子元素的每个元素,不论元素的类型,从最后一个子元素开始计数。

  n 可以是数字、关键词或公式

~~~css

li:first-child { /*  选择第一个孩子 */

color: pink; 

}

li:last-child {  /* 最后一个孩子 */

color: purple;

}

li:nth-child(4) {  /* 选择第4个孩子  n  代表 第几个的意思 */ 

color: skyblue;

}

~~~


### 目标伪类选择器(CSS3)

 :target目标伪类选择器 :选择器可用于选取当前活动的目标元素

~~~css

:target {

color: red;

font-size: 30px;

}

~~

# CSS外观属性

## color:文本颜色

color属性用于定义文本的颜色,其取值方式有如下3种:

1.预定义的颜色值,如red,green,blue等。

2.十六进制,如#FF0000,#FF6600,#29D794等。实际工作中,十六进制是最常用的定义颜色的方式。

3.RGB代码,如红色可以表示为rgb(255,0,0)或rgb(100%,0%,0%)。

需要注意的是,如果使用RGB代码的百分比颜色值,取值为0时也不能省略百分号,必须写为0%。

##  line-height:行间距

line-height属性用于设置行间距,就是行与行之间的距离,即字符的垂直间距,一般称为行高。line-height常用的属性值单位有三种,分别为像素px,相对值em和百分比%,实际工作中使用最多的是像素px

一般情况下,行距比字号大7.8像素左右就可以了。

## text-align:水平对齐方式

~~~

text-align属性用于设置文本内容的水平对齐,相当于html中的align对齐属性。其可用属性值如下:

~~~

left:左对齐(默认值)

right:右对齐

center:居中对齐

## text-indent:首行缩进

text-indent属性用于设置首行文本的缩进,其属性值可为不同单位的数值、em字符宽度的倍数、或相对于浏览器窗口宽度的百分比%,允许使用负值, 建议使用em作为设置单位。

1em 就是一个字的宽度  如果是汉字的段落, 1em 就是一个汉字的宽度

## letter-spacing:字间距

letter-spacing属性用于定义字间距,所谓字间距就是字符与字符之间的空白。其属性值可为不同单位的数值,允许使用负值,默认为normal。

## word-spacing:单词间距

word-spacing属性用于定义英文单词之间的间距,对中文字符无效。和letter-spacing一样,其属性值可为不同单位的数值,允许使用负值,默认为normal。

word-spacing和letter-spacing均可对英文进行设置。不同的是letter-spacing定义的为字母之间的间距,而word-spacing定义的为英文单词之间的间距。

## 颜色半透明(css3)

文字颜色到了CSS3我们可以采取半透明的格式了语法格式如下:

~~~css

    color: rgba(r,g,b,a)  a 是alpha  透明的意思  取值范围 0~1之间    color: rgba(0,0,0,0.3) 

~~~

## 文字阴影(CSS3)

以后我们可以给我们的文字添加阴影效果了  Shadow  影子 

~~~css

text-shadow:水平位置 垂直位置 模糊距离 阴影颜色;

~~~


# 引入CSS样式表(书写位置)

CSS可以写到那个位置? 是不是一定写到html文件里面呢?

## 行内式(内联样式)

是通过标签的style属性来设置元素的样式,其基本语法格式如下:

```

<标签名 style="属性1:属性值1; 属性2:属性值2; 属性3:属性值3;"> 内容 </标签名>

```

语法中style是标签的属性,实际上任何HTML标签都拥有style属性,用来设置行内式。其中属性和值的书写规范与CSS样式规则相同,行内式只对其所在的标签及嵌套在其中的子标签起作用。

## 内部样式表(内嵌式)

内嵌式是将CSS代码集中写在HTML文档的head头部标签中,并且用style标签定义,其基本语法格式如下:

```html

<head>

<style type="text/CSS">

    选择器 {属性1:属性值1; 属性2:属性值2; 属性3:属性值3;}

</style>

</head>

```

语法中,style标签一般位于head标签中title标签之后,也可以把他放在HTML文档的任何地方。

## 外部样式表(外链式)

链入式是将所有的样式放在一个或多个以.CSS为扩展名的外部样式表文件中,通过link标签将外部样式表文件链接到HTML文档中,其基本语法格式如下:

```html

<head>

           <link href="CSS文件的路径" type="text/CSS" rel="stylesheet" />

</head>

```

注意:  link 是个单标签哦!!!

该语法中,link标签需要放在head头部标签中,并且必须指定link标签的三个属性,具体如下:

~~~

href:定义所链接外部样式表文件的URL,可以是相对路径,也可以是绝对路径。

type:定义所链接文档的类型,在这里需要指定为“text/CSS”,表示链接的外部文件为CSS样式表。

rel:定义当前文档与被链接文档之间的关系,在这里需要指定为“stylesheet”,表示被链接的文档是一个样式表文件。

~~~

## 三种样式表总结

| 样式表  | 优点          | 缺点          | 使用情况    | 控制范围      |

| ----- | ------------ | ------------ | ------- | --------- |

| 行内样式表 | 书写方便,权重高    | 没有实现样式和结构相分离 | 较少      | 控制一个标签(少) |

| 内嵌样式表 | 部分结构和样式相分离  | 没有彻底分离      | 较多      | 控制一个页面(中) |

| 外部样式表 | 完全实现结构和样式相分离 | 需要引入        | 最多,强烈推荐 | 控制整个站点(多) |

## 块级元素(block-level)

每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度、高度、对齐等属性,常用于网页布局和网页结构的搭建。

```

常见的块元素有<h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>等,其中<div>标签是最典型的块元素。

```

块级元素的特点:

(1)总是从新行开始

(2)高度,行高、外边距以及内边距都可以控制。

(3)宽度默认是容器的100%

(4)可以容纳内联元素和其他块元素。

## 行内元素(inline-level)

行内元素(内联元素)不占有独立的区域,仅仅靠自身的字体大小和图像尺寸来支撑结构,一般不可以设置宽度、高度、对齐等属性,常用于控制页面中文本的样式。

```

常见的行内元素有<a>、<strong>、<b>、<em>、<i>、<del>、<s>、<ins>、<u>、<span>等,其中<span>标签最典型的行内元素。

行内元素的特点:

(1)和相邻行内元素在一行上。

(2)高、宽无效,但水平方向的padding和margin可以设置,垂直方向的无效。

(3)默认宽度就是它本身内容的宽度。

(4)行内元素只能容纳文本或则其他行内元素。(a特殊,<a href = "#"><div></div></a>)

   注意:

1.只有 文字才 能组成段落  因此 p  里面不能放块级元素,同理还有这些标签h1,h2,h3,h4,h5,h6,dt,他们都是文字类块级标签,里面不能放其他块级元素。

2.链接里面不能再放链接。

## 行内块元素(inline-block)

```

在行内元素中有几个特殊的标签——<img />、<input />、<td>,可以对它们设置宽高和对齐属性,有些资料可能会称它们为行内块元素。

行内块元素的特点:

(1)和相邻行内元素(行内块)在一行上,但是之间会有空白缝隙。

(2)默认宽度就是它本身内容的宽度。

(3)高度,行高、外边距以及内边距都可以控制。

```

## 标签显示模式转换(display)

块转行内:display:inline;

行内转块:display:block;

块、行内元素转换为行内块:display:inline-block;

# CSS复合选择器

复合选择器是由两个或多个基础选择器,通过不同的方式组合而成的,目的是为了可以选择更准确更精细的目标元素标签。

## 交集选择器

交集选择器由两个选择器构成,其中第一个为标签选择器,第二个为class选择器,两个选择器之间不能有空格,如h3.special。

<strong>记忆技巧:</strong>

交集选择器 是 并且的意思。  即...又...的意思

~~~

比如:  p.one  选择的是: 类名为 .one  的 段落标签。 

~~~

用的相对来说比较少,不太建议使用。

## 并集选择器

并集选择器(CSS选择器分组)是各个选择器通过<strong style="color:#f00">逗号</strong>连接而成的,任何形式的选择器(包括标签选择器、class类选择器id选择器等),都可以作为并集选择器的一部分。如果某些选择器定义的样式完全相同,或部分相同,就可以利用并集选择器为它们定义相同的CSS样式。


记忆技巧:

并集选择器  和 的意思,  就是说,只要逗号隔开的,所有选择器都会执行后面样式。

~~~

比如  .one, p , #test {color: #F00;}  表示  .one 和 p  和 #test 这三个选择器都会执行颜色为红色。  通常用于集体声明。

~~~

## 后代选择器

后代选择器又称为包含选择器,用来选择元素或元素组的后代,其写法就是把外层标签写在前面,内层标签写在后面,中间用空格分隔。当标签发生嵌套时,内层标签就成为外层标签的后代。


子孙后代都可以这么选择。 或者说,它能选择任何包含在内 的标签。 

## 子元素选择器

子元素选择器只能选择作为某元素子元素的元素。其写法就是把父级标签写在前面,子级标签写在后面,中间跟一个 &gt; 进行连接,注意,符号左右两侧各保留一个空格。


白话:  这里的子 指的是 亲儿子  不包含孙子 重孙子之类。

~~~

 比如:  .demo > h3 {color: red;}  说明  h3 一定是demo 亲儿子。  demo 元素包含着h3。

~~~

## 属性选择器

|**选择器                |**示例 | **含义                |

| --------------------- | ---- | -------------------- |

| **E[attr]******      |      | 存在attr属性即可          |

| **E[attr=val]******  |      | 属性值完全等于val          |

|**E[attr*=val]****** |      | 属性值里包含val字符并且在“任意”位置 |

|**E[attr^=val]******  |      | 属性值里包含val字符并且在“开始”位置 |

|**E[attr$=val]******  |      | 属性值里包含val字符并且在“结束”位置 |

~~~css

/* 获取到 拥有 该属性的元素 */

li[type] {

  border: 1px solid gray;

}

/* 获取 属性等于某个值的 元素 属性值 可以使用 引号进行包裹 */

li[type="vegetable"] {

  background-color: green;

}

/* 选择标题属性包含单词"hot"的所有元素 */

li[type~="hot"] {

  font-size: 40px;

}

/* 获取以某个属性开头的语法  */

li[color^='green'] {

  background-color: orange;

}

/* 获取以某个值 结尾的属性 */

li[type$='t']{

  color: hotpink;

  font-weight: 900;

}

/* 获取 属性中 拥有某个值的 元素 */

li[type*=ea] {

  font-size: 100px;

}

/* 属性price 以 very 为开头的所有元素 */

li[price|='very'] {

  background-color: darkred;

}

~~~

<ul>

    <li type='fruit' color='green'>西瓜</li>

    <li type='vegetable' color='greenyellow'>西兰花</li>

    <li type='meat'>牛肉</li>

    <li type='meat hot'>猪肉</li>

    <li type='drink hot'>可乐</li>

    <li type='drink hot'>雪碧</li>

    <li price='very-cheap'>红酒</li>

    <li price='very'>白酒</li>

</ul>

### 伪元素选择器(CSS3)

1.E::first-letter文本的第一个单词或字(如中文、日文、韩文等)

2.E::first-line 文本第一行;

3.E::selection 可改变选中文本的样式;

~~~css

p::first-letter {

  font-size: 20px;

  color: hotpink;

}

/* 首行特殊样式 */

p::first-line {

  color: skyblue;

}

p::selection {

  /* font-size: 50px; */

  color: orange;

}

~~~

4、E::before和E::after

在E元素内部的开始位置和结束位创建一个元素,该元素为行内元素,且必须要结合content属性使用。

~~~css

div::befor {

  content:"开始";

}

div::after {

  content:"结束";

}

~~~

E:after、E:before 在旧版本里是伪元素,CSS3的规范里“:”用来表示伪类,“::”用来表示伪元素,但是在高版本浏览器下E:after、E:before会被自动识别为E::after、E::before,这样做的目的是用来做兼容处理。

E:after、E:before后面的练习中会反复用到,目前只需要有个大致了解

":" 与 "::" 区别在于区分伪类和伪元素

# CSS 背景(background)

CSS 可以添加背景颜色和背景图片,以及来进行图片设置。

| background-color                      | 背景颜色    |

| ------------------------------------- | -------- |

| background-image                      | 背景图片地址  |

| background-repeat                    | 是否平铺    |

| background-position                  | 背景位置    |

| background-attachment                | 背景固定还是滚动 |

| 背景的合写(复合属性)                          |          |

| background:背景颜色 背景图片地址 背景平铺 背景滚动 背景位置 |          |

## 背景图片(image)

语法: 

~~~css

background-image : none | url (url) 

~~~

参数: 

none :  无背景图(默认的)

url :  使用绝对或相对地址指定背景图像 

background-image 属性允许指定一个图片展示在背景中(只有CSS3才可以多背景)可以和 background-color 连用。 如果图片不重复地话,图片覆盖不到地地方都会被背景色填充。 如果有背景图片平铺,则会覆盖背景颜色。

小技巧:  我们提倡 背景图片后面的地址,url不要加引号。

## 背景平铺(repeat)

语法: 

~~~css

background-repeat : repeat | no-repeat | repeat-x | repeat-y 

~~~

参数: 

repeat :  背景图像在纵向和横向上平铺(默认的)

no-repeat :  背景图像不平铺

repeat-x :  背景图像在横向上平铺

repeat-y :  背景图像在纵向平铺 

设置背景图片时,默认把图片在水平和垂直方向平铺以铺满整个元素。

repeat-x :  背景图像在横向上平铺 

设置背景图片时,默认把图片在水平和垂直方向平铺以铺满整个元素。

## 背景位置(position)

语法: 

~~~css

background-position : length || length

background-position : position || position 

~~~

参数: 

length :  百分数 | 由浮点数字和单位标识符组成的长度值。请参阅长度单位 

position :  top | center | bottom | left | center | right 

说明: 

设置或检索对象的背景图像位置。必须先指定background-image属性。默认值为:(0% 0%)。

如果只指定了一个值,该值将用于横坐标。纵坐标将默认为50%。第二个值将用于纵坐标。

注意:

1.position 后面是x坐标和y坐标。 可以使用方位名词或者 精确单位。

2.如果和精确单位和方位名字混合使用,则必须是x坐标在前,y坐标后面。比如 background-position: 15px top;  则 15px 一定是  x坐标  top是 y坐标。

实际工作用的最多的,就是背景图片居中对齐了。

## 背景附着

语法: 

~~~css

background-attachment : scroll | fixed 

~~~

参数: 

scroll :  背景图像是随对象内容滚动

fixed :  背景图像固定 

说明: 

设置或检索背景图像是随对象内容滚动还是固定的。

## 背景简写

background属性的值的书写顺序官方并没有强制标准的。为了可读性,建议大家如下写:

background:背景颜色 背景图片地址 背景平铺 背景滚动 背景位置

~~~css

background: transparent url(image.jpg) repeat-y  scroll 50% 0 ;

~~~

## 背景透明(CSS3)

CSS3支持背景半透明的写法语法格式是:

~~~css

background: rgba(0,0,0,0.3);

~~~

 最后一个参数是alpha 透明度  取值范围 0~1之间

 注意:  背景半透明是指盒子背景半透明, 盒子里面的内容不收影响。

同样, 可以给 文字和边框透明  都是 rgba 的格式来写。

~~~css

color:rgba(0,0,0,0.3);

border: 1px solid rgba(0,0,0,0.3);

~~~

## 背景缩放(CSS3)

通过background-size设置背景图片的尺寸,就像我们设置img的尺寸一样,在移动Web开发中做屏幕适配应用非常广泛。

其参数设置如下:

a) 可以设置长度单位(px)或百分比(设置百分比时,参照盒子的宽高)

b) 设置为cover时,会自动调整缩放比例,保证图片始终填充满背景区域,如有溢出部分则会被隐藏。

c) 设置为contain会自动调整缩放比例,保证图片始终完整显示在背景区域。

~~~css

background-image: url('images/gyt.jpg');

background-size: 300px 100px;

/* background-size: contain; */

/* background-size: cover; */

~~~

## 多背景(CSS3)

~~~css

background-image: url('images/gyt.jpg'),url('images/robot.png');

div {

    background:url('images/gyt.jpg') no-repeat left top, 

    url('images/robot.png') no-repeat right bottom red;

}

~~~

## 凹凸文字


##文本的装饰

text-decoration 通常我们用于给链接修改装饰效果


技巧:在一行内的盒子内,我们设定行高等于盒子的高度,就可以使文字垂直居中。



# CSS 三大特性

层叠 继承  优先级 是我们学习CSS 必须掌握的三个特性。

## CSS层叠性

所谓层叠性是指多种CSS样式的叠加。

是浏览器处理冲突的一个能力,如果一个属性通过两个选择器设置到同一个元素上,那么这个时候一个属性就会将另一个属性层叠掉

比如先给某个标签指定了内部文字颜色为红色,接着又指定了颜色为蓝色,此时出现一个标签指定了相同样式不同值的情况,这就是样式冲突。

一般情况下,如果出现样式冲突,则会按照CSS书写的顺序,以最后的样式为准。

##  CSS继承性

所谓继承性是指书写CSS样式表时,子标签会继承父标签的某些样式,如文本颜色和字号。想要设置一个可继承的属性,只需将它应用于父元素即可。

注意:

~~~

恰当地使用继承可以简化代码,降低CSS样式的复杂性。但是如果网页中所有的元素都大量继承样式,那么判断样式的来源就会很困难,所以对于字体、文本属性等网页中的通用样式可以使用继承。例如字体、字号、颜色、行距等可以在body元素中统一设置,然后通过继承影响文档中的所有文本。

并不是所有的css属性都可以继承,例如,下面的属性就不具有继承性:边框、内边距、外边距、背景、定位、元素高属性。

~~

## CSS优先级

定义CSS样式时,经常出现两个或更多规则应用在同一元素上,这时就会出现优先级的问题。

在考虑权重时,初学者还需要注意一些特殊的情况,具体如下:

~~~

继承样式的权重为0。即在嵌套结构中,不管父元素样式的权重多大,被子元素继承时,他的权重都为0,也就是说子元素定义的样式会覆盖继承来的样式。

行内样式优先。应用style属性的元素,其行内样式的权重非常高,可以理解为远大于100。总之,他拥有比上面提高的选择器都大的优先级。

权重相同时,CSS遵循就近原则。也就是说靠近元素的样式具有最大的优先级,或者说排在最后的样式优先级最大。

CSS定义了一个!important命令,该命令被赋予最大的优先级。也就是说不管权重如何以及样式位置的远近,!important都具有最大优先级。

~~~

## CSS特殊性(Specificity)

关于CSS权重,我们需要一套计算公式来去计算,这个就是 CSS Specificity,我们称为CSS 特性或称非凡性,它是一个衡量CSS值优先级的一个标准 具体规范入如下:

specificity用一个四位的数 字串(CSS2是三位)来表示,更像四个级别,值从左到右,左面的最大,一级大于一级,数位之间没有进制,级别之间不可超越。 

| 继承或者* 的贡献值      | 0,0,0,0 |

| --------------- | ------- |

| 每个元素(标签)贡献值为    | 0,0,0,1 |

| 每个类,伪类贡献值为      | 0,0,1,0 |

| 每个ID贡献值为        | 0,1,0,0 |

| 每个行内样式贡献值      | 1,0,0,0 |

| 每个!important贡献值 | ∞ 无穷大  |

权重是可以叠加的:

 ~~~

div ul  li  ------>      0,0,0,3

.nav ul li  ------>      0,0,1,2

a:hover      -----—>      0,0,1,1

.nav a      ------>      0,0,1,1   

#nav p      ----->      0,1,0,1

 ~~~

​注意: 数位之间没有进制 比如说: 0,0,0,5 + 0,0,0,5 =0,0,0,10 而不是 0,0, 1, 0, 所以不会存在10个div能赶上一个类选择器的情况。

总结优先级:

1.使用了 !important声明的规则。

2.内嵌在 HTML 元素的 style属性里面的声明。

3.使用了 ID 选择器的规则。

4.使用了类选择器、属性选择器、伪元素和伪类选择器的规则。

5.使用了元素选择器的规则。

6.只包含一个通用选择器的规则。

~~~

总结:权重是优先级的算法,层叠是优先级的表现

~~~

# 盒子模型(CSS重点)

其实,CSS就三个大模块:  盒子模型 、 浮动 、 定位,其余的都是细节。要求这三部分,无论如何也要学的非常精通。 

所谓盒子模型就是把HTML页面中的元素看作是一个矩形的盒子,也就是一个盛装内容的容器。每个矩形都由元素的内容、内边距(padding)、边框(border)和外边距(margin)组成。

首先,我们来看一张图,来体会下什么是盒子模型。


所有的文档元素(标签)都会生成一个矩形框,我们成为元素框(element box),它描述了一个文档元素再网页布局汇总所占的位置大小。因此,每个盒子除了有自己大小和位置外,还影响着其他盒子的大小和位置。


## 盒子边框(border)

边框就是那层皮。  橘子皮。。柚子皮。。橙子皮。。。

语法: 

~~~css

border : border-width || border-style || border-color 

~~~

边框属性—设置边框样式(border-style)

边框样式用于定义页面中边框的风格,常用属性值如下:

~~~

none:没有边框即忽略所有边框的宽度(默认值)

solid:边框为单实线(最为常用的)

dashed:边框为虚线

dotted:边框为点线

double:边框为双实线

~~~

### 表格的细线边框

以前学过的html表格边框很粗,这里只需要CSS一句话就可以美观起来。 让我们真的相信,CSS就是我们的白马王子(白雪公主)。

table{ border-collapse:collapse; }

border-collapse:collapse; 表示合并相邻边框

### 盒子边框总结表

|        |                                          |                                          |

| ------ | ---------------------------------------- | ---------------------------------------- |

| 设置内容  | 样式属性                                    | 常用属性值                                    |

| 上边框    | border-top-style:样式; border-top-width:宽度;border-top-color:颜色;border-top:宽度 样式 颜色; |                                          |

| 下边框    | border-bottom-style:样式;border- bottom-width:宽度;border- bottom-color:颜色;border-bottom:宽度 样式 颜色; |                                          |

| 左边框    | border-left-style:样式; border-left-width:宽度;border-left-color:颜色;border-left:宽度 样式 颜色; |                                          |

| 右边框    | border-right-style:样式;border-right-width:宽度;border-right-color:颜色;border-right:宽度 样式 颜色; |                                          |

| 样式综合设置 | border-style:上边 [右边 下边 左边];              | none无(默认)、solid单实线、dashed虚线、dotted点线、double双实线 |

| 宽度综合设置 | border-width:上边 [右边 下边 左边];              | 像素值                                      |

| 颜色综合设置 | border-color:上边 [右边 下边 左边];              | 颜色值、#十六进制、rgb(r,g,b)、rgb(r%,g%,b%)      |

| 边框综合设置 | border:四边宽度 四边样式 四边颜色;                  |                                          |

### 圆角边框(CSS3)

从此以后,我们的世界不只有矩形。

语法格式:

~~~css

Border-radius: 水平半径/垂直半径;

~~~

 一般我们垂直半径都是省略的默认和水平半径一样。

~~~css

border-radius: 左上角  右上角  右下角  左下角;

~~~

## 内边距(padding)

padding属性用于设置内边距。  是指 边框与内容之间的距离。

padding-top:上内边距

padding-right:右内边距

padding-bottom:下内边距

padding-left:左内边距

| 值的个数 | 表达意思                                    |

| ---- | ---------------------------------------- |

| 1个值  | padding:上下左右边距 比如padding: 3px; 表示上下左右都是3像素 |

| 2个值  | padding: 上下边距 左右边距 比如 padding: 3px 5px; 表示 上下3像素 左右 5像素 |

| 3个值  | padding:上边距 左右边距 下边距 比如 padding: 3px 5px 10px; 表示 上是3像素 左右是5像素 下是10像素 |

| 4个值  | padding:上内边距 右内边距 下内边距 左内边距 比如: padding: 3px 5px 10px 15px; 表示 上3px 右是5px 下 10px 左15px 顺时针 |

## 外边距(margin)

margin属性用于设置外边距。  设置外边距会在元素之间创建“空白”, 这段空白通常不能放置其他内容。

margin-top:上外边距

margin-right:右外边距

margin-bottom:下外边距

margin-left:上外边距

margin:上外边距 右外边距  下外边距  左外边

取值顺序跟内边距相同。

### 外边距实现盒子居中

可以让一个盒子实现水平居中,需要满足一下两个条件:

1.必须是块级元素。     

2.盒子必须指定了宽度(width)

然后就给左右的外边距都设置为auto,就可使块级元素水平居中。

实际工作中常用这种方式进行网页布局,示例代码如下:

~~~css

.header{ width:960px; margin:0 auto;}

~~~

### 清除元素的默认内外边距

为了更方便地控制网页中的元素,制作网页时,可使用如下代码清除元素的默认内外边距: 

~~~css

* {

   padding:0;        /* 清除内边距 */

   margin:0;          /* 清除外边距 */

}

~~~

注意:  行内元素是只有左右内外边距的,是没有上下内外边距的。我们尽量不要给行内元素指定上下的内外边距。

## 外边距合并

使用margin定义块元素的垂直外边距时,可能会出现外边距的合并。

### 相邻块元素垂直外边距的合并

当上下相邻的两个块元素相遇时,如果上面的元素有下外边距margin-bottom,下面的元素有上外边距margin-top,则他们之间的垂直间距不是margin-bottom与margin-top之和,而是两者中的较大者。这种现象被称为相邻块元素垂直外边距的合并(也称外边距塌陷)。


解决方案:  避免就好了。

### 嵌套块元素垂直外边距的合并

对于两个嵌套关系的块元素,如果父元素没有上内边距及边框,则父元素的上外边距会与子元素的上外边距发生合并,合并后的外边距为两者中的较大者,即使父元素的上外边距为0,也会发生合并。


解决方案:

1.可以为父元素定义1像素的上边框或上内边距。

2.可以为父元素添加overflow:hidden。

## content宽度和高度

使用宽度属性width和高度属性height可以对盒子的大小进行控制。

width和height的属性值可以为不同单位的数值或相对于父元素的百分比%,实际工作中最常用的是像素值。

大多数浏览器,如Firefox、IE6及以上版本都采用了W3C规范,符合CSS规范的盒子模型的总宽度和总高度的计算原则是:


~~~

盒子的总宽度= width+左右内边距之和+左右边框宽度之和+左右外边距之和

~~~

~~~

盒子的总高度= height+上下内边距之和+上下边框宽度之和+上下外边距之和

~~~

注意:

1、宽度属性width和高度属性height仅适用于块级元素,对行内元素无效( img 标签和 input除外)。

2、计算盒子模型的总高度时,还应考虑上下两个盒子垂直外边距合并的情况。

3、如果一个盒子没有给定宽度/高度或者继承父亲的宽度/高度,则padding不会影响本盒子的大小

## 盒子模型布局稳定性

开始学习盒子模型,同学们最大的困惑就是, 分不清内外边距的使用,什么情况下使用内边距,什么情况下使用外边距?

答案是:  其实他们大部分情况下是可以混用的。  就是说,你用内边距也可以,用外边距也可以。 你觉得哪个方便,就用哪个。

但是,总有一个最好用的吧,我们根据稳定性来分,建议如下:

按照 优先使用  宽度 (width)  其次 使用内边距(padding)    再次  外边距(margin)。   

```

  width >  padding  >  margin   

```

原因:

1.margin 会有外边距合并 还有 ie6下面margin 加倍的bug(讨厌)所以最后使用。

2.padding  会影响盒子大小, 需要进行加减计算(麻烦) 其次使用。

3.width  没有问题(嗨皮)我们经常使用宽度剩余法 高度剩余法来做。

## CSS3盒模型

CSS3中可以通过box-sizing 来指定盒模型,即可指定为content-box、border-box,这样我们计算盒子大小的方式就发生了改变。

可以分成两种情况:

1、box-sizing: border-box  盒子大小为 width

2、box-sizing: content-box  盒子大小为 width + padding + border

注:上面的标注的width指的是CSS属性里设置的width: length,content的值是会自动调整的。

~~~css

div {

  width: 100px;

  height: 100px;

  background: skyblue;

  margin: 0 auto;

  border: 1px solid gray;

  /* 

  默认的设置 如果我们添加了 border属性 该容器的大小会发生改变

  因为他要优先保证内部的内容所占区域 不变

  */

  /* 

  box-sizing  如果不设置 默认的值 就是 content-box: 优先保证内容的大小 对盒子进行缩放;

  border-box: 让 盒子 优先保证自己所占区域的大小,对内容进行压缩;

  */

  box-sizing: border-box;

}

~~~ 

## 盒子阴影

语法格式:

~~~css

box-shadow:水平位置 垂直位置 模糊距离 阴影尺寸(影子大小) 阴影颜色  内/外阴影;

~~~


1.前两个属性是必须写的。其余的可以省略。

2.外阴影 (outset 默认) 但是不能写        想要内阴影  inset 

~~~css

img {

  border:10px solid orange;

  box-shadow:3px 3px 5px 4px rgba(0,0,0,1);

}

~~~

# 浮动(float)

## 普通流(normal flow)

这个单词很多人翻译为 文档流 , 字面翻译  普通流 或者标准流都可以。

前面我们说过,网页布局的核心,就是用CSS来摆放盒子位置。如何把盒子摆放到合适的位置? 

CSS的定位机制有3种:普通流(标准流)、浮动和定位。

html语言当中另外一个相当重要的概念----------标准流!或者普通流。普通流实际上就是一个网页内标签元素正常从上到下,从左到右排列顺序的意思,比如块级元素会独占一行,行内元素会按顺序依次前后排列;按照这种大前提的布局排列之下绝对不会出现例外的情况叫做普通流布局。


## 什么是浮动?

div {

display: inline-block;转换为行内块元素 就可以放一行上有宽度和高度,但是元素之间有空隙 不容易处理

}

元素的浮动是指设置了浮动属性的元素会脱离标准普通流的控制,移动到其父元素中指定位置的过程。

在CSS中,通过float属性来定义浮动,其基本语法格式如下:


~~~

选择器{float:属性值;}

~~~

## 浮动详细内幕特性

```

浮动首先创建包含块的概念(包裹)。就是说, 浮动的元素总是找理它最近的父级元素对齐。但是不会超出内边距的范围。 

```


```

浮动的元素排列位置,跟上一个元素(块级)有关系。如果上一个元素有浮动,则A元素顶部会和上一个元素的顶部对齐;如果上一个元素是标准流,则A元素的顶部会和上一个元素的底部对齐。

```


可以推断出,一个父盒子里面的子盒子,如果其中一个子级有浮动的,则其他子级都需要浮动。这样才能一行对齐显示。

浮动脱离标准流,不占位置,会影响标准流。浮动只有左右浮动。

元素添加浮动后,元素会具有行内块元素的特性。元素的大小完全取决于定义的大小或者默认的内容多少

浮动根据元素书写的位置来显示相应的浮动。

## 清除浮动本质

清除浮动主要为了解决父级元素因为子级浮动引起内部高度为0 的问题。

## 清除浮动的方法

其实本质叫做闭合浮动更好一些, 记住,清除浮动就是把浮动的盒子圈到里面,让父盒子闭合出口和入口不让他们出来影响其他元素。

在CSS中,clear属性用于清除浮动,其基本语法格式如下:

```

选择器{clear:属性值;}

```

| 属性值  | 描述                    |

| ----- | --------------------- |

| left  | 不允许左侧有浮动元素(清除左侧浮动的影响) |

| right | 不允许右侧有浮动元素(清除右侧浮动的影响) |

| both  | 同时清除左右两侧浮动的影响        |

### 额外标签法

```html

是W3C推荐的做法是通过在浮动元素末尾添加一个空的标签例如 <div style=”clear:both”></div>,或则其他标签br等亦可。

```

优点: 通俗易懂,书写方便

缺点: 添加许多无意义的标签,结构化较差。  我只能说,w3c你推荐的方法我不接受,你不值得拥有。。。

### 父级添加overflow属性方法

可以通过触发BFC的方式,可以实现清除浮动效果。(BFC后面讲解)

~~~css

可以给父级添加: overflow为 hidden|auto|scroll  都可以实现。

~~~

优点:  代码简洁

缺点:  内容增多时候容易造成不会自动换行导致内容被隐藏掉,无法显示需要溢出的元素。

### 使用after伪元素清除浮动

:after方式是空元素的升级版,好处是不用单独加标签了

使用方法:

```css

 .clearfix:after {  content: "."; display: block; height: 0; clear: both; visibility: hidden;  }   

 .clearfix {*zoom: 1;}  /* IE6、7 专有 */

```


优点: 符合闭合浮动思想  结构语义化正确

缺点: 由于IE6-7不支持:after,使用 zoom:1触发 hasLayout。 

注意: content:"."  里面尽量跟一个小点,或者其他,尽量不要为空,否则再firefox 7.0前的版本会有生成空格。

### 使用before和after双伪元素清除浮动

使用方法:

```css

.clearfix:before,.clearfix:after { 

  content:".";

  display:table;

}

.clearfix:after {

 clear:both;

}

.clearfix {

  *zoom:1;

}

```

优点:  代码更简洁

缺点:  由于IE6-7不支持:after,使用 zoom:1触发 hasLayout。

# 定位(position)

如果,说浮动, 关键在一个 “浮” 字上面, 那么 我们的定位,关键在于一个 “位” 上。

PS: 定位是我们CSS算是数一数二难点的了,但是,你务必要学好它,我们CSS离不开定位,特别是后面的js特效,天天和定位打交道。

## 元素的定位属性

元素的定位属性主要包括定位模式和边偏移两部分。

1、边偏移

| 边偏移属性  | 描述                      |

| ------ | ----------------------- |

| top    | 顶端偏移量,定义元素相对于其父元素上边线的距离 |

| bottom | 底部偏移量,定义元素相对于其父元素下边线的距离 |

| left  | 左侧偏移量,定义元素相对于其父元素左边线的距离 |

| right  | 右侧偏移量,定义元素相对于其父元素右边线的距离 |

也就说,以后定位要和这边偏移搭配使用了, 比如 top: 100px;  left: 30px; 等等

2、定位模式

在CSS中,position属性用于定义元素的定位模式,其基本语法格式如下:

选择器{position:属性值;}

position属性的常用值

| 值        | 描述                      |

| -------- | ------------------------ |

| static  | 自动定位(默认定位方式)            |

| relative | 相对定位,相对于其原文档流的位置进行定位    |

| absolute | 绝对定位,相对于其上一个已经定位的父元素进行定位 |

| fixed    | 固定定位,相对于浏览器窗口进行定位        |

## 静态定位(static)

静态定位是所有元素的默认定位方式,当position属性的取值为static时,可以将元素定位于静态位置。 所谓静态位置就是各个元素在HTML文档流中默认的位置。

上面的话翻译成白话:  就是网页中所有元素都默认的是静态定位哦! 其实就是标准流的特性。

在静态定位状态下,无法通过边偏移属性(top、bottom、left或right)来改变元素的位置。

PS: 静态定位其实没啥可说的。

注意:静态定位 对于边偏移是无效的;一般它用来清除定位的,一个原来有定位的盒子,不想加定位了,就用静态定位

## 相对定位relative

相对定位是将元素相对于它在标准流中的位置进行定位,当position属性的取值为relative时,可以将元素定位于相对位置。

对元素设置相对定位后,可以通过边偏移属性改变元素的位置,但是它在文档流中的位置仍然保留。如下图所示,即是一个相对定位的效果展示:


注意:   

1、相对定位最重要的一点是,它可以通过边偏移移动位置,但是原来的所占的位置,继续占有。

2、其次,每次移动的位置,是以自己的左上角为基点移动(相对于自己来移动位置)

就是说,相对定位的盒子仍在标准流中,它后面的盒子仍以标准流方式对待它。如果说浮动的主要目的是让多个块级元素一行显示,那么定位的主要价值就是移动位置,让盒子到我们想要的位置上去。

## 绝对定位absolute 

[注意] 如果文档可滚动,绝对定位元素会随着它滚动,因为元素最终会相对于正常流的某一部分定位。

当position属性的取值为absolute时,可以将元素的定位模式设置为绝对定位。

注意:    绝对定位最重要的一点是,它可以通过边偏移移动位置,但是它完全脱标,完全不占位置。

(1) 父级没有定位


若所有父元素都没有定位,以浏览器为基准点对齐(document文档)。

(2) 父级有定位

绝对定位是将元素依据最近的已经定位(绝对、固定或相对定位)的父元素(祖先)进行定位。 


(3)绝对定位的盒子没有边偏移

如果只是给盒子指定了 定位,但是没有给与边偏移,则改盒子以标准流来显示排序,和上一个盒子的底边对齐,但是不占有位置。

(4)子绝父相

这个“子绝父相”太重要了,是我们学习定位的口诀,时时刻刻记住的。

这句话的意思是 子级是绝对定位的话, 父级要用相对定位。

首先, 我们说下, 绝对定位是将元素依据最近的已经定位绝对、固定或相对定位)的父元素(祖先)进行定位。

就是说, 子级是绝对定位,父亲只要是定位即可(不管父亲是绝对定位还是相对定位,甚至是固定定位都可以),就是说, 子绝父绝,子绝父相都是正确的。

因为子级是绝对定位,不会占有位置, 可以放到父盒子里面的任何一个地方。

父盒子布局时,需要占有位置,因此父亲只能是 相对定位. 

这就是子绝父相的由来。

(5)绝对定位的盒子水平或者垂直居中

加了绝对定位的盒子,margin左右auto就无效了。

定位的盒子也可以水平或者垂直居中,有一个算法(水平居中):

1.首先left50%(父盒子的一半大小)

2.然后设置外边距自己盒子大小负的一半值就可以了。margin-left: -width/2;

## 固定定位fixed(认死理型)

固定定位是绝对定位的一种特殊形式,它以浏览器窗口作为参照物来定义网页元素。当position属性的取值为fixed时,即可将元素的定位模式设置为固定定位。

当对元素设置固定定位后,它将脱离标准文档流的控制,始终依据浏览器窗口来定义自己的显示位置。不管浏览器滚动条如何滚动也不管浏览器窗口的大小如何变化,该元素都会始终显示在浏览器窗口的固定位置。

固定定位有两点:

1.固定定位的元素跟父亲没有任何关系,只认浏览器。

2.固定定位完全脱标,不占有位置,不随着滚动条滚动。

2.固定定位要设置宽度和高度,除非有内容把它撑开不用写。

## 叠放次序(z-index)

当对多个元素同时设置定位时,定位元素之间有可能会发生重叠。

在CSS中,要想调整重叠定位元素的堆叠顺序,可以对定位元素应用z-index层叠等级属性,其取值可为正整数、负整数和0。

比如:  z-index: 2;

注意:

1.z-index的默认属性值是0,取值越大,定位元素在层叠元素中越居上。

2.如果取值相同,则根据书写顺序,后来居上。

3.后面数字一定不能加单位。

4.只有相对定位,绝对定位,固定定位有此属性,其余标准流,浮动,静态定位都无此属性,亦不可指定此属性。

# 四种定位总结

| 定位模式        | 是否脱标占有位置  | 是否可以使用边偏移 | 移动位置基准      |

| ------------ | ---------- | --------- | ----------- |

| 静态static    | 不脱标,正常模式  | 不可以      | 正常模式        |

| 相对定位relative | 不脱标,占有位置  | 可以        | 相对自身位置移动    |

| 绝对定位absolute | 完全脱标,不占有位置 | 可以        | 相对于定位父级移动位置 |

| 固定定位fixed    | 完全脱标,不占有位置 | 可以        | 相对于浏览器移动位置  |

# 定位模式转换

跟 浮动一样, 元素添加了 绝对定位和固定定位之后, 元素模式也会发生转换, 都转换为 行内块模式, 因此 比如 行内元素 如果添加了 绝对定位或者 固定定位后,可以不用转换模式,直接给高度和宽度就可以了。

# 元素的显示与隐藏

在CSS中有三个显示和隐藏的单词比较常见,我们要区分开,他们分别是 display visibility 和 overflow。

他们的主要目的是让一个元素在页面中消失,但是不在文档源码中删除。 最常见的是网站广告,当我们点击类似关闭不见了,但是我们重新刷新页面,它们又会出现和你玩躲猫猫!!

## display 显示

display 设置或检索对象是否及如何显示。

display : none 隐藏对象 与它相反的是 display:block 除了转换为块级元素之外,同时还有显示元素的意思。

特点: 隐藏之后,不再保留位置。

## visibility 可见性

设置或检索是否显示对象。

visible :  对象可视

hidden :  对象隐藏

特点: 隐藏之后,继续保留原有位置。(停职留薪)

## overflow 溢出

检索或设置当对象的内容超过其指定高度及宽度时如何管理内容。

visible :  不剪切内容也不添加滚动条。

auto :   超出自动显示滚动条,不超出不显示滚动条

hidden :  不显示超过对象尺寸的内容,超出的部分隐藏掉

scroll :  不管超出内容否,总是显示滚动条

# CSS高级技巧

## CSS用户界面样式

 所谓的界面样式, 就是更改一些用户操作样式, 比如 更改用户的鼠标样式, 表单轮廓等。但是比如滚动条的样式改动受到了很多浏览器的抵制,因此我们就放弃了。 防止表单域拖拽

### 鼠标样式cursor

 设置或检索在对象上移动的鼠标指针采用何种系统预定义的光标形状。 

```html

cursor :  default  小白 | pointer  小手  | move  移动  |  text  文本

```

<ul>

    <li style="cursor:default">我是小白</li>

    <style="cursor:pointer">我是小手</li> 

<ul />

 尽量不要用hand  因为 火狐不支持    pointer ie6以上都支持的尽量用

### 轮廓 outline

 是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。

~~~css

 outline : outline-color ||outline-style || outline-width 

~~~

 但是我们都不关心可以设置多少,我们平时都是去掉的。

最直接的写法是 :  outline: 0; 

### 防止拖拽文本域resize

resize:none    这个单词可以防止 火狐 谷歌等浏览器随意的拖动 文本域。

右下角可以拖拽: 

<textarea></textarea>

右下角不可以拖拽: 

```html

<textarea  style="resize: none;">

```

## vertical-align 垂直对齐

以前我们讲过让带有宽度的块级元素居中对齐,是margin: 0 auto; 或者div{

    width:200px;

    height:100px;

    margin-left:auto;

    margin-right:auto;    

}

以前我们还讲过让文字居中对齐,是 text-align: center;

vertical-align 垂直对齐(对块级元素无效), 这个看上去很美好的一个属性, 实际有着不可捉摸的脾气,否则我们也不会这么晚来讲解。

设置或检索对象内容的垂直对其方式。 

vertical-align 不影响块级元素中的内容对齐,它只针对于 行内元素或者行内块元素,特别是行内块元素, 通常用来控制图片/表单与文字的对齐。

所以我们知道,我们可以通过vertical-align 控制图片和文字的垂直关系了。 默认的图片会和文字基线对齐。

### 去除图片底侧空白缝隙

有个很重要特性你要记住: 图片或者表单等行内块元素,他的底线会和父级盒子的基线对齐。 这样会造成一个问题,就是图片底侧会有一个空白缝隙。

解决的方法就是: 

1.给img vertical-align:middle | top等等。  让图片不要和基线对齐。

2.给img 添加 display:block; 转换为块级元素就不会存在问题了。

溢出文字的隐藏

word-break:自动换行

normal 使用浏览器默认的换行规则;

break-all 允许在单词内换行(允许单词拆开显示)。

keep-all 只能在半角空格或连字符处换行(不予许单词拆开显示,除非连字符-或者空格)。

主要处理英文单词。

white-space

white-space设置或检索对象内文本显示方式。通常我们使用于强制一行显示内容。

normal: 默认处理方式。

nowrap: 强制在同一行内显示所有文本,直到文本结束或者遭遇br标签对象才换行。

text-overflow

text-overflow:clip | ellipsis

设置或检索是否使用一个省略标记(...)标示对象内文本的溢出。

clip: 不显示省略标记(...),而是简单的裁切。

ellipsis: 当对象内文本溢出时显示省略标记(...)。

注意一定要首先强制一行内显示,再次和overflow属性搭配使用。


##多行文本溢出隐藏,显示省略号

针对webkit内核浏览器做法:

通用制作方法:



## CSS精灵技术(sprite)

### 精灵技术产生的背景

当用户访问一个网站时,需要向服务器发送请求,网页上的每张图像都要经过一次请求才能展现给用户。

然而,一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接受和发送请求,这将大大降低页面的加载速度。为了有效地减少服务器接受和发送请求的次数,提高页面的加载速度,出现了CSS精灵技术(也称CSS Sprites、CSS雪碧)。

### 精灵技术本质

简单地说,CSS精灵是一种处理网页背景图像的方式。它将一个页面涉及到的所有零星背景图像都集中到一张大图中去,然后将大图应用于网页,这样,当用户访问该页面时,只需向服务发送一次请求,网页中的背景图像即可全部展示出来。通常情况下,这个由很多小的背景图像合成的大图被称为 精灵图,

### 精灵技术的使用

CSS 精灵其实是将网页中的一些背景图像整合到一张大图中(精灵图),然而,各个网页元素通常只需要精灵图中不同位置的某个小图,要想精确定位到精灵图中的某个小图,就需要使用CSS的background-image、background-repeat和background-position属性进行背景定位,其中最关键的是使用background-position属性精确地定位。

## 字体图标

图片是有诸多优点的,但是缺点很明显,比如图片不但增加了总文件的大小,还增加了很多额外的"http请求",这都会大大降低网页的性能的。更重要的是图片不能很好的进行“缩放”,因为图片放大和缩小会失真。 我们后面会学习移动端响应式,很多情况下希望我们的图标是可以缩放的。此时,一个非常重要的技术出现了,额不是出现了,是以前就有,是被从新"宠幸"啦。。 这就是字体图标(iconfont).


### 字体图标优点

```

可以做出跟图片一样可以做的事情,改变透明度、旋转度,等..

但是本质其实是文字,可以很随意的改变颜色、产生阴影、透明效果等等...

本身体积更小,但携带的信息并没有削减。

几乎支持所有的浏览器

移动端设备必备良药...

```

#### 上传生成字体包

   当UI设计人员给我们svg文件的时候,我们需要转换成我们页面能使用的字体文件, 而且需要生成的是兼容性的适合各个浏览器的。

​    推荐网站: http://icomoon.io

**icomoon字库**

IcoMoon成立于2011年,推出的第一个自定义图标字体生成器,它允许用户选择他们所需要的图标,使它们成一字型。 内容种类繁多,非常全面,唯一的遗憾是国外服务器,打开网速较慢。

   推荐网站: http://www.iconfont.cn/

**阿里icon font字库**

http://www.iconfont.cn/

这个是阿里妈妈M2UX的一个icon font字体图标字库,包含了淘宝图标库和阿里妈妈图标库。可以使用AI制作图标上传生成。 一个字,免费,免费!!

**fontello**

[http://fontello.com/](http://fontello.com/)

在线定制你自己的icon font字体图标字库,也可以直接从GitHub下载整个图标集,该项目也是开源的。

**Font-Awesome**

[http://fortawesome.github.io/Font-Awesome/](http://fortawesome.github.io/Font-Awesome/)

这是我最喜欢的字库之一了,更新比较快。目前已经有369个图标了。

**Glyphicon Halflings**

[http://glyphicons.com/](http://glyphicons.com/)

这个字体图标可以在Bootstrap下免费使用。自带了200多个图标。

**Icons8**

[https://icons8.com/](https://icons8.com/)

提供PNG免费下载,像素大能到500PX

#### 下载兼容字体包

刚才上传完毕, 网站会给我们把UI做的svg图片转换为我们的字体格式, 然后下载下来就好了

当然,我们不需要自己专门的图标,是想网上找几个图标使用,以上2步可以直接省略了, 直接到刚才的网站上找喜欢的下载使用吧。

#### 字体引入到HTML

最后一步,是最重要的一步了, 就是字体文件已经有了,我们需要引入到我们页面中。

1.首先把 以下4个文件放入到 fonts文件夹里面。 通俗的做法


   ### 第一步:在样式里面声明字体:告诉别人我们自定义字体


 ### 第二步:给盒子使用字体


 ### 第三步:给盒子里面添加结构


### 核心技术

核心技术就是利用CSS精灵(主要是背景位置)和盒子padding撑开宽度, 以便能适应不同字数的导航栏。

一般的经典布局都是这样的:

<li>

    <a href="#">

    <span>导航栏内容</span>

    </a>

</li>

总结: 

1.a 设置 背景左侧,padding撑开合适宽度。   

2.span 设置背景右侧, padding撑开合适宽度 剩下由文字继续撑开宽度。

3.之所以a包含span就是因为 整个导航都是可以点击的。

before和after伪元素(详解) 

之所以被称为伪元素,是因为他们不是真正的页面元素,html没有对应的元素,但是其所有用法和表现行为与真正的页面元素一样,可以对其使用诸如页面元素一样的css样式,表面上看上去貌似是页面的某些元素来展现,实际上是css样式展现的行为,因此被称为伪元素。伪元素在html代码机构中的展现,可以看出伪元素的结构是无法审查的。

注意:

1.伪元素:before和:after添加的内容默认是inline元素;这个两个伪元素的content属性,表示伪元素的内容,设置:before和:after时必须设置其content属性,否则伪元素就不起作用。

2.类选择器和伪类选择器是选取对象,而伪元素选择器本质上是插入一个元素(标签 盒子)

3.要伪元素不占位置,就用绝对定位。

## 过渡(CSS3)

过渡(transition)是CSS3中具有颠覆性的特征之一,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果。

在CSS3里使用transition可以实现补间动画(过渡效果),并且当前元素只要有“属性”发生变化时即存在两种状态(我们用A和B代指),就可以实现平滑的过渡,为了方便演示采用hover切换两种状态,但是并不仅仅局限于hover状态来实现过渡。

语法格式:

~~~

transition: 要过渡的属性  花费时间  运动曲线  何时开始;

如果有多组属性变化,还是用逗号隔开。

~~~

## 2D变形(CSS3)

转换是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、变形、缩放,甚至支持矩阵方式,配合过渡和即将学习的动画知识,可以取代大量之前只能靠Flash才可以实现的效果。

变形转换 transform 

-移动 translate(x, y) 

```css

translate(50px,50px);

```

使用translate方法来将文字或图像在水平方向和垂直方向上分别垂直移动50像素。

可以改变元素的位置,x、y可为负值;

~~~

 translate(x,y)水平方向和垂直方向同时移动(也就是X轴和Y轴同时移动)

 translateX(x)仅水平方向移动(X轴移动)

 translateY(Y)仅垂直方向移动(Y轴移动)

~~~


transform-origin可以调整元素转换变形的原点


 缩放 scale(x, y) 


```css

transform:scale(0.8,1);

```

可以对元素进行水平和垂直方向的缩放。该语句使用scale方法使该元素在水平方向上缩小了20%,垂直方向上不缩放。

~~~

scale(X,Y)使元素水平方向和垂直方向同时缩放(也就是X轴和Y轴同时缩放)

scaleX(x)元素仅水平方向缩放(X轴缩放)

scaleY(y)元素仅垂直方向缩放(Y轴缩放)

~~~

 scale()的取值默认的值为1,当值设置为0.01到0.99之间的任何值,作用使一个元素缩小;而任何大于或等于1.01的值,作用是让元素放大

-旋转 rotate(deg) 

可以对元素进行旋转,正值为顺时针,负值为逆时针;

~~~css

transform:rotate(45deg);

~~~

1.当元素旋转以后,坐标轴也跟着发生的转变

2.调整顺序可以解决,把旋转放到最后

3.注意单位是 deg 度数

倾斜 skew(deg, deg) 

```css

transform:skew(30deg,0deg);

```

该实例通过skew方法把元素水平方向上倾斜30度,处置方向保持不变。

可以使元素按一定的角度进行倾斜,可为负值,第二个参数不写默认为0。

## 3D变形

###  rotateX() 

 就是沿着 x 立体旋转.

~~~css

img {

  transition:all 0.5s ease 0s;

}

img:hove {

  transform:rotateX(180deg);

}

~~~

### rotateY()

沿着y轴进行旋转

### rotateZ()�

沿着z轴进行旋转

### 透视(perspective)

电脑显示屏是一个2D平面,图像之所以具有立体感(3D效果),其实只是一种视觉呈现,通过透视可以实现此目的。

透视可以将一个2D平面,在转换的过程当中,呈现3D效果。


注:并非任何情况下需要透视效果,根据开发需要进行设置。

perspective有两种写法

1.作为一个属性,设置给父元素,作用于所有3D转换的子元素

2.作为transform属性的一个值,做用于元素自身

### translateZ(z)

transformZ的直观表现形式就是大小变化,实质是XY平面相对于视点的远近变化(说远近就一定会说到离什么参照物远或近,在这里参照物就是perspective属性)。比如设置了perspective为200px;那么transformZ的值越接近200,就是离的越近,看上去也就越大,超过200就看不到了,因为相当于跑到后脑勺去了,我相信你正常情况下,是看不到自己的后脑勺的。


backface-visibility

属性定义当元素不面向屏幕时是否可见。

###  3D呈现(transform-style)

transform-style属性是3D空间一个重要属性,指定嵌套元素如何在3D空间中呈现。他主要有两个属性值:flat和preserve-3d。

其中flat为默认值,表示所有子元素在2d平面呈现。preserve-3d表示所有子元素在3D空间中呈现。

flat:所有子元素在 2D 平面呈现

preserve-3d:保留3D空间

3D元素构建是指某个图形是由多个元素构成的,可以给这些元素的父元素设置transform-style: preserve-3d来使其变成一个真正的3D图形。

一般而言,该声明应用在3D变换的兄弟元素们的父元素上。

## 动画(CSS3)

动画是CSS3中具有颠覆性的特征之一,可通过设置多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果。

语法格式:

~~~css

animation:动画名称 动画时间 运动曲线  何时开始  播放次数  是否反方向;

~~~


关于几个值,除了名字,动画时间,延时有严格顺序要求其它随意r

~~~css

@keyframes 动画名称 {

  from{ 开始位置 }  0%

  to{  结束  }  100%

}

~~~

~~~

animation-iteration-count:infinite;  无限循环播放

animation-play-state:paused;  暂停动画"

~~~


伸缩布局(css3)

主轴:Flex容器的主轴主要用来配置Flex项目,默认是水平方向。

侧轴:与主轴垂直的轴称作侧轴,默认值垂直方向。

方向:默认主轴从左往右,侧轴默认从上往下。

主轴和侧轴并不是固定不变的,通过flex-diretion可以互换


各属性详解

1.flex子项目在主轴的缩放比例,不指定flex属性,则不参与伸缩分配。

min-width:最小值。

max-width:1280px, 最大宽度

2.flex-direction调整主轴方向(默认为水平方向)

flex-direction:column 垂直排列

flex-direction:row 水平排列

3.justify-content调整主轴对齐

4.align-items调整侧轴对齐


5.flex-wrap控制是否换行


6.align-content堆栈(由flex-wrap产生的独立行)对齐

align-content是针对flex容器里面多轴(多行)的情况,align-items是针对一行的情况进行排列。

必须对父元素设置自由盒属性display:flex,并且设置排列方式为横向排列flex-direction:row;并且设置换行,flex-wrap:wrap;这样这个属性的设置才会起作用。


7.flex-flow是flex-direction、flex-wrap的简写。

flex-flow:flex-direction flex-wrap;


8.order控制子项目的排列顺序,正序方式排序,从小到大。

用css来控制盒子的前后顺序。用order就可以了。

用整数值来定义排列顺序,数值小的排在前面。可以为负值。默认值是0

order:1;

##BFC(块级格式化上下文)

BFC它是一个独立的渲染区域,只有block-level box参与,它规定了内部的block-level box如何布局,并且与这个区域外部毫不相干。

1.1元素的显示模式

前面讲过元素的显示模式display。分为块级元素 行内元素 行内块元素,其实,它还有很多其他显示模式。


1.2哪些元素会具有BFC的条件

不是所有的元素模式都能产生BFC,W3C规范:

display属性为block, list-item, table的元素,会产生BFC.

大家有没有发现这三个都是用来布局最为合理的元素,因为他们就是用来可视化布局。

注意其他的,display属性,比如line等等,他们创建的是IFC,

这个BFC有着具体的布局特性:


有宽度和高度,有外边距margin有内边距padding 有边框border 

1.3什么情况下可以让元素产生BFC

给元素添加如下属性就可以触发BFC:

-float属性不为none。

-position为absolute或fixed。

-display为inline-block, table-cell, table-caption, flex, inline-flex。

-overflow不为visible。

1.4BFC元素所具有的特性

BFC布局规则特性:

1.在BFC中,盒子从顶端开始垂直的一个接一个的排列。

2.在盒子垂直方向的距离由margin决定。属于同一个BFC的两个相邻盒子的margin会发生重叠。

3.在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘)。

4.BFC的区域不会与浮动盒子产生交集。

5.计算BFC的高度时,自然也会检测浮动的盒子高度。

它是一个独立的渲染区域,只有Block-level box参与,它规定了内部的Block-level box如何布局,并且与这个区域外部毫不相干。

1.5BFC的主要用途

BFC能用来做什么?

(1)清除元素内部浮动

只要把父元素设置为BFC就可以清理子元素的浮动了,最常见的用法就是在父元素上设置overflow:hidden样式,对于IE6加上zoom:1就可以了。

(2)解决外边距合并问题

外边距合并的问题

属于同一个BFC的两个相邻的盒子的margin会发生重叠,那么我们创建不属于同一个BFC,就不会发生重叠了。

(3)制作右侧自适应的盒子问题

普通流体元素BFC后,为了和浮动元素不产生任何交集,顺着浮动边缘形成自己的封闭上下文。

1.6BFC总结

BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。包括浮动和外边距合并等等,因此,有了这个特性,我们布局的时候就不会出现意外情况了。

2.nav导航栏所用知识点

3.浏览器前缀

4.背景渐变

在线性渐变过程中,颜色沿着一条直线过渡:从左侧到右侧、从右侧到左侧、从顶部到底部、从底部到顶部或者沿任何任意轴。

兼容性问题很严重,我们这里只讲解线性渐变。

语法格式:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • CSS基础 本文包括CSS基础知识选择器(重要!!!)继承、特殊性、层叠、重要性CSS格式化排版单位和值盒模型浮动...
    廖少少阅读 3,066评论 0 40
  • 一.CSS描述 CSS全称为“层叠样式表(Cascading Style Sheets)”,它主要是用于定义HTM...
    snowy_sunny阅读 1,061评论 0 4
  • CSS格式化排版 1、字体 我们可以使用css样式为网页中的文字设置字体、字号、颜色等样式属性。下面我们来看一个例...
    张文靖同学阅读 1,281评论 0 3
  • HTML 软件架构 C/S:C(客户端,用户通过客户端来使用软件),S表示服务器。一般软件都是C/S架构。软件使用...
    小土豆dy阅读 1,282评论 0 5
  • 主语: 晋 陶潜 《拟古》诗之六:“ 稷下 多谈士,指彼决吾疑。”南朝 梁 刘协 《文心雕龙·时序》:“故 稷下 ...
    Peregrination阅读 245评论 0 0