Web前端之CSS详解20180329

一、CSS概述

html显示效果有限,所以单独成立了一门语言就做css,

css是层叠样式表,用来定义网页的显示想过,可以解决html代码对样式定义的重复,

简单来说就是,css将网页内容和显示样式进行分离,降低了耦合性,提高了显示功能。

二、css和html相结合的方式

css和html在网页代码中相结合的方式有四种:

1.style属性方式

由于每一个html标签中都有一个style样式属性,所以可以利用标签中style属性来改变每个标签的显示样式。这个属性的值就是css代码

css中的属性与属性之间用;隔开,属性与属性值之间用:隔开

例:

<p style="bakegroud-color:#ffoooo;color:#ffffff">

段落内容

</p>

该方式比较灵活,但是对于多个相同标签的同一样式定义比较麻烦,适合局部修改

2.style标签方式(内嵌方式)

使用style标签的方式,也就是在head标签中加入style标签(在head的原因,一旦加载到css修饰的标签就可以显示出样式来),对多个标签进行统一修改。

其中style标签中要指明其类型属性type的值,表明使用什么东西去解析style中的代码,

并且style中的css代码要指明修饰(作用)的是哪个区域(标签),也就是css代码还要被{}起来并在前面写明修饰的是谁(表示这段代码修饰的对象),如下所示:

<head>

<style type="text/css">

p{color:#ff0000;}

</style>

</head>

该方式可以对单个页面的样式进行统一设置,但对于局部不够灵活

当head中有style标签定义了区域的样式,同时区域标签中又用style属性定义了显示的样式,这时显示样式的过程是,由于一开始就读到区域的样式了,一旦读到区域标签就显示出head中的样式来,读完区域标签时,读到区域的属性时,这是如果有同类的显示样式则会被新的,也就是style属性中定义的样式覆盖,即以最后加载的为准。这就是样式的重叠。

3.导入方式

当多个页面引用同样的样式时,这时为了不在每个页面(html)都复制相同的css代码,则把css代码独立出来形成一个css文件,让页面进行引用,即在页面的头部中加入style标签并引用,代码如下:

<head>

<style type="text/css">

@import url(div.css);

@import url(span.css);

</style>

</head>

其中div.css和span.css为独立出来的css文件。

注意,url括号后面必须要用分号结束,如果导入进来的样式与本页面定义的样式重复,以本页定义样式为准。

如果有多条导入,那么就要导入多条,如果直接在页面中导入则会很麻烦。由于导入语句也是css代码所以可以把导入语句单独出来形成一个css文件,这样页面只需包含这个文件即可。

代码如下:

<head>

<style type="text/css">

@import url(1.css);

</style>

</head>

其中1.css中的代码如下:

@import url(div.css);

@import url(span.css);

css代码的注释符号为/**/

把div,span等类型的区域分别形成css文件的好处(按类型形成css文件),在于粒度小了,便于复用,同时每个类型又都是独立的,也不存在重复的说法,所以这么做,同时在加上综合文件,也不会影响到html页面。

4.链接方式

使用html中,head标签中的link标签来实现,将样式文件连接进来的方式

<head>

<link rel="stylesheet" href="1.css" type="text/css"/>

<style type="text/css">

/*@import url(1.css);*//*css代码注释*/

</style>

</head>

其中link 的rel属性表示链接文件与当前文件的关系,比如上例中表示连接的文件是样式表,用于显示样式

href属性指向要连接的文件

type属性表示连接进来文件的类型。

这种导入方式与前面的style导入方式不同的是,link导入是html代码链接的,style导入是通过css代码导入的。

注意,可以通过多个link标签链接进来多个css文件,重复样式以最后链接进来的css样式为准。

三、样式优先级

一般情况下,样式是会覆盖的,那么谁覆盖谁呢,其中的优先级如下:

由外到内,由上到下。优先级由低到高。

也就是说一般情况下,后面加载的为准。

之所以说一般情况下,是因为里面还涉及到一些细节的优先级问题

四、css代码格式(css代码语法)

选择器名称{属性名:属性值;属性名:属性值;...}

属性与属性之间用分号隔开

属性与属性值直接用冒号连接

如果一个属性有多个值的话,那么多个值之间用空格隔开。

其中"选择器名称"是,样式要作用的标签,表示样式要作用在哪个(种)标签上。

其中"{}"表示定义样式的区间,里面是样式的内容,内容是由属性和属性值组成。

五、CSS选择器

选择器

就是指定css要作用的标签(容器),那个标签的名称就是选择器,意为:选择哪个容器。

选择器共有三种:

I、html标签名选择器,使用的就是html的标签名。

II、class选择器。就是使用标签中的class属性。

III、id选择器,其实使用的是标签中的id属性。

每个标签都定义了class属性(专门给css样式加载的属性)和id属性,用于对标签进行标识,方便对标签进行操作。

在定义中,多个标签的class属性值可以相同,而id值要唯一,因为js中经常用。

注意,class选择器比html标签名选择器优先级高,也就是说越少数优先级越高

所以,同时id选择器的优先级又比class选择器高。那么还有更高的么,就是不用选择器的(不用加载的),直接使用标签中的style属性写css代码的,优先级更高。

也就是

优先级:

标签选择器<类选择器<id选择器<style属性

1.class选择器

在标签中定义class属性并赋值,通过 标签名.class值 对该标签进行样式设置。

相同标签设置不同样式的时候,用class进行区分。

当有十个div标签5个相同样式,另外五个又是相同样式,这时可以把五个归为一类(class属性值相同),这样来设置样式

例如:

<head>

<style type="text/css">

div{

backgroud-color:#fff;

}

div.haha{

backgroud-color:#ff3;

}

</style>

</head>

<body>

<div>555</div>

<div class="haha">123</div>

</body>

注意,不但可以对多个相同标签进行样式设定,还可以对不同标签进行相同样式设定。

对不同标签进行统一样式设定时,如果还是使用 标签名.class值 的形式,则太麻烦并且还有重复代码,解决这个问题的方法是,使用 .class值 的形式 ,表示所有class属性值相同的标签使用相同的样式,

代码如下:

.haha{

backgroud-color:#ff3;/*作用于所有class属性值为haha的标签*/

}

<div class="haha">123</div>

<span class="haha">123</span>

<p class="haha">123</p>

同时可以预定义类选择器样式,实现动态显示样式,具体实现方法:

事先定义多个class属性值的选择器(内部有css显示样式),当有需要的时候,通过修改(指定)标签中class属性为某个值,就可以显示这个class属性值对应的显示样式

.haha{

backgroud-color:#ff3;/*作用于所有class属性值为haha的标签*/

}

.hehe{

backgroud-color:#fff;/*作用于所有class属性值为haha的标签*/

}

<div class="haha">123</div>

<span class="hehe">123</span>

<p class="haha">123</p>

2.id选择器

在标签中定义id属性并赋值,通过 标签名#id值 对该标签进行样式设置。

对不同标签进行统一样式设定时,如果还是使用 标签名#id值 的形式,则太麻烦并且还有重复代码,解决这个问题的方法是,使用 #id值 的形式 ,表示所有id属性值相同的标签使用相同的样式,

通常ID的取值在页面中是唯一的,因为该属性除了给css使用,还可以被js使用。所以id通常都是为了去标识页面中一些特定区域使用的。

代码如下:

#haha{

backgroud-color:#ff3;/*作用于所有class属性值为haha的标签*/

}

