一、css的引入方式
1、css介绍
现在的互联网前端分三层:
- HTML:超文本标记语言。从语义的角度描述页面结构。
- CSS:层叠样式表。从审美的角度负责页面样式。
- JS:JavaScript 。从交互的角度描述页面行为
CSS:Cascading Style Sheet,层叠样式表。CSS的作用就是给HTML页面标签添加各种样式,定义网页的显示效果。简单一句话:CSS将网页内容和显示样式进行分离,提高了显示功能。
css的最新版本是css3,我们目前学习的是css2.1。
2、为什么要使用CSS
HTML的缺陷:
1)不能够适应多种设备
2)要求浏览器必须智能化足够庞大
3)数据和显示没有分开
4)功能不够强大
CSS 优点:
1)使数据和显示分开
2)降低网络流量
3)使整个网站视觉效果一致
4)使开发效率提高了(耦合性降低,一个人负责写html,一个人负责写css)
比如说,有一个样式需要在一百个页面上显示,如果是html来实现,那要写一百遍,现在有了css,只要写一遍。现在,html只提供数据和一些控件,完全交给css提供各种各样的样式。
3、在HTML中引入css方式总共有三种:
1)行内样式
<div> <p style="color: green">我是一个段落</p> </div>
2)内接样式
mime类型:MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title标签</title>
<!--mime 文件类型-->
<style type="text/css">
p {
color: green;
}
</style>
</head>
<body>
<p>段落</p>
</body>
</html>
3)外接样式:链接式
/*css文件*/ a{ color:red }
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title标签</title>
<link rel="stylesheet" type="text/css" href="./css/index.css">
</head>
<body>
<a href="#">百度一下</a>
</body>
</html>
4)外接样式:导入式
/*css文件*/ a{ color:red }
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title标签</title>
<style type="text/css" media="screen">
@import url("./css/index.css");
</style>
</head>
<body>
<a href="#">百度一下</a>
</body>
</html>
二、css的选择器
css的选择器:1.基本选择器 2.高级选择器
1、基本选择器
高基本选择器分为:标签选择器、id选择器、类选择器。
1)标签选择器
标签选择器可以选中所有的标签元素,比如div,ul,li ,p等等,不管标签藏的多深,都能选中,选中的是所有的,而不是某一个,所以说 "共性" 而不是 ”特性“。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title标签</title>
<style type="text/css" media="screen">
p {
color: red;
}
</style>
</head>
<body>
<p>段落</p>
</body>
</html>
2)id选择器
# 选中id
同一个页面中id不能重复。
任何的标签都可以设置id
id命名规范 要有字母 可以有数字 下划线 - 大小写严格区分 aa和AA是两个不一样的属性值
#box{
background:green;
}
#s1{
color: red;
}
#s2{
font-size: 30px;
}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title标签</title> <style type="text/css" media="screen"> #box{ color: red; } </style> </head> <body> <div id="box">段落</div> </body> </html>
3)类选择器
所谓类 就是class . class与id非常相似 任何的标签都可以加类但是类是可以重复,属于归类的概念。
同一个标签中可以携带多个类,用空格隔开。
.lv{
color: green;
}
.big{
font-size: 40px;
}
.line{
text-decoration: underline;
}
<!-- 公共类 共有的属性 --> <div> <p class="lv big">段落1</p> <p class="lv line">段落2</p> <p class="line big">段落3</p> </div>
总结:
- 不要去试图用一个类将我们的页面写完。这个标签要携带多个类,共同设置样式
- 每个类要尽可能的小,有公共的概念,能够让更多的标签使用
到底使用id还是用class?
答案:尽可能的用class。除非一些特殊情况可以用id
原因:id一般是用在js的。也就是说 js是通过id来获取到标签
2、高级选择器
高级选择器分为:后代选择器、子代选择器、并集选择器、交集选择器。
1)后代选择器
使用空格表示后代选择器。顾名思义,父元素的后代。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css" media="screen"> #box p { color: red; } </style> </head> <body> <div id="box"> <p>段落</p> </div> </body> </html>
2)子代选择器
使用>表示子代选择器。比如div>p,仅仅表示的是当前div元素选中的子代。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css" media="screen"> #box>p { color: red; } </style> </head> <body> <div id="box"> <p>段落1</p> <div id="box2"> <p>段落2</p> </div> </div> </body> </html>
3)并集选择器
多个选择器之间使用逗号隔开。表示选中的页面中的多个标签。一些共性的元素,可以使用并集选择器。
/*并集选择器*/
h3,a{
color: #008000;
text-decoration: none;
}
比如像百度首页使用并集选择器。
body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td {
margin: 0;
padding: 0
}
/*使用此并集选择器选中页面中所有的标签,页面布局的时候会使用*/
4)交集选择器
使用.表示交集选择器。第一个标签必须是标签选择器,第二个标签必须是类选择器。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css" media="screen"> span { color: red; } span.aaa { color: green; } </style> </head> <body> <span class="aaa">哈哈哈</span> <span>哈哈哈</span> <span>哈哈哈</span> <span>哈哈哈</span> <span>哈哈哈</span> </body> </html>
3、属性选择器
属性选择器,字面意思就是根据标签中的属性,选中当前的标签。
/*根据属性查找*/
/*[for]{
color: red;
}*/
/*找到for属性的等于username的元素 字体颜色设为红色*/
/*[for='username']{
color: yellow;
}*/
/*以....开头 ^*/
/*[for^='user']{
color: #008000;
}*/
/*以....结尾 $*/
/*[for$='vvip']{
color: red;
}*/
/*包含某元素的标签*/
/*[for*="vip"]{
color: #00BFFF;
}*/
/**/
/*指定单词的属性*/
label[for~='user1']{
color: red;
}
input[type='text']{
background: red;
}
4、伪类选择器
伪类选择器一般会用在超链接a标签中,使用a标签的伪类选择器,我们一定要遵循"爱恨准则" LoVe HAte。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css" media="screen"> /*没有被访问的a标签的样式*/ .box ul li.item a:link { color: green; } /*访问过后的a标签的样式*/ .box ul li.item a:visited { color: yellow; } /*访问过后的a标签的样式*/ .box ul li.item a:hover { color: blue; } /*访问过后的a标签的样式*/ .box ul li.item a:active { color: yellowgreen; } </style> </head> <body> <div class="box"> <ul> <li class="item"> <a href="#" title="">百度</a> </li> </ul> </div> </body> </html>
介绍一种css3的选择器nth-child():
/*选中第一个元素*/
div ul li:first-child{
font-size: 20px;
color: red;
}
/*选中最后一个元素*/
div ul li:last-child{
font-size: 20px;
color: yellow;
}
/*选中当前指定的元素 数值从1开始*/
div ul li:nth-child(3){
font-size: 30px;
color: purple;
}
/*n表示选中所有,这里面必须是n, 从0开始的 0的时候表示没有选中*/
div ul li:nth-child(n){
font-size: 40px;
color: red;
}
/*偶数*/
div ul li:nth-child(2n){
font-size: 50px;
color: gold;
}
/*奇数*/
div ul li:nth-child(2n-1){
font-size: 50px;
color: yellow;
}
/*隔几换色 隔行换色
隔4换色 就是5n+1,隔3换色就是4n+1
*/
div ul li:nth-child(5n+1){
font-size: 50px;
color: red;
}
三、盒模型
1、盒模型
1)介绍
在CSS中,"box model"这一术语是用来设计和布局时使用,然后在网页中基本上都会显示一些方方正正的盒子。我们称为这种盒子叫盒模型。
盒模型有两种:标准模型和IE模型。我们在这里重点讲标准模型。
2)盒模型示意图
3)盒模型的属性
width:内容的宽度
height: 内容的高度
padding:内边距,边框到内容的距离
border: 边框,就是指的盒子的宽度
margin:外边距,盒子边框到附近最近盒子的距离
4)盒模型计算
如果一个盒子设置了padding,border,width,height,margin(先不要设置margin)
盒子的真实宽度=width+2*padding+2*border
盒子的真实宽度=height+2*padding+2*border
2、padding(内边距)
1)padding
padding:就是内边距的意思,它是边框到内容之间的距离
另外padding的区域是有背景颜色的。并且背景颜色和内容的颜色一样。也就是说background-color这个属性将填充所有的border以内的区域。
2)padding的设置
padding有四个方向,分别描述4个方向的padding。
描述的方法有两种
写小属性,分别设置不同方向的padding:
padding-top: 30px;
padding-right: 30px;
padding-bottom: 30px;
padding-left: 30px;
写综合属性,用空格隔开:
/*上 右 下 左*/
padding: 20px 30px 40px 50px ;
/*上 左右 下*/
padding: 20px 30px 40px;
/* 上下 左右*/
padding: 20px 30px;
/*上下左右*/
padding: 20px;
3)一些标签默认有padding
比如ul标签,有默认的padding-left值。
那么我们一般在做站的时候,是要清除页面标签中默认的padding和margin。以便于我们更好的去调整元素的位置。
我们现在初学可以使用通配符选择器
*{
padding:0;
margin:0;
}
But,这种方法效率不高。
所以我们要使用并集选择器来选中页面中应有的标签(不同背,因为有人已经给咱们写好了这些清除默认的样式表,reset.css)(https://meyerweb.com/eric/tools/css/reset/)。
3、border(边框)
1)边框
border:边框的意思,描述盒子的边框
边框有三个要素: 粗细 线性样式 颜色,例如 border: solid 就是实线的意思。
如果颜色不写,默认是黑色。如果粗细不写,不显示边框。如果只写线性样式,默认的有上下左右 3px的宽度,实体样式,并且黑色的边框。
2)按照3要素来写border
border- 3px;
border-style: solid;
border-color: red;
/*
border- 5px 10px;
border-style: solid dotted double dashed;
border-color: red green yellow;
*/
3)按照方向划分
border-top- 10px;
border-top-color: red;
border-top-style: solid;
border-right- 10px;
border-right-color: red;
border-right-style: solid;
border-bottom- 10px;
border-bottom-color: red;
border-bottom-style: solid;
border-left- 10px;
border-left-color: red;
border-left-style:solid;
上面12条语句,相当于 bordr: 10px solid red;
另外还可以这样:
border-top: 10px solid red;
border-right: 10px solid red;
border-bottom: 10px solid red;
border-left: 10pxb solid red;
border:none;
border:0;
表示border没有设置样式。
4)使用border来制作小三角
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css"> div{ width: 0; height: 0; border-bottom: 30px solid red; border-left: 30px solid transparent; border-right: 30px solid transparent; } </style> </head> <body> <div></div> </body> </html>
4、margin
margin:外边距的意思。表示边框到最近盒子的距离。
/*表示四个方向的外边距离为20px*/
margin: 20px;
/*表示盒子向下移动了30px*/
margin-top: 30px;
/*表示盒子向右移动了50px*/
margin-left: 50px;
margin-bottom: 100px;
1)margin塌陷问题
html结构:
<div class="father"> <div class="box1"></div> <div class="box2"></div> </div>
css样式:
*{ padding: 0; margin: 0; } .father{ width: 400px; overflow: hidden; border: 1px solid gray; } .box1{ width: 300px; height: 200px; background-color: red; margin-bottom: 20px;} .box2{ width: 400px; height: 300px; background-color: green; margin-top: 50px; }
效果:
当给两个标准流下兄弟盒子 设置垂直方向上的margin时,那么以较大的为准,那么我们称这种现象叫塌陷。
当我们给两个标准流下的兄弟盒子设置浮动之后,就不会出现margin塌陷的问题。
css样式:
*{ padding: 0; margin: 0; } .father{ width: 400px; overflow: hidden; border: 1px solid gray; } .box1{ width: 300px; height: 200px; background-color: red; margin-bottom: 20px; float:left; } .box2{ width: 400px; height: 300px; background-color: green; margin-top: 50px; float:left; }
效果:
2)margin:0 auto
html代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{ padding: 0; margin: 0; } div{ width: 780px; height: 50px; background-color: red; /*水平居中盒子*/ margin: 0px auto; /*水平居中文字*/ text-align: center; } </style> </head> <body> <div class="box1">文字文字文字文字</div> </body> </html>
效果:
使用margin:0 auto;注意点:
1.使用margin: 0 auto;水平居中盒子必须有width,要有明确width,文字水平居中使用text-align: center;
2.只有标准流下的盒子 才能使用margin:0 auto; (当一个盒子浮动了,固定定位,绝对定位(后面会讲),margin:0 auto; 不能用了)
3.margin:0 auto;居中盒子。而不是居中文本,文字水平居中使用text-align: center;
4.margin-left:auto;与margin-right:auto;同时使用--居中盒子。;
备注: margin属性是描述兄弟盒子的关系,而padding描述的是父子盒子的关系
3)善于使用父亲的padding,而不是margin
实现如图的效果代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{ padding: 0; margin: 0; } .father{ width: 300px; height: 300px; background-color: blue; padding-top:30px; } .box1{ width: 150px; height: 100px; background-color: red; } </style> </head> <body> <div class="father"> <div class="box1"></div> </div> </body> </html>
如果在box1中加入margin-top: 30px,因为father没有border,那么box1的margin-top实际上踹的是“流” 踹的是行,所以father掉下来了,一旦给father一个border发现就好了。
那么问题来了,我们不可能在页面中无缘无故的去给盒子加一个border,所以此时的解决方案只有一种。就是使用father的padding。让box1挤下来。
三、css的继承性和层叠性
css有两大特性:继承性和层叠性
继承性:
面向对象语言都会存在继承的概念,在面向对象语言中,继承的特点:继承了父类的属性和方法。那么我们现在主要研究css,css就是在设置属性的。不会牵扯到方法的层面。
继承:给父级设置一些属性,子级继承了父级的该属性,这就是我们的css中的继承。
记住:有一些属性是可以继承下来 : color 、 font-*、 text-*、line-* 。主要是文本级的标签元素。
但是像一些盒子元素属性,定位的元素(浮动,绝对定位,固定定位)不能继承。
层叠性:
层叠性: 权重的标签覆盖掉了权重小的标签。
权重: 谁的权重大,浏览器就会显示谁的属性。
第一种情况:(数:id的数量 class的数量 标签的数量,顺序不能乱)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title标签</title> <style type="text/css" media="screen"> <!-- 权重 --> /* id class 标签 记录个数*/ /*1 0 0*/ #pa{ color: yellow; } /*0 1 0*/ .app{ color: red; } /*0 0 1*/ p{ color: blue; } </style> </head> <body> <p id="pa" class="app">猜猜我是什么颜色</p> </body> </html>
第二种情况:权重不一样,比较大小
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css" media="screen"> <!--权重--> /*1 2 1 */ #box .wrap2 .wrap3 p{ color: red; } /*2 1 1*/ #box #box2 div .app{ color: yellow; } </style> </head> <body> <div id="box" class="wrap"> <p>段落1</p> <div id="box2" class="wrap2"> <div id="box3" class="wrap3"> <p id="pa" class="app">段落2</p> </div> </div> </div> </body> </html>
第三种情况:当权重一样的时候 是以后来设置的属性为准
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css" media="screen"> <!--权重--> /*2 1 1 */ #box #box2 .wrap3 p{ color: red; } /*2 1 1*/ #box #box2 div .app{ color: yellow; } </style> </head> <body> <div id="box" class="wrap"> <p>段落1</p> <div id="box2" class="wrap2"> <div id="box3" class="wrap3"> <p id="pa" class="app">段落2</p> </div> </div> </div> </body> </html>
第四种情况:没有选中的标签权重为0
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css" media="screen"> <!--权重--> /*2 2 0 */ #box #box2 .wrap3 .app{ color: red; } /*2 1 1*/ #box #box2 div .app{ color: yellow; } /*3 0 0 继承(没有选中)的标签权重为0*/ #box #box2 #box3{ color: green; } /*2 0 0 如果权重都为0 还要比较权重*/ #box #box2 { color: blue; } </style> </head> <body> <div id="box" class="wrap"> <p>段落1</p> <div id="box2" class="wrap2"> <div id="box3" class="wrap3"> <p id="pa" class="app">段落2</p> </div> </div> </div> </body> </html>
总结:
1.先看标签元素有没有被选中,如果选中了,就数数 (id,class,标签的数量) 谁的权重大 就显示谁的属性。权重一样大,后来者居上
2.如果没有被选中标签元素,权重为0。
如果属性都是被继承下来的 权重都是0 。权重都是0:"就近原则" : 谁描述的近,就显示谁的属性