1. CSS简介
CSS是指层叠样式表,样式定义如何显示html元素
1)CSS的优势
- 内容与表现分离
- 网页的表现统一,容易修改
- 丰富的样式,使页面布局更加灵活
- 减少网页的代码量,增加网页浏览器速度,节省网络带宽
- 运用独立页面的css,有利于网页被搜索引擎收录
2)css的四种引入方式
(1)行内式,直接在html标签中添加(不推荐使用)
<p style="background-color:black;color:white">Steve</p>
(2)嵌入式,在head中添加<style></style>,标签选择器,如果是用id在定位标签,则用#开头:
<style>
p{
background-color:black;
color:white
}
div{
background-color:red;
color:white;
width:300px;
height:150px
}
</style>
(3)导入式,在html页面的head标签,通过import方式将css文件导入(有数量限制):
<style>
@import "CSS_Style.css";
</style>
(4)链接式,在html页面的head标签,通过link方式将css文件引入(无数量限制):
<style>
<link href="CSS_Style.css" type="text/css" rel="stylesheet">
</style>
注意:导入式会在整个网页装载完后再装载CSS文件,因此导致了一个问题,即如果网页比较大则会出现先出现无样式的页面,闪烁一下之后,再出现网页的样式,这是导入式固有的一个缺陷。使用链接式时与导入式不同的是,它会以网页文件主体装载前装载CSS文件,因此显示出来的网页一开始就是带样式效果的,它不会像导入式那样先显示无样式的网页,然后再显示有样式的网页,这是链接式的优点。
2. 标签选择器
1)基础选择器
- *:通用元素选择器,匹配任何五元素,例:*{margin:0; padding:0;}
- E:标签选择器,匹配所有使用E标签的元素,例:p{color:green;}
- .info和E.info:class选择器,匹配所有class属性中包含info的元素,例:.info{background:#ff0;},p.info{background:blue;}
- #info和E#info:id选择器,匹配所有id属性等于footer的元素,例:#info{background:#ff0;},p#info{background:#ff0;}
注意:如果html同一个标签中用的css样式为多个,以css文件的先后顺序进行渲染,后者覆盖前者
建议:写的类要尽可能小,有公共的概念,能够让更多的标签使用;尽可能使用class选择器,id一般是用在js代码上的
2)组合选择器
- E,F 多元素选择器,同时匹配所有E元素或F元素,E和F之间用逗号分隔,例:div,p{color:#f00;}
- E F 后代元素选择器,匹配所有属于E元素后代的F元素,E和F之间用空格分隔,例:#nav li{display:inline;},li a{font-weight:bold;}
- E>F 子元素选择器,匹配所有E元素的子元素F,例:div>strong{color:f00;}
- E+F 毗邻元素选择器,匹配所有紧随E元素之后的同级元素F,例:p+p{color:#f00;}
3)属性选择器
- E[att] 匹配所有具有att属性的E元素,不考虑它的值。(注意:E在此处可以省略,比如“[checked]”。以下同),例:p[title]{color:#f00;}
- E[att=val] 匹配所有att属性等于“val”的E元素,例:div[class="error"]{color:#f00;}
- E[att~=val] 匹配所有att属性具有多个空格分隔的值,其中一个值等于“val”的E元素,td[class~="name"]{color:#f00;}
- E[att|=val] 匹配所有att属性具有多个连字号分隔(hyphen-separated)的值,其中一个值以“val”开头的E元素,主要用于lang属性,比如"en","en-us","en-gb"等等,例:p[lang|=en]{color:#f00;}
- E[att^=val] 匹配属性值以指定开头的每个元素,例:div[class^="test"]{background:#ffff00;}
- E[att$=val] 匹配属性值以指定值结尾的每个元素,例:div[class$="test"]{background:#ffff00;}
- E[att*=val] 匹配属性值中包含指定值的每个元素,div[class*="test"]{background:#ffff00;}
- p:before 在每个<p>元素的内容之前插入内容,例:p:before(content:"hello";color:red;)
- p:after 在每个<p>元素的内容之后插入内容,例:p:after{content:"buy";color:blue;}
4)伪类选择器
伪类选择器:专用于控制链接的显示效果
- a:link (没有接触过的链接),用于定义了链接的常规状态
- a:hover (鼠标放在链接上的状态),用于产生视觉效果
- a:visited (访问过的链接),用于阅读文章,能清晰地判断已经访问过的链接
- a:active (在链接上按下鼠标时的状态),用于表现鼠标按下时的链接状态
伪类选择器:伪类指的是标签的不同状态
a ==> 点过状态 没有点过的状态 鼠标悬浮状态 激活状态
- a:link {color:red} 未访问的链接
- a:visited {color:blue} 已访问的链接
- a:hover {color:green} 鼠标放在上面的链接
- a:active {color:yellow} 已点过的链接
- div ul li: first-child{color: red} 选中第一个元素
- div ul li: last-child{color: green} 选中最后一个元素
- div ul li: nth-child(数值){color: blue} 选中第一个元素,当数值为n时,全部元素使用样式。2n为偶数变换,2n-1位奇数变换,
5)伪元素选择器
- p:first-letter{font-size:48px}:用于为文本的首字母设置特殊样式
- p:before{content:"*"; color:red}:用于在元素的内容前面插入新内容
- p:after{content:"*"; color:red}:用于在元素的内容后面插入新内容。清除浮动时使用的比较多
3. CSS的两个重要特性
1)继承性:父级中设置的属性,子级会继承父级的属性
一些文本元素属性是可以被继承下来的:color、font-*、text-*、line-*
像一些盒子元素,定位的元素(浮动、绝对定位、固定定位)不能继承
2)层叠性:
哪个权重大,浏览器就显示其属性
第一个比较的权重为id,第二个为class,第三个为标签
4. CSS的常用属性
1)颜色属性:
- <div style="color:blueviolet">test</div>
- <div style="color:#ffee33">test</div>
- <div style="color:rgb(255,0,0)">test</div>
- <div style="color:rgba(255,0,0,0.5)">test</div> #最后一个参数为透明度
2)字体属性:
- font-size: 20px/50%/larger #字体大小,
- font-family: "Lucida Bright"/"Microsoft Yahei"/"Arial"/“宋体“ #字体样式(注意1. 网页中不是所有字体都能用,中文我们只用:微软雅黑、宋体、黑体;英文:Arial、Times New Roman。 2.为了防止用户电脑中没有某个字体,用英文逗号隔开备选字体,font-family:"微软雅黑","宋体"。3.将英文字体放在最前面,这样所有的中文就不能匹配英文字体,自动变为后面的中文字体:font-family:"Times New Roman", "微软雅黑";)
- font-weight: normal/lighter/bold/border/500 #字体磅数,数值的范围为100-900
- <h1 style="font-style: oblique">test</h1> #字体是否倾斜
3)背景属性:
- background-color: cornflowerblue/rgb(255,255,255)/rgba(255,255,255,0.8)
- background-image: url("./1.jpg")
- background-repeat: no-repeat/repeat/repeat-x/repeat-y(repeat:平铺满)
- background-position: 100px 100px/center center/center top; 第一个值向右移动,第二个值向下移动;(横向:left centre right)(纵向:top centre bottom)
简写:<body style="background: 20px 20px no-repeat #ff4 url('1.jpg')">
<div style="width: 300px; height:300px; background:20px 20px no-repeat #ff4 url('1.jpg')">
注意:如果将背景属性加在body上,要记得给body加上一个height,否则结果异常,这是因为body为空,无法撑起背景图片,另外如果此时要设置一个width=100px,也看不出效果,除非设置出html
利用position,实现雪碧图技术
div{
width: 48px;
height: 48px;
background-image: url(./images/1.png);
background-repeat: no-repeat;
background-position: 0 -528px;
}
通天banner:
body{
background-image: url(./images/banner.jpg);
background-repeat: no-repeat;
background-position: centre top;
}
body{
background: red url('./images/banner.jpg') center top;
}
背景固定:
body{
width: 1200px;
height: 2000px;
background: url(1.png) no-repeat centre top;
# 背景固定
background-attachment: fixed;
color: white;
}
4)文本属性:
- font-size: 10px;
- text-align: center/left/right; 横向排列
- text-decoration: none/underline; 文本修饰
- line-height: 200px; 文本行高,文字高度加上文字上下的空白区域的高度50%:基于字体大小的百分比。行高如果等于盒子的高度,可以让文本在盒子中垂直且水平居中
p{
width:200px;
height:200px;
text-align:center;
background-color:aqua;
line-height:200px;
}
- text-indent: 150px/2em; 首行缩进,50%:基于父元素(weight)的百分比
- letter-spacing: 10px; 字之间的间距
- word-spacing: 20px; 单词之间的间距
- direction: rti;
- text-transform: capitalize; 大小写转化
- cursor: pointer; 设置游标
单行文本垂直居中:
行高=盒子的高度,让文本垂直居中,但只适用于单行文本
div{
width: 300px;
height: 50px;
line-height: 50px;
font-size: 18px;
}
5)边框属性
- border-style: solid; 边框的样式,实现、虚线等
- border-color: chartreuse; 边框的颜色
- border-width: 20px; 边框的宽度
简写:border: 30px rebeccapurple solid;
6)列表属性
ul,ol{list-style: decimal-leading-zero;
list-style: none;
list-style: circle;
list-style: upper-alpha;
list-style: disc; }
7)display属性,将块级标签与内联标签进行转化,
none # 属性隐藏,这个功能非常重要
block
inline
8)盒子模型
(1)border 边框,可以设置边框的粗细、样式、颜色
(2)padding 内边距,用于控制内容与边框之间的距离
(3)margin 外边距,用于控制元素与元素之间的距离
可以如下设置margin让包裹在父标签中的子块级标签居中:margin:0 auto;
内边距会影响盒子的大小,外边距不会影响盒子的大小
注意1:边框在默认情况下会定位于浏览器窗口的左上角,但并没有紧贴浏览器的窗口边框,这是因为body本身也是一个盒子(外层还有html),在默认情况下,body距离html会有若干像素的margin,具体数值因各个浏览器不尽相同,所以body中的盒子不会紧贴浏览器窗口的边框了。解决方法:
body{
margin:0px;
}
注意2:margin collapse(边界塌陷或者说边界重叠)
外边距的重叠只产生在普通流文档的上下外边距之间,这个看起来有点奇怪的规则,其实有其现实意义。设想当我们上下排列一系列规则的块级元素(如段落p)时,那么块元素之间因为外边距重叠的存在,段落之间就不会产生双倍的距离。
a. 兄弟div:上面div的margin-bottom和下面div的margin-top会塌陷,也就是会取上下两者margin里最大值作为显示值
b. 父级div:父级div中没有border,padding,inline content,子级div的margin会一直向上找,直到找到某个标签包括border,padding,inline content中的其中一个,然后按此div进行margin
解决方法:
a. border:1px solid transparent;
b. padding:1px;
c. over-flow:hidden;
5. CSS的float属性
1)float是脱离文档流
float: left | right
子元素浮动,父盒子一般不设置高度,给父盒子设置高度这种方式不灵活
2)清除浮动可以理解为打破横向排列,只能控制本身
清除浮动的关键字为clear,官方定义如下:
语法:
clear: none | left | right | both
取值:
none:默认值。允许两边都可以有浮动对象
left:不允许左边有浮动对象
right:不允许右边有浮动对象
both:不允许有浮动对象
3)使用方式
方式一:添加div标签,设置clear:both,但这种方式机构比较冗余
<div style="clear:both;"></div>
方式二:伪元素
.clearfix:after{
content: ".";
display: block;
height: 0px;
visibility: hidden;
clear: both;
方式三:overflow
div{
width: 300px;
height: 300px;
border: 1px solid solid;
overflow: hidden;
}
方式四:给父盒子设置高度
6. CSS的position属性
position定位
1)position:static; 默认效果
top、right、bottom、left等属性不会被应用,让元素继续按照文档流显示,不做出任何改变。
2)position:fixed; 固定在某个位置
在理论上,被设置为fixed的元素会被定位于浏览器窗口的一个指定坐标,不论窗口是否滚动,它都会固定在这个位置。fixed对象脱离正常文档流,使用top、right、bottom、left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。一个元素若设置了position:absolute | fixed; 则该元素就不能设置float。但relative却可以,因为它原本占据的空间仍然占据文档流。
固定定位的特性:1.脱标;2.提升层级;3.固定不变,不会随页面滚动而滚动
参考点:设置固定定位用top描述,那么是以浏览器的左上角为参考点;如果用bottom描述,那么是以浏览器的左下角为参考点
作用:1.返回顶部栏;2.固定导航栏;3.小广告
返回顶部的css样式案例:
p{
width: 100px;
height: 100px;
background-color: red;
position: fixed;
bottom: 30px;
right: 40px;
line-height: 100px;
font-size: 20px;
text-align: center;
}
固定导航栏css样式案例:
*{
padding: 0;
margin: 0;
}
ul{
list-style: none;
}
a{
text-decoration: none;
}
body{
/* 给body设置导航栏的高度,来显示下方的整个内容 */
padding-top: 49px;
}
.wrap{
width: 100%;
height: 49px;
background-color: black;
/* 设置固定定位后,一定要加top属性和left属性 */
position: fixed;
top: 0;
left: 0;
}
.wrap .nav{
width: 960px;
height: 49px;
margin: 0 auto;
}
.wrap .nav ul li{
float: left;
width: 160px;
height: 49px;
text-align: center;
}
.wrap .nav ul li a{
width: 160px;
height: 49px;
display: block;
color: white;
font: 20px/49px "宋体";
background-color: purple;
}
.wrap .nav ul li a:hover{
background-color: red;
font-size: 22px;
}
3)position:relative; 相对定位
relative对象遵循正常文档流,但将依据top、right、bottom、left等属性进行绝对定位。而其层叠通过z-index属性定义。如果设定position:relative,就可以使用top、bottom、left和right来相对于元素在文档中应该出现的位置来移动这个元素。当指定position:absolute时,元素就脱离了文档,可以准确地按照设置的top、bottom、left和right来定位了。如果一个元素绝对定位后,其参照物是以离自身最近元素是否设置了相对定位,如果有设置将以自己最近元素定位,如果没有将往其祖先元素寻找相对定位元素,一直找到html为止。
相对定位三大特性: 1.不脱标;2.形影分离;3.老家留坑
div{
width: 200px;
height: 200px;
background-color: red;
position: relative;
top: 20px;
left: 30px;
}
相对定位用途:1.微调元素位置;2.做绝对定位的参考(父相子绝)
4)position:absolute; 绝对定位
绝对定位特性:1.脱标;2.做遮盖效果,提升层级; 3.设置绝对定位后,不区分行内元素和块级元素
绝对位置的参考点:当我们使用top属性描述的时候,是以页面的左上角为参考点调整位置;当我们用bottom属性描述的时候,是以首屏右下角为参考点
父辈元素设置相对定位,子元素设置绝对定位,那么会以父辈元素左上角为参考点。这个父辈元素不一定是爸爸,可以是爷爷、曾爷爷。如果父亲设置了定位,则以父亲为参考点。如果父亲没有设置定位,那么以父辈元素设置的定位为参考点。
不仅仅是父相子绝,父绝子绝,父固子绝都是以父辈元素为参考点
注意:父绝子绝在实战中没有意义,因为绝对定位会脱离标准流,影响页面布局。常用的是父相子绝,因为父亲设置相对定位,不会脱离文档流,子元素设置绝对定位,仅仅是在当前父辈元素内调整位置信息。
绝对定位的盒子武士父辈的padding
绝对定位盒子居中:
.father{
width: 100%;
height: 70px;
background-color: black;
}
.father .son{
width: 960px;
height: 70px;
background-color: pink;
position: absolute;
left: 50%;
margin-left: -480px;
}
# 设置子元素绝对定位,left: 50%; margin-left等于原宿宽度的一半,实现绝对位置盒子居中
7. z-index
- z-index值表示谁压着谁,数值大的掩盖住数值小的
- 只有定位了的元素,才能有z-index,也就是说,不管相对定位,绝对定位,固定定位,都可以使用z-index,而浮动元素不能使用
- z-index值没有单位,就是一个正整数,默认的z-index值为0
- 如果大家都没有z-index值,或者z-index值一样,那么谁写在HTML后面,谁在上面压着别人。定位了的元素,永远压住没有定位的元素
- 从父现象:父亲怂了,儿子再牛逼也没用
8. 补充
1)实际案例中灵活使用before、after,通过样式设置clear:both
.clearfix:after{
content:"ABC";
display:block;
clear:both;
visibility:hidden; #设置隐藏
height:0px
}
2)hover后加选择器
.ele{
background-color: #dddddd;
}
.ele:hover{
border: 2px solid red;
}
.ele:hover .ele-item{
color:blue;
}
3)鼠标放上去出现效果
.touch{
width:200px;
height:200px;
overflow:hidden;
position:relative;
}
.touch .content{
position:absolute;
top:0;
left:0;
right:0;
bottom:0;
background-color:black;
opacity:0.4;
color:white;
text-align:center;
visibility:hidden;
}
.touch:hover .content{
visibility:visible;
}
4)利用position中的fixed固定在屏幕上的某个位置,
.back_to_top{
position:fixed;
right:10px;
bottom:10px;
width:40px;
height:40px;
background-color:violet;
}
5)利用border特性制作尖角
.up{
border-top: 30px solid red;
border-right: 30px solid transparent;
border-bottom: 30px solid transparent;
border-left: 30px solid blue;
display: inline-block;
}
或者可以简写为:
.c1{
border:30px solid transparent;
display: inline-block;
border-top: 30px solid green;
margin-top: 40px;
}
鼠标放上去产生变化效果
.c1:hover{
border: 30px solid transparent;
border-bottom: 30px solid green;
margin-top: -10px;
}
6)图标
如果没有美工单独制作图标,可以使用font-awesome插件。
7)a标签中加入img标签,如果在ie浏览器中打开图片会有个边框,需要添加如下css样式以取消边框
img{
border:0;
}
8)如果不想让下面的css代码覆盖上面的样式,可以加入!important;
.c1{
font-size:32px;
background-color:red;
color:white !important;
}
.c2{
color:aqua;
}
9)目录规范
web_project
- html
starting_page.html
introduction_page.html
-css
-commons.css
`-script
-commons.js
-plugin
-bootstrap
-bxslider
10)后台页面样式布局
(1)简单的后台管理系统样式布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Layout1</title>
<style>
body{
margin:0;
}
.pg-header{
height:48px;
background-color:#dddddd;
}
.pg-body .body-menu{
position:absolute;
width:180px;
background-color:antiquewhite;
left:0px;
}
.pg-body .body-content{
position:absolute;
left:182px;
right:0px;
background-color:navajowhite;
}
</style>
</head>
<body>
<div class="pg-header"></div>
<div class="pg-body">
<div class="body-menu">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
</div>
<div class="body-content">
<ul>
<li>Content1</li>
<li>Content2</li>
<li>Content3</li>
<li>Content4</li>
</ul>
</div>
</div>
</body>
</html>
(2) 基于上面一种布局,将左侧的menu固定住,右边的content部分占满其余的页面部分,如有超出的部分则自动溢出
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Layout2</title>
<style>
body{
margin:0;
}
.pg-header{
height:48px;
background-color:#dddddd;
}
.pg-body .body-menu{
position:absolute;
width:180px;
background-color:antiquewhite;
left:0px;
}
.pg-body .body-content{
position:absolute;
top:48px;
left:182px;
right:0;
bottom:0;
background-color:navajowhite;
overflow:auto;
}
</style>
</head>
<body>
<div class="pg-header"></div>
<div class="pg-body">
<div class="body-menu">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
</div>
<div class="body-content">
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
</div>
</div>
</body>
</html>
11)边缘提示框,利用position标签的relative,absolute进行实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Tip</title>
</head>
<body>
<div style="position:relative"></div>
<a>删除</a>
<div style="position:absolute;left:38px;top:-2px">
<input type="button" value="确定"/>
<input type="button" value="取消"/>
</div>
</body>
</html>
12)登录页input和图标
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Input And Icon</title>
<link href="font-awesome-4.7.0/css/font-awesome.css" rel="stylesheet">
<style>
.user{
position:relative;
width:250px;
}
.user input{
height: 30px;
width: 170px;
padding-right:30px;
}
.user .person_icon{
position:absolute;
top:8px;
left:180px;
}
</style>
</head>
<body>
<div class="user">
<input type="text">
<div class="person_icon"><span class="fa fa-address-book"></span></div>
</div>
</body>
</html>
13)模态对话框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Model Input</title>
<link href="font-awesome-4.7.0/css/font-awesome.css" rel="stylesheet">
<style>
body{
margin:0;
}
.model{
position:fixed;
top:0;
bottom:0;
left:0;
right:0;
background:rgba(0,0,0,.5);
z-index:2;
}
.content{
height:300px;
width:400px;
background-color:white;
position:fixed;
top:50%;
left:50%;
z-index:3;
margin-left:-200px;
margin-top:-150px;
}
</style>
</head>
<body>
<!--第一层-->
<div style="height:2000px; background-color:red;">
<h1>Test</h1>
</div>
<!--第二层-->
<div class="model"></div>
<!--第三层-->
<div class="content"></div>
</body>
</html>
14)加减框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Minus Plus Input</title>
<link href="font-awesome-4.7.0/css/font-awesome.css" rel="stylesheet">
<style>
.wrap{
height:22px;
width:153px;
background-color:#dddddd;
border:1px solid #dddddd;
}
.left{
float:left;
}
.wrap .minus{
height:22px;
width:22px;
line-height:22px;
text-align:center;
cursor:pointer;
}
.wrap .plus{
height:22px;
width:22px;
line-height:22px;
text-align:center;
cursor:pointer;
}
.wrap .count input{
padding:0;
border:0px;
width:104px;
height:22px;
border-left:1px solid #dddddd;
border-right:1px solid #dddddd;
}
</style>
</head>
<body>
<div class="wrap">
<div class="minus left" onclick="Minus();">-</div>
<div class="count left"><input id="count" type="text" value="1"/></div>
<div class="plus left" onclick="Plus();">+</div>
<!--1. 点击plus-->
<!--2. 找到text-->
<!--3. 修改text的value-->
</div>
<script type="text/javascript">
// 定义函数
function Plus(){
var old_num_str = document.getElementById('count').value;
var old_num_int = parseInt(old_num_str);
var new_num_int = old_num_int + 1;
document.getElementById('count').value = new_num_int;
}
function Minus(){
var old_num_str = document.getElementById('count').value;
var old_num_int = parseInt(old_num_str);
var new_num_int = old_num_int - 1;
document.getElementById('count').value = new_num_int;
}
</script>
</body>
</html>