<div id="haha">123</div>

3.扩展选择器

1).关联选择器

标签是可以嵌套的,要让相同标签中的不同标签显示不同样式,就可以用此选择器。

多个标签时,只操作页面中某个标签中的该标签,也可以用此选择器。

例:

p{color:#00ff00;}

/*只操作页面中p标签中的b标签*/

p b {/*关联选择器,选择器中的选择器,如果还要嵌套则在b后面加空格再加标签,如p b a*/

color:#ffooo;

}

<p>123<b>df</b>fdf</p>

2).组合选择器

对多个不同选择器(多种选择器)进行相同样式设置的时候应用此选择器。

例:

p,div{color:#ff0000;}

.haha,p b{color:#ff0000;}

<p>123</p>

<div>dff</div>

<p>123<b>df</b>fdf</p>

注:多个不同选择器要用逗号隔开。

3).伪元素(伪标签)选择器

其实就在html中预先定义好的一些选择器。称为伪元素(伪标签)。是因为css的术语。

伪元素(伪标签),不是真正的标签,代表的是标签的某些状态。伪元素必须要先去找标签,并要用这些 状态和标签相结合

伪元素(伪标签)选择器格式:

标签名:伪元素(状态)。

类名 标签名。

类名:伪元素。

都可以

a:link 超链接未点击状态。

a:visited 被访问后的状态

a:hover 光标移到超链接上的状态(未点击)

a:active 点击超链接时的状态(事件(瞬间)效果,鼠标按的时候不松开时的状态)

通常点击前和点击后的效果是一样的,

样式效果顺序,也就是加载的顺序:L(点前) - V(点后) - H(悬停) - A(瞬间)

P:first-line 段落的第一行文本,

p:first-letter 段落的第一个字母,ie6浏览器不支持

:focus 具有焦点的元素,ie6浏览器不支持,在firefox中可以看到效果(省略了前面的标签,也就是标签都支持,一般是是在文本框里面用的多,用于点击文本框时的效果)

例:

hr标签为横线

a:link{

color:#fff;

}

a:hover{

color:#fff;

}

p:first-letter{

color:#fff;

}

input:focus{/*点击文本框时,背景变为蓝色,ie6浏览器不支持*/

background-color:#09f;

}

<input type="text"/>

其他标签也支持如上这些状态,也就是其他标签也支持伪元素选择器,比如:

div:hover{/*ie6浏览器不支持*/

color:#fff;

}

css api手册有所有的

六、css样式的结合应用

1.无序项目列表与 css样式的结合应用

ul标签:无序项目列表(类似word上的项目)

li标签: ul的子项

ul{

list-style-type:none;

list-style-image:url(1.bmp);/*ul中的每一项前面的符号为1.bmp图片*/

}

<ul>

<li>无序项目列表</li>

<li>无序项目列表</li>

<li>无序项目列表</li>

</ul>

2.表格与css样式的结合应用

table{

border-bottom:#0C0 double 3px;

border-left:#F00 solid 3px;

border-right:#FF0 dashed 3px;

border-top:#0C0 groove 3px;

width:500px;

}

table td{

border:#0CF  dotted 1px;

padding:20px;/*类似表格标签中的cellpadding属性*/

}

<table>

<tr>

<td>单元格一</td>

<td>单元格一</td>

</tr>

<tr>

<td>单元格一</td>

<td>单元格一</td>

</tr>

</table>

其中的边框,也就是border不光表格有div也有,也就是只要是区域都有,如:

div{

border:#F00 solid 3px;

height:200px;

width:400px;

}

3.输入文本框与css样式的结合应用

input {

border:none;

border-bottom:#000 1px solid;

}

.haha{/*形成可输入数据的表格*/

border:none;

}

姓名:<input type="text"  />成绩:<input type="text"  />

<table>

<tr>

<td><input type="text" class="haha" /></td>

<td><input type="text" class="haha" /></td>

</tr>

<tr>

<td>单元格一</td>

<td>单元格一</td>

</tr>

</table>

4.滤镜

和ps中类似,就是已经将某些常见的效果进行了封装,只要导入数据,立马就能显示效果。

css中的滤镜,在很多框架中已经封装好了

在网页中的图片的变换,都是可以通过滤镜做的,如滤镜中的fade

css api手册有所有的

七、css的盒子模型

div加css可以完成布局,并且比表格的方式灵活的多,所以现在最流行的就是div加css。

使用div加css完成布局时,首先要的就是把数据放到各个div区域中,这个区域就叫盒子,

具体来说,

用来封装数据的一片区域就叫css的盒子,

css盒子模型的基本内容有三项,

1).边框:border

