层叠样式表(CSS),又称串样式列表,由W3C定义和维护的标砖,一种用来为结构化文档(如HTML文档或XML应用)、添加样式(字体、间距和颜色等)的计算机语言。
CSS能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。
html只负责结构,样式交给css来实现。这样以来开发者工作量和效率大大提升,页面也变得更加容易维护,想要修改某个字体或者样式,直接在css文件中修改,不需要修改html结构。
selector { property:value }
<div style="color:olive;width:100px:border:1px solid blue; ">行间样式div>
<head>
<style>
p{
background-color:#eeeee;
font-size:18px;
font-style:italic;
}//之后所有的p标签的样式都是这样
style>
head>
<head>
<link rel="stylesheet" href="style.css"/>
//引入外部样式文件,先写一个css文件,写法与内部样式一样样,直接花括号写就行了,类名前要加.
head>
<head>
<style>
@import "css/test.css";
style>
head>
行间样式作用于当前标签;内部样式作用于当前文件;外部样式可以被多个HTML文件引用。最多使用的是外部样式,分为link引入和import引入两种方式,更多使用link,性能由于import。
link和import的区别:
<style>
/*1.*选择器*/
*{
color:red;
}
/*2.标签选择器*/
span{
display:block; //转换为块元素
margin-right: 20px;
border:1px solid gray;
}//只作用在span标签上
/*3.类选择器,前面加.*/
.wrapper{
color:aqua;
}
/*4.id选择器,前面加#*/
#content {
color:pink;
}
/*5.派生选择器*/
.box2 li{//选择box2类下的li标签
color: chartreuse
}
/*6.伪类选择器*/
style>
<body>
<ul class="box1">
<li>li001li>
<li>li002li>
<li>li003li>
ul>
<ul class="box2">
<li>li001li>
<li>li002li>
<li>li003
<ul>
<li>subli1li>
<li>subli2li>
ul>
li>
ul>
body>
多个标签使用同一个样式,则需要对这些选择器进行分组,这样同一组的选择器就可以有相同的声明。让多个选择器(元素)具有相同的样式,一般是公共样式
<style type="text/css">
h1,.box, p{
color:red;
}
p{
width:100px;
background-color:#999999
color:blue;//写在后面,则会把p标签原来的红色给覆盖掉
}
style>
子元素可以继承父元素的样式,反之不可以。
<style>
.test{
font-size:18px;
}
.test span{//继承了test的所有样式
font-weight:bold;//加粗
font-size:12px;//可以改写父元素的样式
}
style>
<body>
<div class="text">
这是一段<span>测试span>。
div>
body>
多重优先:(外部样式)<(内部样式)<(内联样式)
优先权级:
把特殊性分为4个等级,每个等级代表一类选择器,每个等级的值为其代表的选择器的个数乘以这一等级的权值,最后把所有等级的值相加得出选择器的特殊值。
<style>
p{
color:blue!important;/*加上!importan优先级最高,为蓝色*/
}
#content div.main_content h2{
color:red;/*权重为100+1+10+1=112*/
}
#content .main_content h2{
color:blue;/*权重 为100+10+1=111*/
}
style>
<body>
<p style="color:red;">这是内容1p>
<div id="content">
<div class="main_content">
<h2>标题h2>
div>
div>
body>
font-size:字号
p { font-size:20px;}
p { font-size:100%;}
font-family:字体
属性值:name,字体名称,以优先顺序排列,以逗号隔开。如果字体名称包含空格,则应该使用双引号
p {font-family:Courier, "Courier New", monospace;}/*如果不支持第一种,则使用第二种,依次递推*/
font-style:文字样式
属性值:
p{font-style:};
font-weight:文字加粗
属性值:
p {font-weight: normal;}
p {font-weight: bold;}
p {font-weight: 600;}/*一般使用100的倍数*/
line-height:行高(下一行底端距上一行底端的距离)
属性值:
p{ line-height:normal;}
p{ line-height:24px;}
p{ line-height:1.5;}
color:文字的颜色
属性值:
p{ color:red;}
p{ color:rgb(100,14,200);}
p{ color:#345678;}
text-decoration:文字的修饰
属性值:
p{ text-decoration:underline;}
p{ text-decoration:line-through;}
p{ text-decoration:overline;}
text-align:文本对齐方式
属性值:
text-transform:字母大小写
属性值:
text-indent:文本缩进
属性值:
font复合属性:
font:font-style font-variant font-weight font-size/line-hegiht font-family
注意属性值的顺序位置
除了font-size和font-family之外,其他任何一个属性值都可以省略
font-variant:normal/small-caps(让大写字母小一些)
不需要设置的就去掉就好,但顺序不能变换
<style>
strong{
font:italic small-caps bolder 18px/1.5 宋体;
}
style>
background-color 背景色
属性值:
background-image 背景图像
属性值
background-repeat 设置对象的背景图像铺排方式
background-position 设置对象的背景图像位置
{x-number | top | center | bottom} {y-number | left | center | right}:控制背景图片在元素的位置:x轴、y轴。其铺排方式为 no-repeat
<style>
div{
background-image: url('../images/pic.png');
background-repeat: no-repeat;
background-position: 50px 50px;
}
style>
background-attachment 设置对象的背景图像滚动位置
background:设置背景的复合写法
语法:
background:color image repeat attachment position
示例:
<style>body{background:#fff url() no-repeat fixed center center}style>
伪类:专门用来表示元素的一种特殊状态。
常用伪类选择器:
a标签的伪类:
:link/:visited/:hover/:active
:focus:获得焦点时触发样式
:first-child/:last-child/:nth-child(number)
<style>
a:link{
color:red;
}/*初始为红色*/
a:visited{
color:green;
}/*访问过变为绿色*/
a:hover{
color:yellow;
}/*鼠标经过时变为黄色*/
a:active{
color:blue;
}/*激活后变为蓝色*/
input:focus{
outline:1px solid #421524
}/*获得文本框焦点后,会出现一个带#421524颜色的边框*/
ul li:first-child{
color:#ff1299
}/*只有第一个有颜色*/
ul li:last-child{
color:#c8ff24
}/*最后一个*/
ul li:nth-child(2){
color:#2c3cff
}/*第二个*/
style>
<body>
<a href="#">单击跳转a>
<input type ="text">
<ul>
<li>aaaali>
<li>aaaali>
<li>aaaali>
<li>aaaali>
ul>
body>
<style>
div.content[title]{
font-weight:bold;
}/*选择div中类别为content且含有title属性的*/
input[name=user]{
background-color:#999999
}/*选择input标签中name属性值为user的*/
div[class~=box1]{
background-color:#5aff29
}/*选择class中含有box1的*/
style>
<body>
<div class="content box1 box2" title="内容">content1div>
<div class="content box2">content2div>
<form action="">
<input type="text" name="account">
<input type="text" name="user">
form>
body>
<style>
h1 strong{
color:#fff;
background-color:#000;
}/*对h1中的所有strong都有效*/
h1>strong{
color:#123;
background-color:#edc;
}/*第一个strong有效*/
ul li+li+li{
list-style-type:none;
color:red;
}/*有连续三个li才有效*/
style>
<body>
<h1>
<strong>关系1strong><span><strong>关系2strong>span>
h1>
<ul>
<li>li1li>
<li>li2li>
<li>li3li>
<li>li4li>
<li>li5li>
ul>
body>
伪元素用于向某些选择器设置特殊效果
:first-letter 向文本的第一个字母添加特殊样式。
<p>hello first-letterp>
<style>
p:first-letter{color:red;font-size:30px}
style>
first-line 向文本的首行添加特殊样式
<p> hello first-linep>
<style>
p:first-line{color:red;font-size:30px}
style>
:before 在元素之前添加内容
<p>hello beforep>
<style>
p:before{content:'before content'}
style>
:after 在元素之后添加内容
<p>hello afterp>
<style>
p:after{ content:'after content'}
style>
CSS伪元素和伪类的区别:
伪元素和伪类的特点:
:before/:after/:first-letter/:first-line 前面可以是1个冒号也可以是双冒号。
::selection/::placeholder/::backdrop 前面只能是双冒号
补充:
margin:1em;
margin:-3px;/*应用于所有边*/
margin:5% auto;/*上下|左右*/
margin: 1em auto 2em;/*上|左右|下*/
margin: 2px 1em 0 auto;/*上 右 下 左*/
padding:1em;/*应用于所有边*/
padding:5% 10%; /*上下|左右*/
padding:1em 2em 2em; /*上|左右|下*/
padding:5px 1em 0 2em;/*上 右 下 左*/
float属性定义元素在那个方向浮动,CSS中任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身时何种元素。如果浮动非替换元素,则要指定一个明确的宽度,否则,它们会尽可能窄。
浮动让块级标签不独占一行。目的:把块级标签元素可以排在一行上。原理是让元素脱离文档流,不占用标准流。
float的属性值:
值 | 描述 |
---|---|
left | 元素向左浮动 |
right | 元素向右浮动 |
none | 默认值。元素不浮动,并会显示其在文本中出现的位置 |
inherit | 规定应该从父元素继承float属性的值 |
<head>
<style>
.wrapper{
width:600px;
margin:0 auto;
border: 1px solid #666;
}
.box1 .box2{
width:200px;
height:150px;
}
.box1{
background-color:#ff0000;
float:left;/*浮动后与box2排一行了,但wrapper没有高度了*/
}
.box2{
background-color:#217aff;
float:left;
}
style>
head>
<body>
<div class="wrapper">
<div class="box1">box1div>
<div class="box2">box2div>
div>
body>
浮动后,后面的元素不管是块级还是行级元素,不会显示下一行,这时需要清除浮动,让后面的元素自动进入下一行。
方法:
添加空标签,并设置样式:
<style>
.clear{
clear:both;
}
style>
<div class="wrapper">
<div class="box1">box1div>
<div class="box2">box2div>
<div class="clear">div>
<div class="box3">box3div>
div>
在要清除浮动的父级添加样式:overflow:hidden;
当子元素的尺寸超过父元素的尺寸时,需要设置父元素显示溢出的子元素的方式,可在浮动元素的父级添加样式:overflow:hidden。
属性值:
<style>
.wrapper{
width:600px;
margin:0 auto;
border: 1px solid #666;
overflow:hidden;
}
style>
<div class="wrapper">
<div class="box1">box1div>
<div class="box2">box2div>
div>
<div class="box3">box3div>
使用:after
为了减少空标签的多余,可采用父级的伪元素进行样式清除浮动。
<style>
.wrapper{
width:600px;
margin:0 auto;
border: 1px solid #666;
overflow:hidden;
}
.wrapper:after{
content:"";
display:block;
clear:both
}
style>
<div class="wrapper">
<div class="box1">box1div>
<div class="box2">box2div>
div>
<div class="box3">box3div>
CSS盒子模型:规定了元素框处理元素内容(content)、内边距(padding)、边框(border)和外边距(margin)的方式
每个元素都是一个盒子,一个盒子的组成如上图所示。区别外边距和内边距是以边框(border)为参照,系统默认外边距为8px。
外边距(margin):指元素边框线之外的距离
margin:可用来设置任意一个边的边距,可以带1至4个参数。
内边距(padding) :元素的文本内容与边框之间的距离,属性与margin一样。
<head>
<style>
div{
width:800px;
height:400px;
border:1px solid red;
margin:20px;
padding:10px;
}/*一个盒子*/
.span{
/*display:block;/*将span由行级标签转为块级标签*/
width:300px;
height:200px;
background-color:#f00;
margin-right:20px;/*与右边块保持20px的距离*/
display:inline-block;/*按行的块*/
padding:20px;/*文本框上下左右与边框的距离为20px*/
border:1px solid #005fbd;
}
.content{
width:100px;
height:200px;
background-color:#46ffb1;
}
.txt{
width:100px;
height:100px;
background-color:#ff9a45
}
style>
<body>
<div class="box">
<div clss="span">
<p class="txt">
p>
div>
<div class="content">div>
div>
body>
head>
边框(border):就是围绕元素内容和内边距的一条或多条线,设置边框的最简单的方法就是使用border属性,允许规定元素边框的样式、宽度和颜色
属性:
border边框的简写:
{width style color}:定义宽度为width,样式为style,颜色为color的边框
示例:
.wrapper{ border:1px solid red;}
盒子的真实尺寸
盒子宽度=width+padding+border左右
盒子高度=height+padding上下+border上下
用来设置元素如何显示。
属性值:
<head>
<style>
div{
width:200px;
height:100px;
background-color:#f00;
display:inline-block;/*与*/
}
div:first-child{
background-color:#38ffd1;
margin-right:-5px;
}
span{
width:300px;
height:200px;
background-color:#ffe351;
display:inline-block;
margin-left:-5px;
}
style>
<body>
<div>div1div>
<div>div2div>
<span>spanspan>
body>
head>
table主要用来格式化数据
table属性:
td,tr属性:
<style>
table,td{
border: 1px solid #666;
}
table{
border-collaspse:collapse;
align:center;/*表格居中*/
margin:0 auto;
width:500px;/*等分单元格宽度*/
height:300px;
text-align:center;/*文本居中*/、
}
td{
vertical-align:bottom/*靠下,设置在table里没用*/
}
style>
<body>
<table>
<tr>
<td>{具体内容1}td>
<td>{具体内容2}td>
<td>{具体内容3}td>
<td>{具体内容4}td>
tr>
<tr>
<td>{具体内容1}td>
<td>{具体内容2}td>
<td>{具体内容3}td>
<td>{具体内容4}td>
tr>
<tr>
<td>{具体内容1}td>
<td>{具体内容2}td>
<td>{具体内容3}td>
<td>{具体内容4}td>
tr>
table>
body>
不是描述性的文本的任何内容都可以认为是列表。比如:菜单、商品列表等
1)列表类型:
无序(ul)、有序(ol)和自定义列表(dl)。
ul和ol的列表项都是用li表示的,而dl是由一个dt和一个或多个dd组成的。dl一般用来设定一个定义,比如名词解释等。dt:标题,dd:描述,用来对dt的内容进行解释说明的。
2)样式(用来修改标识类型)
<style>
ul{
list-style-image:url("icon.png");
}
style>
list-style-position:标识的位置,outside:默认值,不会占用空间,inside:前面标号会占用文本空间。
list-style-type:标识类型
简写:list-style:image type position。位置任意,可任意省略。
list-style-type的属性值:
均有一个属性:none,取消前面的标识符
组成:
position 属性规定元素的定位类型。这个属性定义建立元素布局所用的定位机制。任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身是什么类型。相对定位元素会相对于它在正常流中的默认位置偏移。
属性值:
z-index:
当多个元素添加绝对定位,元素将会叠加在一起,使用z-index可以设置元素显示的层次。
z-index 仅能在定位元素上奏效(例如:position:absolute;)
元素可以拥有负的z-index属性值
说明:一般元素为普通流,普通流的z-index默认为0,脱离了普通流,在普通流之上(定位,浮动)z-index在0-1之间。如果将z-index值设置为大于或者等于1,元素将会在定位或者浮动流之上。
<style>
div{
width:400px;
height:200px;
}
.div1{
width:1000px;
height:600px;
background-color:#f00;
position:relative;
}
.div2{
background-color:#0f0;
position:absolute;
z-index:2;
}
.div3{
background-color:#00f;
position:absolute;
z-index:3;
}
style>
<div class="div1">
<div class="div2">div>
<div class="div3">div>
div>
基本策略:先整体后局部,自顶向下,逐步细化。
双飞翼布局是将一个网页分为左列、中列和右列三部分,并且我们要得到的效果是:左列和右列宽度恒定,中间列的宽度根据浏览器窗口的大小自适应。
<style>
.container{
width:100%;
overflow:hidden;
}/*列开始浮动*/
.column{
float:left;
height:200px;
}
#left_panel{
width:300px;
background-color:#f00;
margin-left:-100%;
}/*没有margin0left:-100%之前,左边列会向上一行浮动*/
#center_panel{
width:100%;
background-color:#0f0;
}
#right_panel{
width:300px;
background-color:#00f;
margin-left:-300px;
} /*向左移动右列的宽度px,就可以出现在右边了*/
style>
<div class="container">
<div class="column" id="center_panel">div>
<div class="column" id="left_panel">div>
<div class="column" id="right_panel">div>
div>
优点:
圣杯布局和双飞翼布局都是三列布局,两边定宽,中间自适应布局。增加了定位,中间内容是完全呈现的,没有被左右边栏覆盖。
<style>
body{
min-width:600px;
}
.header,.footer{
width:100%;
height:100px;
line-height:100px;
background-color:#2fff99;
text-aligin:center;
font-size:30px;
}
.container{
padding:0 200px;
overflow:hidden;
position:relative;
}
.column{
float:left;
height:200px;
}
#left_panel{
width:200px;
background-color:#f00;
margin-left:-100%;
left:-200px;
}
#center_panel{
width:100%;
background-color:#0f0;
}
#right-panel{
width:200px;
background-color:#00f;
margin-left:-200px;
right:-200px;
}
style>
<div class="header">#headerdiv>
<div class="container">
<div class="column" id="center_panel"> div>
<div class="column" id="left_panel">div>
<div class="column" id="right_panel">div>
div>
<div class="footer">#footerdiv>
侧边栏布局是一种比较常见的布局方案,它在空位紧缺的界面内可以提供更多快捷的入口供用户操作,简化了操作层级。
左侧固定,右侧自适应
<style>
body{
font-size:18px;
min-width:600px;
}
.container{
width:100%;
overflow:hidden;
}
.left{
width:150px;
height:200px;/*实际开发中,不要给高度,高度由内容自行撑开*/
float:left;
background-color:#fff;
margin-right:-150px;
position:relative;/*往左移动150px后,left跑上一行去了,使用relative占据原有位置*/
}
.right{
width:100%;
height:200px;
float:left;
background-color:#0f0;
color:#fff;
margin-left:1600px;/*往右移动一定距离,显示内容*/
}
style>
<div class="container">
<div class="left">左侧固定div>
<div class="right">右侧自适应div>
div>
左侧自适应,右侧固定
和1是镜像的。
左右均固定
显然的。
左右固定,中间自适应
<style>
.container{
overflow:hidden;
color:#fff;
}
.left,.right{
float:left;
width:200px;
height:200px;
line-height:200px;
position:relative;
}
.center{
float:left;
width:100%;
background-color:#12049f;
line-height:200px;
}
.left{
background-color:#124cde;
margin-right:-200px;
}
.content{
margin:0 200px 0;/*避免被左右边栏覆盖*/
}
.right{
width:150px
background-color:#75819c;
margin-left:-150px;
}
style>
<div class="container">
<div class="left">左侧固定div>
<div class="center"><div class="content">
中间自适应
div>div>
<div class="right">右侧固定div>
div>
左侧自适应,中右固定
左中固定,右侧自适应
FC的含义是Formatting Context,是CSS2.1规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。BFC和IFC都是常见的FC,分别叫Blocking Formatting Context 和Inline Formatting Context。
BFC叫做块级格式化上下文
形成BFC的条件:
BFC的布局规则如下:
内部的盒子会在垂直方向,一个个地放置
盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻Box的上下margin会发生重叠;
每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此;
BFC的区域不会与float重叠;
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然;
计算BFC元素的高度时,浮动元素也参与计算。
规则展示:
<style>
/*内部的盒子会在垂直方向,一个个地放置*/
/*.box1,.box2{
width:200px;
height:100px;
border:1px solid #000;
}*/
/*盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻Box的上下margin会发生重叠,距离为最大值。如果不想叠加,需要将其变成一个独立的容器*/
/*.container{
overflow:hidden;
width:100px;
height:100px;
background-color:#f00;
}
.wrapper{
overflow:hidden;
}
.box1{
height:20px;
margin:10px 0;
background-color:#0f0;
}
.box2{
height:20px;
margin:20px 0;
background-color:#00f;
}*//*box1和box2间隔20,是多个margin的最大值*/
/*BFC区域不会与float元素区域重叠*/
/*.box1{
/*一个BFC区域*/
float:left;
width:200px;
height:100px;
background-color:#61ff9c
}
.box2{/*另一个BFC区域*/
overflow:hidden;
height:200px;
background-color:#ff4f46;
}*/
/*计算BFC元素的高度时,浮动元素也参与计算。*/
.box2{
width:200px;
height:100px;
background: #ff9a45;
float:left;
}
.container{/*如果想让父级也被撑开,则需要设置为BFC,让浮动元素也参与高度计算*/
width:300px;
border:1px solid #000;
overflow:hidden;/*清楚浮动,转化为BFC区域*/
}
style>
<body>
<div class="container">
<div class="wrapper">
<div class="box1">div>
div>
<div class="box2">div>
div>
body>
BFC的作用:
IFC(Inline Formatting Contexts)意为"内联(行级)格式化上下文",IFC中,盒子依次水平放置,从包含块的顶部开始。
形成IFC的条件:
IFC布局规则:
规则展示:
<style>
/*框会从包含块的顶部开始,一个接一个地水平摆放*/
span{
font-size:30px;
background-color:#f4ff57;
/*width:200px;/*行级标签不识别宽高*/
display:inline-block;/*必须用display转化为块级标签后才能识别宽高*/*/
}
strong{
font-size:16px;
background-color:#ffadf5
}
/*浮动的元素不会在行框中,并且浮动元素会压缩行框的宽度*/
.box{
font-size:50px;
float:left;
}
style>
<body>
<span>spanspan>
<strong>strongstrong>
<em class="box">boxem>
body>
行盒模型,一个显示区域,根据块状容器内,每一行的多个内联元素(inline-level element)都会共同生成一个行盒模型。
常见的属性,用来指定文本类型节点的大小。IFC内的很多属性的值时基于font-size的。
在一个由多个内联元素组成的块状容器内,'line-height’为内联元素的行盒模型指定一个最低高度。这个最低高度时分别由基线上的最小高度和基线下的最小深度组成。
从上到下四条线分别时顶线、中线、基线、底线。那么行高是指上下文本行的基线间的垂直距离,即图中两条红线间垂直距离(实际在数值上,行高也等于其他相同颜色间的距离)
该属性影响由多个内联元素生成的盒模型组成的行内盒模型的垂直定位。vertical有几个特定的值,或者指定一个值。
<p class="a1">
<span style="vertical-align:60px">English中文span>
<span>中文Englishspan>
p>
给第一个span,设置60px的垂直偏移,发现span容器的高度被撑高了。
容器的高度 height = line-height + vertical-align
同理,如果容器的高度被指定了,那么高度不变,而超出部分不影响布局。如果设置overflow:hidden,超出的部分则不可见。
而vertical-align的其他特殊值,均可以看作一个根据容器高度而变化的相对值(top/mid/bottom)