上border-top

下border-bottom

左border-left

右border-right

2).内边距:padding(当盒子中数据太少时,可能下边距和右边距就不是该属性值了;

如果是两个属性值,则第一个是上下边距,第二个是左右边距,例:padding:20px 100px

如果是三个属性值,则第一个是上边距,第二个是左右边距,第三个是下边距例:padding:20px 100px 200px

如果是四个属性值,则第一个是上边距,第二个是右边距,第三个是下边距例,第一个是左边距:padding:20px 100px 200px 300px)

上padding-top

下padding-bottom

左padding-left

右padding-right

3).外边距:margin(所谓外边距,就是盒子距离其他盒子的距离,即盒子之间的距离,倘若某个方向上没有盒子,则表示的是距离整个页面边框(其实是body标签)的距离。当限定了盒子的高度和宽度时,可能下边距和右边距就不是该属性值了;)

上margin-top

下margin-bottom

左margin-left

右margin-right

注意当区域margin:0px时,会发现区域距离页面上边框还有一段距离,这是正是因为区域的外边距是和body之间的距离,而body距离页面上边框还有一段固定的距离,所以会这样。解决的方法是,

改变body的样式:

body{

margin:0px

}

代码如下:

/*

body{

margin:0px;

}

*/

div{

border:#09F solid 1px;

height:100px;

width:200px;/**/

}

#div_1{

/*border-bottom:#F60 2px dashed;*/

background-color:#F90;

/*padding:20px 100px 200px 300px;上 右 下 左

margin:0px;*/

float:left;

}

#div_2{

background-color:#0CF;

float:left;

}

#div_3{

background-color:#3F0;8

clear:left;/**/

}

<div id="div_1">

第一个盒子11第一个盒子11

</div>

<div id="div_2">

第二个盒子22

</div>

<div id="div_3">

第三个盒子33

</div>

八、css的布局

每一div区域都是一个块区域并带了换行。

布局,就涉及到布局属性

1.css的布局-漂浮(float属性)

属性值left:文本(定义了该属性的标签(选择器)的下一个标签(选择器/区域))流向对象(定义了该属性的标签(选择器))的右边,即当前对象(定义了该属性的标签(选择器))定义在最左边

属性值right:文本流向对象(标签(选择器))的左边

代码:

#div_1{

/*border-bottom:#F60 2px dashed;*/

background-color:#F90;

/*padding:20px 100px 200px 300px;上 右 下 左

margin:0px;*/

float:left;

}

漂浮可以让默认竖排列的变成横排列。

相对应的,还有清楚漂浮的属性:clear

clear:

属性值none 默认值,允许当前对象(定义了该属性的标签(选择器))两边都可以有浮动对象

left 不允许左边有浮动对象

right 不允许右边有浮动对象

both 都不允许

漂浮可以觉得标签(区域)排序的问题,但是漂浮要根据元素位置来确定漂浮的位置,相对来说(定位)位置不够准确,要微调。

手册上也有示例。

2.css的布局-定位

使用position属性,也就是定位属性,可以让盒子处于页面中的任意位置。

属性值,

static 无特殊定位遵循html规则

absolute 将对象(当前标签(选择器))从文档流中拖出,也就是说当前对象从当前图层脱离出来,形成新的图层,(重叠的部分)新的图层会覆盖当前图层,被脱离出来的当前对象再通过left top等属性就可以确定其在新图层中的位置。如果有程序修改left top值就会导致当前对象位置不断变化,也就是当前对象会动起来。

其中left top等属性相对的是最接近的并且定义了absolute的父对象(父节点(标签)),如果都没有的话,那么就依据(相对)body对象。

relative:对象不可层叠(absolute 可以重叠),但依据left ,right,top,bottom等属性在正常的文档流中偏移位置,也就是说,产生新图层后,当前对象在旧图层的位置依然保留,其他对象不会去占用那个保留的位置。

同时也符合规则:

left top等属性相对的是最接近的并且定义了absolute的父对象(父节点(标签)),如果都没有的话,那么就依据(相对)body对象。

代码如下:

#div_0{

background-color:#CCC;

height:400px;

width:400px;

position:relative;

top:100px;

left:100px;

}

#div_1{

background-color:#F90;

position:relative;

top:20px;

}

#div_2{

background-color:#0CF;

width:220px;

}

#div_3{

background-color:#3F0;8

}

<div id="div_0">

<div id="div_1">

第一个盒子11第一个盒子11

</div>

<div id="div_2">

第二个盒子22

</div>

<div id="div_3">

第三个盒子33

</div>

</div>

3.css的布局-图文混排

先将数据用标签进行封装

代码如下:

#imgtext{

border:#06F dashed 1px;

width:180px;

}

#img{

float:right;

}

#text{

color:#F60;

font-family:"华文隶书";

}

<div id="imgtext">

<div id="img">

<img src="9.bmp" />

</div>

<div id="text">

这是一个美女,说明文字。

一切尽在不言中。哇

!这是一个美女,说明文字。

一切尽在不言中。哇!

这是一个美女,说明文字。

一切尽在不言中。哇!

</div>

</div>

4.css的布局-图像签名

需要用到定位属性,最好当前定位属性的对象的父对象也是定位属性的,这样移动整个区域(父对象),当前定位属性也是定位的。

代码如下:

#text{

font-family:"华文隶书";

font-size:24px;

position:absolute;

top:80px;

left:10px;

}

#imgtext{

border:#F60 dotted 1px;

width:500px;

position:absolute;

top:100px;

}

<div id="imgtext">

<div id="img">

<img src="1.jpg" height="300" width="500" />

</div>

<div id="text">

花丛中的美女,我的!

</div>

</div>

效果会导致文本文字显示在图片,但是很显然,下载图片下来的时候文本是不会在图片上的。

上一篇:C++ notes for beginners(2)


下一篇:Web前端之iframe详解