Skip to content

CSS学习笔记

约 10320 字大约 34 分钟

基本样式

font-size设置字号

可使用相对单位和绝对单位

相对长度单位说明
em相当于当前对象内文本的字体尺寸
px像素(最常用)
绝对长度单位说明
in英寸
cm厘米
mm毫米
pt
p {
    font-size:14px;
}

font-family设置字体

常用字体有微软雅黑、宋体、黑体

p {
    font-family:"microsoft yahei","\5B8B\4f53";
}

字体字号常用规则:

  1. 网页中多使用14+px
  2. 尽量使用偶数数字字号,ie等老浏览器对奇数有bug
  3. 字体之间使用英文逗号
  4. 中文字体必须加引号,英文字体可不加,但英文字体名称必须在中文之前
  5. 如果字体中存在空格、#、$等字符,该字体必须加引号
  6. 尽量使用系统默认字体(宋体、微软雅黑),保证在任何用户浏览器中都能正确显示

Unicode字体,在古老的浏览器中不支持中文,可以使用Unicode编码说明字体,常用字体的Unicode编码包括:

字体名称英文名称Unicode编码
宋体SimSun\5B8B\4f53
新宋体NSimSun\65B0\5B8B\4f53
黑体SimHei\9ED1\4F53
微软雅黑Microsoft YaHei\5FAE\8F6F\96C5\9ED1
.........

font-weight设置字体粗细

字体粗细包括几个默认值,normal(正常,相当于数字400)、bold(加粗,相当于数字700)、bolder(特粗体,也相当于strong的作用)、lighter细体
其中,normal的作用是可以让标签不加粗

//设置字体粗细为700
font-witght:700;

font-style字体风格

可选项为normal(正常)、italic(斜体)、oblique(倾斜)
其中normal可以让<em>标签不倾斜

font综合样式设置

/*
选择器{ 
    font: font-style font-weight font-size line-height font-family; 
}
*/
p {
    font: italic bold 14px "微软雅黑";
}

.p1 {
    font: 14px "微软雅黑";
}

注意:

  1. 使用font属性时必须按照上边的语法规则顺序书写,不能更换,各个属性用空格隔开
  2. 不需要设置的属性可以省略,当必须要保留font-size和font-family属性,否则font不起作用

color字体颜色

.red-1{
    color:red;
}
.red-2{
    color:#f00;/*和#ff0000一样,提倡简写*/
}
.red-3{
    color:rgb(255,0,0)
}

设置颜色半透明,css3新特性。格式为rgba(0,0,0,a),其中a为0~1之间的数

h1{
    color:rgba(0,0,0,0.3);
}

文字阴影

text-shadow用于设置文字阴影,用法为:text-shadow:水平位置,垂直位置,模糊距离,阴影颜色;,前两项必须写,后两项可选(有默认值)。用法如下

h1{
    text-shadow:5px,5px,1px,#F00;
}
h2{
    text-shadow:5px,2px;
}

段落设置

line-height行高

/*一般行高比字体大7-8像素即可*/
line-height:25px

text-align水平对齐方式,相当于html中的align对齐属性,可选值为left、right、center

text-indent首行缩进,建议使用em作为单位,1em为一个字符的宽度,如果是汉字,1em就是一个汉字的宽度

letter-spacing字间距,属性值可以是不同单位的数值,允许使用负数

word-spacing单词间距,用于定义英文单词的间距,对中文无效

综合样式

凸起或凹陷的文字

<head>
<style>
    body{
        background-color:#ccc;
    }
    div{
        font-color:#ccc;
    }
    div:first-child{
        text-shadow:1px 1px 1px #000,-1px -1px 1px #fff;
    }
    div:last-child{
        text-shadow:1px 1px 1px #fff,-1px -1px 1px #000;
    }
</style>
</head>
<body>
<div>
<p>我是凸起的文字</p>
<p>我是凹陷的文字</p>
</div>
<body>

设置文字水平和垂直居中的方法

  1. 垂直居中:设置文字的行高=盒子的高度
  2. 水平居中:text-align : center

取消a标签的下划线,使用text-decoration : none

字体图标

图片的问题:

  1. 增加了总文件的大小
  2. 增加了额外的http请求,降低网络性能
  3. 不能随意缩放,因为缩放会失真
  4. 移动端场景不适用

字体图标的优点:

  1. 可以实现图片的效果
  2. 本质上是文字,可以设置颜色、阴影、透明等效果
  3. 几乎支持所有的浏览器
  4. 移动端常用

字体图标使用流程:

  1. UI设计师设计效果图(SVG格式),常用illustrator或Sketch设计icon图标
  2. 全段上传生成兼容性字体文件包
  3. 前端下载兼容性字体文件包到本地
  4. 在html文件中引入字体文件包

常用文字图标库:

  1. icomoon
  2. 阿里巴巴图标库
  3. fontello在线定制图标
  4. Font-Awesome
  5. Glyphicon Halflings
  6. Icons8

在HTML中使用字体图标

<head>
    <style>
        /*第一步,引入字体*/
        @font-face{
            font-family: 'icomoon';
            /*注意路径*/
            src: url(‘fonts/icomoon.eot?7kkyc2');
            src: url('fonts/icomoon.eot?7kkyc2#iefix') format ('embedded-opentype'),url('fonts/icomoon.ttf?7kkyc2') format('truetype');
            font-weight: normal;
            font-style: normal;
        }
        /*第二步,通过span使用字体*/
        span {
            font-family: 'icomoon';
            font-size: 100px;
            color: red;
        }
        /*第二步,通过div使用字体*/
        div::before {
            font-family: 'icomooon';
            fong-size: 100px;
            color: green;
            content: '\e91b'
        }
	</style>
</head>
<body>
    <span></span>
    <span></span>
    <div>
        
    </div>
</body>

CSS背景

设置背景颜色、背景图片

div {
    background-color: red;
    background-image: url(../img/l.png);
    /* 平铺方式,默认横纵向都平铺 */
    background-repeat: no-repeat;
    /* 背景图片位置,水平居中,垂直靠下 */
    background-position: center bottom;
}

div {
    /* 背景图片坐标,x=10px,y=10px */
    background-position: 10px 10px;
}

div {
    /* 混合使用文字和数字 */
    background-position: 10px center;
}

设置背景附着

div {
    /* 默认为scroll,背景跟随滚动条滚动,设置为fixed背景固定,不随滚动条滚动 */
    background-attachment: fixed;
}

背景的简写方式

div{
    background: #0f0 url(../img/l.png) no-repeat fixed center -25px;
}

设置背景半透明

div{
    background: rgba(0,0,0,0.3);
}

背景图设置大小(缩放)

div{
    /* 设置背景图尺寸 宽100px,高200px,对于非100*200的图片会影响效果,建议只改宽度 */
    background-size: 100px 200px;
}
div{
    /*宽度设置为100px*/
    background-size:100px;
}
div{
    /*背景图片缩放一半*/
    background-size:50%;
}
div{
    /* 设置为contain后,会  自动调整缩放比例,保证图片完整的显示到所在区域 */
    /* 自动等比例缩放,是图片铺满整个区域,超出部分发会被隐藏 */
    background-size: cover;
}

设置多个背景,如果多张图片位置有部分重叠,前边的图片会把后边的覆盖。注意,这种方法中背景颜色一定要放到最后一条

div{
    background:url(../images/1.png) no-repeat left top,url(.../images/2.png) no-repeat right bottom #00f;
}

CSS选择器

选择器种类

类选择器

.开头,类选择器可以重复使用。代码样例

<style>
    /* 规范:尽量使用-,使用_可能有兼容性问题; */
    .d-cla{
        color:#080808;
    }
    .e-cla{
        margin:3px;
        font-size:12px;
    }
</style>
<body>
    <div class="d-cla e-cla">div_class</div>
</body>

ID选择器

#开头,ID选择器只能使用一次。代码示例

<style>
    #app{
        font-size:14px;
    }
</style>
<body>
    <div id="app">i am app</div>
</body>

属性选择器

用于选取标签中带有某些特殊属性的选择器

<style>
    /* 选取带有title属性的a标签 */
    a[title]{
        font-size:14px;
    }
    a[title="搜狐"]{
        font-size:20px;
    }
    a[title^="1"]{
        font-size:15px;
    }
    a[title*=""]{
        font-size:16px;
    }
    a[title$="2"]{
        font-size:17px;
    }
</style>
<body>
    <div>
        <a href="www.baidu.com" title="百度"></a>
        <a href="www.souhu.com" title="搜狐"></a>
        <a href="#" title="腾讯"></a>
        <a href="#" title="腾讯2"></a>
        <a href="#" title="1阿里"></a>
        <a href="www.sina.com"></a>
    </div>
</body>

具体用法说明如下

选择器写法示例含义
E[attr]存在attr属性即可
E[attr=val]attr属性值为val
E[attr*=val]attr属性值包含val字符,并且val字符在任意位置
E[attr^=val]attr属性值包含val字符,并且val字符在开始位置
E[attr$=val]attr属性值包含val字符,并且val字符在结束位置

逻辑选择器

  1. 交集选择器由标签选择器和类选择器组成,写法如下
<style>
p.p-class{
    color:red;
    font-size:14px;
}
</style>

<div>
    <p class="p-class">abc</p>
</div>
  1. 并集选择器,使用,分割
<style>
div,p,span{
    color:red;
    font-size:14px;
}
</style>

<div>
    <p>abc</p>
</div>
<span>abc</span>
  1. 后代选择器,用于选择标签的后代(子、孙所有后代均可),使用空格分割
<style>
/* div包含的p被选中 */
div span{
    color:green;
}
</style>

<div>
    <p>abc</p>
    <p><span>def</span></p>
</div>
<span>abc</span>
  1. 子元素选择器,用于选择子级(下一级)元素,使用>分割
<style>
/* .ul-c的下一级li(亲儿子) */
.ul-c > ul > li{
    color:green;
}
</style>

<div>
    <ul class="ul-c">
        <li>一级</li>
        <ul>
            <li>1.1</li>
            <li>1.2</li>
        </ul>
    </ul>
</div>
<span>abc</span>
  1. 通配符选择器

*代表选择所有,代码样例

*{
    font-size:15px;
}
  1. 选择同级且在后边
/*选择block-zi类型元素后边的block-chou类型元素*/
.block-zi~.block-chou{
    background:red;
}

伪类选择器

伪类选择器用于向某些选择器添加特殊效果,使用:开头

链接伪类选择器

链接伪类选择器主要针对<a>标签,包括:

a:link{
    /* 未访问的链接 */
    /* 常用 */
    font-weight:bold;
}
a:visited{
    /* 已访问的链接 */
    font-family:"Microsoft Yahei";
}
a:hover{
    /* 鼠标移动到链接上 */
    /* 常用 */
    font-size:14px;
}
a:active{
    /* 选定的链接,点击后不松开鼠标时 */
    font-style:italic;
}
input:focus{
    /*点击后鼠标移开保持点击时的状态*/
    /*由于div等元素无法接受键盘或其他用户事件,即不支持:focus伪类,可通过增加tabindex属性使其支持:focus*/
}

鼠标样式cursor

cursor: auto | crosshair | default | hand | move | help | wait | text | w-resize |s-resize | n-resize |e-resize | ne-resize |sw-resize | se-resize | nw-resize |pointer | url (url)
css鼠标样式

结构(位置)伪类选择器,CSS3新特性

:first-child选取属于其父元素的第一个子元素

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

:nth-child(n)选取属于其父类的第n个子元素,n可以是数字、关键词或公式

:nth-last-child(n)和nth-child相反,这里从最后一个子元素开始计数

<style>
    li:first-child{
        /*选择大娃*/
        color:red;
    }

    li:last-child{
        /*选择七娃*/
        color:purple;
    }

    li:nth-child(4){
        /*选择四娃*/
        color:green;
    }

    li:nth-child(odd){
        /*选择 1,3,5,7娃(所有奇数)*/
        /*所有偶数为:even*/
    }

    li:nth-child(n){
        /*选择所有,n从0开始*/
        /*偶数:2n*/
        /*奇数:2n+1*/
        /*3的倍数:3n*/
    }

    li:nth-last-child(even){
        /* 和nth-child相反,nth-last-child从最后一个往前数 */
        color:skyblue;
    }
</style>

<body>
    <div>
        <ul>
            <li>大娃</li>
            <li>二娃</li>
            <li>三娃</li>
            <li>四娃</li>
            <li>五娃</li>
            <li>六娃</li>
            <li>七娃</li>
        </ul>
    </div>
</body>

目标伪类选择器

用于选取当前活动的目标元素,:target表示

:targer{
    /*当前选中状态的文字变为红色*/
    color:red;
}

其他常用伪类选择器

  1. :required匹配表单中必填元素
  2. :optional匹配表单中选填的元素
  3. :in-range:out-range匹配在范围之内和不在范围之内
  4. :valid:invalid符合表单验证的和不符合表单验证的
  5. :read-only:read-write是否只读, 是否可读写元素。不只用于表单中,也适用于<div contenteditable=""></div>

伪元素选择器

  1. ::first-letter文本的第一个字

  2. ::first-line文本的第一行

  3. ::selection文字被选中的状态

  4. ::before::after

    div::before{
        content:"前边插入文字";
    }
    div::after{
        content:"后边插入文字";
    }
    
    /* html */
    <body>
        <div>abc</div>
    </body>
    
    /*
    显示样式为:
    前边插入文字abc后边插入文字
    */

选择器详解

before和after伪元素

之所以被称为伪元素,是因为他们不是真正的HTML页面元素,但是其所有的用法和表现行为与真正的页面元素一样,可以对其使用CSS样式,表面上看起来是页面上某些元素的展现,实际上是CSS样式的行为

<style>
    div::before{
        content:"my name is ";
        background-color: red;
        border: 1px solid red;
    }
</style>
<div>
    petter
</div>

注意:伪元素选择器本质上是在该元素内插入了一个元素(标签,盒子)只不过是行内元素,在浏览器控制台元素中可以看到::before元素

常见用法包括:

  1. 鼠标经过之后插入一个伪元素

    div{
        width: 100px;
        height: 200px;
        margin: 100px auto;
        position: relative;
    }
    div:hover::before{
        content: "鼠标经过";
        width: 100%;
        height: 100%;
        border: 10px solid rgba(255,255,255,.3);
        display: block;/*转换为块元素*/
        position: absolute;
        top: 0;
        left: 0;
        box-sizing: border-box;/*把border和padding都算作width中*/
    }

盒子模型

网页布局的本质:把网页元素,如文字、图片等,放到盒子中,然后通过css摆放盒子的过程。

边框

边框的语法如下:

/*边框:实线,红色,5像素*/
.border-div{
    border-width:5px;
    border-color:red;
    border-style:solid;/*solid实线,dashed虚线,none无边框,dotted点线,double双实线*/
}
/*综合写法*/
.border-div{
    border:1px solid red;
}
/*单独设置一条边*/
.border-top-div{
    border-top-color:green;
    border-top:1px solid green;
}

设置细线表格

table{
    border:1px solid red;
    border-collapse:collapse;/*合并相邻边框*/
}
td{
    border:1px solid red;
}

<table cellspacing="0" cellpadding="0">
    <tr>
        <td>2</td>
        <td>2</td>
        <td>2</td>
        <td>2</td>
    </tr>
    <tr>
        <td>2</td>
        <td>2</td>
        <td>2</td>
        <td>2</td>
    </tr>
</table>

圆角边框

/*一个数值表示四个角都相同*/
border-radius:5px;

/*取宽度和高度的一半,是一个正圆*/
width:200px;
height:200px;
border-radius:100px;

/*取50%也是一个正圆*/
border-radius:50%;

/*两个值,分别代表左上和右下10px,右上角和左下角40px,对角线的关系*/
border-radius:10px 40px;

/*三个值,左上10px,右上左下20px,右下30px*/
border-radius:10px 20px 30px;

/*四个值,左上,右上,右下,左下*/
border-radius:10px 20px 30px 40px;

/*胶囊效果*/
border-radius:100px;
height:100px;
width:200px;

/*柠檬效果*/
border-radius:100px 0;
width:200px;
height:200px;

内边距

内边距☞边框与内容之间的边距

/*上下左右内边距*/
padding-left:20px;
padding-right:20px;
padding-top:30px;
padding-bottom:30px;

/*整体设置内边距*/
/*上下左右一样*/
padding:20px;
/*上下10px,左右30px*/
padding:10px 30px;
/*上10,左右20下30*/
padding:10px 20px 30px;
/*上右下左*/
padding:10px 20px 30px 40px;

外边距

外边距👉边框与其他块的距离,外边距常用来定义盒子居中对齐

margin-top:20px;
margin-right:20px;
margin-bottom:20px;
margin-left:20px;
margin:10px 10px 10px 10px;

水平居中效果:

/*盒子必须制定了高度,左右设置为auto*/
margin:30px auto;
height:200px;

/*文字水平居中*/
text-align:center;

内外边距常见问题

  1. 清除元素的内外边距

    <style>
    *{
        margin:0;
        padding:0;
    
    }
    </style>
    
    <body></body>
  2. 行内元素没有上下边距,不要指定

    /*上下内外边框设置了也不起作用*/
    span{
        margin:30px 50px;
        padding:50px;
    }
  3. 外边距合并

    <style>
        /*div-1和div-2之间的距离为100px,两个外边距会合并,以大的外边距为准*/
        .div-1{
            height:300px;
            width:300px;
            margin-bottom:100px;
        }
        .div-2{
            height:300px;
            width:300px;
            margin-top:50px;
        }
    </style>
    
    <body>
        <div class="div-1"></div>
        <div class="div-2"></div>
    </body>
  4. 嵌套块外边距合并(外边距塌陷)问题

    <!-- 内外嵌套的块元素,如果父块没有边框,即便给子块设置了外边距,也是父块显示外边距,子块在父块中没有外边距 -->
    <style>
        .father{
            width:300px;
            height:300px;
            background-color:red;
          
        }
    
        .son{
            width:100px;
            height:100px;
            background-color:green;
            margin-top:30px;
        }
    </style>
    <body>
        <div class="father">
            <div class="son"></div>
        </div>
    </body>
    
    <!-- 决绝方式:
        1. 设置父块1px边框
        2. 设置溢出隐藏属性    overflow:hidden
     -->

盒子的宽度和高度

外盒尺寸: width+border+padding+margin

内盒尺寸: width+border+padding

如果盒子没有指定宽度和高度(100%也不行),padding不影响盒子的大小

盒子模型布局稳定性问题,如果布局使用宽度、内外边距均可实现,按照优先级选择宽度>内边距>外边距。原因是:

  1. margin有外边距合并
  2. padding会影响盒子大小,需要进行加减计算

盒子中的插入图片和背景图片

  1. 插入图片

    <style>
        div{
            width:400px;
            height:400px;
        }
        div img{
            width:200px;
            height:200px;
            margin-top:30px;
            margin-left:50px;
        }
    </style>
    <div>
        <img src="../img/test.png" alt="">
    </div>
  2. 背景图片

    <style>
        div{
            width:400px;
            height:400px;
            background:#fff url(img/sun.jpg) no-repeat;
            /*背景图片更改图片位置*/
            background-position:30px 50px;
            /*背景图片只能这样更改大小*/
            background-size:200px; 200px;
        }
    </style>
    <div></div>

使用场景:

  1. 一般超大图片,小图标适用背景图片
  2. 产品展示之类的展示框适合用插入图片

CSS3中的盒子计算方式

新属性box-sizing,可以设置盒子模型的计算方式,可选值包括content-box盒子大小为border+padding+border,此选项为默认值,也是w3c推荐的盒子模式、border-box盒子大小为width,即padding和border包含到width里边

盒子阴影

box-shadow:水平偏移 垂直偏移 模糊距离 阴影尺寸(影子大小) 阴影颜色 内外阴影
/**/
box-shadow:0px 0px 5px 15px rgba(180, 190, 201, .4) inset;

属性说明:

属性名是否必须描述
h-shadow水平偏移量,允许负数
v-shadow垂直偏移量,允许负数
blur模糊距离
spread阴影的尺寸
color阴影颜色,可设置rgba透明色
inset将外部阴影改为内部阴影

可以设置多种阴影样式,通过逗号区分

box-shadow:0px 0px 5px rgba(255,255,255,.4) inset,0px 0px 5px rgba(255,255,255,4);

CSS浮动

普通流

一个HTML文档内标签元素从上到下,从左到右的排列顺序,如:块级元素独占一行、行内元素从左到右,这种布局方式叫普通流(标准流)

浮动

设置了浮动的元素会脱离标准流布局的控制,移动到其父元素中指定的位置。浮动体现在漂浮的概念,浮动元素会漂浮在标准流的上边,压住标准流

浮动语法如下:

div{
    /*可选属性包括:元素左浮动left,元素右浮动right,元素不浮动none*/
    float:left;
}

浮动规则:

  1. 如果一个父盒子里的子盒子其中一个有浮动,则其他子盒子也都需要浮动才能一行对齐显示。
  2. 元素添加浮动后,元素会具有行内块元素的特性,元素的大小完全取决于定义的大小
  3. 浮动根据元素书写的位置来显示

清除浮动

清除浮动的本质:
很多时候,父级盒子不方便或不能确定高度(子级盒子有自己的高度,可以撑开父级),但这是如果所有的子级设置为浮动,浮动后的盒子不占用标准布局的高度,这时候父级盒子后边的盒子会飘到两个子级盒子的下边(父级盒子的高度为0),样例如下:

<head>
    <style>
        .father-1{
            /*方式二,清除浮动,overflow属性中hidden、auto、scroll都可以清除浮动,一般使用hidden*/
            overflow:hidden;
        }

        .son-1{
            height:120px;
            width:120px;
            background-color:red;
            float:left;
        }

        .son-2{
            height:120px;
            width:120px;
            background-color:green;
            float:left;
        }

        .clear{
            /*方式一:清除浮动的影响*/
            clear:both;
        }
        .father-2{
            height:240px;
            width:240px;
            background-color:pink;
        }

        /*方式三*/
        .clearfix:after{
            content:".";/*内容为小点,尽量不要空,防止旧版本浏览器后空隙*/
            display:block;
            height:0;
            visibility:hidden;/*隐藏盒子*/
            clear:both;
        }
        /*以上方式三在ie6,ie7中不支持,ie6,ie7使用以下方法*/
        .clearfix{
            /*带有*的属性只有ie6,ie7才执行;zoom是ie6,ie7清除浮动的方法*/
            *zoom:1;
        }

        /*方式四*/
        .clearfix:before, .clearfix:after{
            content:"";
            display:table;/*触发bfc防止外边距合并*/
        }
        .clearfix:after{
            clear:both;
        }
    </style>
</head>
<body>
<div class="father-1">
    <div class="son-1"></div>
    <div class="son-2"></div>
        <!-- 额外盒子,用来清除浮动 -->
    <div class="clear"></div>
</div>
<div class="father-2">
</div>
</body>

清除浮动的方式:

  1. 浮动块的后边添加一个空的标准布局块
  2. 在浮动块的父级块中使用overflow:hidden;属性
  3. 使用:after伪元素清除浮动,after伪元素是空元素的升级版,不需要添加空元素;代表网站:网易
  4. 双伪元素清除浮动;代表网站:小米、腾讯

版心

网页中主体内容的部分,一般在浏览器窗口水平居中显示,常见的宽度为:960px、980px、1000px、1200px等

布局流程

  1. 确认版心(可视区)
  2. 分析页面中的行模块,以及每个行模块的列模块
  3. 编写HTML结构
  4. CSS初始化,运用盒子模型通过DIV+CSS布局控制各个模块

定位

边偏移

包括上、右、下、左四个边,可以分别定义偏移量

属性描述
top顶端偏移量,定义元素相对于其父元素的上边线的距离
bottom底端偏移
left左端偏移
right右端偏移

定位模式(定位分类)

position属性用来定义元素的定位模式,属性值包括

属性值描述边偏移作用
static自动定位,默认的定位方式边偏移无效一般用来清除定位
relative相对定位,相对于其原文档流的位置进行定位相对于本元素的标准流布局左上角位置移动原来的位置继续占有
(不脱离标准流)
absolute绝对定位,相对于其上一个已经定位的父元素进行定位如父元素都没有定位,从浏览器左上角开始移动
如父元素有定位,从最近的父元素左上角开始移动
不占用原来位置
(完全脱离标准流)
fixed固定定位,相对于浏览器窗口进行定位以浏览器左上角位置开始移动不占原来位置
(完全脱离标准流)

一般子级元素使用绝对定位时,上一级父元素最好使用相对定位(子绝父相)。因为绝对定位不占用标准流位置,如果父元素使用相对定位,则父元素后边的元素会占用该元素的位置(往上移动)。

定位的常见作用:

  1. 在盒子模型中,子元素不会占用父元素的padding的位置,使用定位可以在父元素的padding位置中显示元素

  2. 将行内元素转换为块元素

    和浮动一样,元素添加了绝对定位和固定定位之后,元素模式也会发生改变,转换为行内块

    span{
        position: absolute;
        width: 100px;
        /*行内元素本来没有高度*/
        height: 100px;
    }
  3. 使盒子水平或垂直居中,加了绝对定位的盒子,使用margin:0 auto;居中就不起作用了,样例代码:

    .father{
        width:800px;
        height:400px;
        background-color:pink;
        margin: 40px auto;
        position: relative;
    }
    
    .son{
        width:100px;
        height:40px;
        background-color:purple;
        /*相对定位,定位左走50%,这时整个元素偏右一半,向左平移自己宽度的一般,即50px*/
        position:absolute;
        left:50%;/*这里的50%是父级元素的一半*/
        margin-left:-50px;/*这里的50px是自己高度的一半*/
      
        top:50%;
        margin-top:-20px;
    }

叠放次序

z-index用来设定叠放次序,其取值可以是正整数、负整数、零;越大的值越靠上。

  1. 如果两个元素取值相同,按书写顺序,后来者居上;
  2. 只有设定了相对定位、固定定位、绝对定位三者之一才有这个属性;

CSS动画

过渡动画

在CSS3中使用transition可以实现过度动画效果,当前元素只要规定的属性发生变化,就可以实现平滑的过渡,语法格式如下:

div{
    /*有多组属性变化可以用逗号隔开*/
    /*属性说明:要过度的属性 花费时间 运动曲线 开始时间*/
    transition: width 0.3s ease 0s;/*为宽度属性添加过度效果,过渡时间0.3秒,使用ease曲线,立即开始*/
    /*可以简写*/
    transition: width 0.3s;
}

属性说明:

属性描述
transition简写属性,设置以下四个过度属性
transition-property使用过渡效果的属性名称
transition-duration过渡效果花费的时间
transition-timing-function过渡效果的时间曲线,默认是ease
transition-delay过渡效果的开始时间,默认0

其中,transition-timing-function的可选属性包括:linear(匀速)、ease(逐渐减缓)、ease-in(加速)、ease-out(减速)、ease-in-out(先加速后减速)

如果所有属性变化都设置动画,可以把过度属性设置为all

代码示例(注意过渡效果在div中定义,在hover中定义会有问题):

<head>
    <style>
        div{
            width:200px;
            height: 100px;
            background-color: red;
            transition: width 0.5s ease-in 0s,height 0.5s ease-out 0s;
        }
        div:hover{
            width:400px;
            height: 300px;
        }
    </style>
</head>
<body>
    <div>
        
    </div>
</body>

2D变形

transform可以实现元素的位移、旋转、缩放、倾斜、矩阵等效果,配合过渡和动画可以实现以前Flash的效果,有多组变形效果,可以空格隔开,注意在一个选择器中transform只能定义一次

移动效果

通过translate(x,y)实现移动效果,使用方式为:

/*x,y轴同时移动*/
div{
    transform: translate(50px,50px);
}
/*只移动x轴*/
div{
    transform: translateX(50px);
}
/*之移动y轴*/
div{
    transform: translateY(50px);
}

translate的移动距离如果是百分比,不是以父元素的宽度为准,而是以自己的宽度为准,如下代码为向右移动100像素

div{
    width:200px;
    transform: translateX(50%);
}

使用此特性和定位配合可以快速实现居中对齐,方法如下:

div{
    width:200px;
    height:200px;
    background-color: red;
    position absolute;
    left:50%;
    top: 50%;
    transform: translateX(-50%,50%);
}

缩放效果

scale可以对元素进行水平、垂直缩放,transform: scale(0.8,0)该语句使用scale 方法对元素在水平方向上缩放了20%,垂直方向不缩放。scale的取值默认为1,当设置为0.01~0.99之间的任何值可以使一个元素缩小,任何大于1.01的值可以使元素放大。

transform一样,也可以进行单个方向的缩放

参数名效果
scale(x,y)水平+垂直缩放
scaleX(x)水平缩放
scaleY(y)垂直缩放

旋转效果

rotate(deg)可以对元素进行deg度数的旋转,正值为顺时针,负值为逆时针。

img{
    transform: rotate(90deg);/*顺时针旋转90°*/
}

旋转效果默认围绕中心点旋转,通过transform-origin可以对旋转中心点进行设置

img{
   	transform: rotate(180deg);
    /*以左上角为中心点*/
    /*transform-origin: top left;*/
    /*相对左上角坐标为(20,30)为中心点旋转*/
    transform-origin: 20px 30px;
}

倾斜效果

skew(deg,deg)可以设置元素的倾斜效果,通过transform: skew(30deg,0deg)对元素进行水平方向向上倾斜30°,垂直方向不倾斜。第二个元素不写默认为0。

设置文字的倾斜效果:

div{
    font-size:50px;
    font-weight: 700;
    moargin: 100px;
    transition: all 0.3s;
}
div:hover{
    transform: skew(0,-10deg);
}

3D变形

CSS3中的x、y、z轴坐标方向为:

  1. x轴左负右正
  2. y轴上负下正
  3. z轴里负外正

3D旋转

  1. rotateX()沿x轴立体旋转
  2. rotateY()沿y轴立体旋转
  3. rotateZ()沿z轴立体旋转

backface-visibility:hidden;可以设置图片背面不可见,默认可见。通过此属性可以实现翻硬币效果。

<head>
    <style>
        div{
            margin: 100px auto;
            width: 120px;
            height: 120px;
            position: relative;
        }
    
        div img{
            position: absolute;
            top: 0;
            left: 0;
            transition: all 1s;
        }
        div img:first-child{
            z-index: 1;
            backface-visibility: hidden;
        }
        div:hover img{
            transform: rotateY(180deg);
        }
    </style>
</head>
<body>
    <div>
        <img src="imgs/qian.svg">
        <img src="imgs/hou.svg">
    </div>
</body>

透视(perspective)

显示器是一个2D平面,图像的立体感主要通过透视实现。透视的作用是在元素转换的过程中,呈现3D效果。透视的原理为:

  1. 近大远小
  2. perspective设置视距(视距表示视点距离屏幕的长短)(视点用于模拟透视效果时人眼的位置)

所以,视距越大效果越不明显,视距越小,下过越明显。

perspective作用于父级元素,可以对其内的所有子元素设置为透视效果。使用方式为:

<head>
    <style>
        div{
            perspective: 500px;
        }
        img{
            display: block;
            margin: 100px auto;
            transition: all 5s;
        }
        img:hover{
            transform: rotateX(180peg);
        }
    </style>
</head>
<body>
    <div>
        <img src="./img/a.png">
    </div>
</body>

3D移动

  1. translateX(100px)x轴移动100px
  2. translateY(100px)y轴移动100px
  3. translateZ(100px)z轴移动100px

其中Z轴的移动,在视觉上就是大小的变化,只有通过透视才能看到Z轴的移动效果。使用方法如下:

.father-div{
    perspective: 500px;
}
div:hover{
    /*当z轴移动距离等于视距时,元素会被无限放大*/
    transform: translateZ(100px);
}

translate3d(x,y,z)用于设置三个方向上的移动效果,其中,x、y的值可以是px,也可以是%,但z的值必须是px。

CSS3复杂动画

在css3中通过设置多个节点可以精确的控制一组或多组动画,常用来实现复杂的动画效果,语法格式为animation: 动画名称 动画时间 运动曲线 开始时间 播放次数 是否反向运动;动画中的属性包括:

属性描述
@keyframes定义动画效果
animation所有动画属性组合写法
animation-name使用@keyframes定义的动画名称
animation-duration设定动画完成一个周期所花费的秒或毫秒,默认0
animation-timing-function设定动画的速度曲线,默认ease
animation-iteration-count设定动画被播放的次数,默认1,可以设置为infinite无限循环播放
animation-direction设定动画是否在下一个周期你想播放,默认normal
animation-play-state设定动画是否正在运行或暂停,默认running
animation-fill-mode设定动画时间之外的状态

具体代码样例:

<head>
    <style>
        /*两段动画定义*/
        @keyframes go{
            from{
                transform: translateX(0);
            }
            to{
                transform: translateX(600px);
            }
        }
        /*多段动画*/
        @keyframes percentGo{
            10%{
                transform: translate3d(0,0,0);
            }
            50%{
                transform: translate3d(400px,200px,0) rotateY(180deg);
            }
            80%{
                transform: translate3d(0,0,0);
            }
        }
        
        div{
            width:100px;
            height:100px;
            background-color: red;
            /*全属性引用*/
            /*animation: go 2s ease 0s 2 reverse;*/
            /*简化引用*/
            animation: go 2s;
        }
    </style>
</head>
<body>
    <div>
        
    </div>
</body>

无缝滚动效果

<head>
    <style>
        div{
            width:200px;
            height: 100px;
            background-color: red;
            transition: width 0.5s ease 0s,height 0.5s ease-in 0s;
        }
        div:hover{
            width:400px;
            height: 300px;
        }


        nav{
            width:500px;
            height:100px;
            overflow: hidden;
        }
        ul{
            list-style: none;
            margin: 0;
            padding: 0;
        }
        nav ul{
            width:200%;
            animation: moving 5s linear infinite;
        }
        nav li{
            width:100px;
            height: 100px;
            background-color: red;
            float: left;
        }
        nav:hover ul{
            animation-play-state: paused;
        }
        @keyframes moving {
            from{
                transform: translateX(0);
            }
            to{
                transform: translateX(-500px);
            }
        }
        li:nth-child(5n){
            background-color: green;
        }
        li:nth-child(5n-1){
            background-color: red;
        }
        li:nth-child(5n-2){
            background-color: blue;
        }
        li:nth-child(5n-3){
            background-color: pink;
        }
        li:nth-child(5n-4){
            background-color: yellow;
        }
    </style>
</head>
<body>
    <div></div>

    <nav>
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
        </ul>
    </nav>
</body>

响应式布局

CSS3伸缩布局

Flex布局

在CSS3中可以设置块级元素的伸缩布局,在响应式开发中作用极大。伸缩布局的基本概念

  1. 主轴👉Flex容器的主轴用来配置Flex项目,默认是水平方向的。
  2. 侧轴👉与主轴垂直的轴是侧轴,默认是垂直方向的。
  3. 方向👉默认主轴从左到右,从上到下。
  4. 主轴和侧轴并不是固定的,可以通过flex-direction交换。

值得注意的是,Flex布局规范发生了很大的变化,因为语法规范版本众多,浏览器支持不一致,故Flexbox布局使用的不多

Flex布局各属性详解

  1. min-width:10px;最小宽度10像素
  2. max-width最大宽度
  3. flex-direction设置排列方式,row:横向排列,column:纵向排列

Flex布局的使用样例

<head>
    <style>
        section{
            width:80%;
            height:100px;
            display: flex;/*使用伸缩布局*/
            flex-direction:row;
            min-width:500px;/*最小宽度*/
        }
        section div{
            height:100%;
        }
        section div:nth-child(1){
            background-color:red;
            flex:1;
        }
        section div:nth-child(2){
            background-color:greed;
            flex:2;
        }
        section div:nth-child(3){
            background-color:yellow;
            flex:1;
        }
    </style>
</head>
<body>
    <section>
    	<div>
            
        </div>
        <div>
            
        </div>
        <div>
            
        </div>
    </section>
</body>

常用属性

justify-content可以调整Flex布局中的主轴对齐方式(水平对齐),可选属性包括:

描述详细描述
flex-start默认值,位于容器开头子元素从父容器的开头开始排列
flex-end项目位于容器结尾子元素在父元素结尾开始排列,但盒子顺序不变
center中心子元素在父容器中间显示
space-between项目位于各行之间有空白的容器内左右的盒子贴近父盒子,中间的盒子平均分布空白边距
space-around项目位于各行之前、之间、之后都留有空白的容器内相当于给每个盒子都添加了外边距

align-items调整侧轴对齐(垂直对齐),可选属性

描述详细描述
stretch默认值,项目被拉伸以适应容器让子元素的高度拉伸,以适应父容器(子元素没有高度的情况下)
center项目位于容器中心垂直居中
flex-start项目位于容器开头垂直对齐开始位置
flex-end项目位于容器结尾垂直对齐结束位置

flex-wrap控制子盒子是否可以换行,可选属性包括

描述
nowrap默认值,项目不拆行或不拆列。不换行,则压缩显示。
wrap项目在必要的时候拆行或拆列
wrap-reverse项目在必要的时候拆行或拆列,但以相反的顺序。用的少

flex-flowflex-flowflex-direction的综合设置方式,用法为:

div{
    display: flex;
    flex-flow: column nowrap;
}

align-content设置堆栈对齐(由flex-wrap产生的独立行)。

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

div{
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    align-content: center;
}

可选的属性包括:

描述
stretch默认值,项目被拉伸
center项目位于容器中心
flex-start项目位于容器开头
flex-end项目位于容器结尾
space-between项目位于各行之间留有空白的容器内
space-around项目位于各行之前、之后都留有空白的容器之内

order属性用来设置子项目的排列顺序,数字越小排列越靠前,可以是负值,默认为0。使用方式为:

div{
    order: 1;
}

CSS其他

CSS的引入方式

  1. 内部样式

    <!DOCTYPE html>
    <html>
    <head>
        <!-- 在html5中type可省略 -->
        <!-- css可以写在任何位置,一般都写在head标签中 -->
        <style type="text/css">
            .cls{
                background:#ccc
            }
        </style>
    </head>
    <body></body>
    </html>
  2. 行内样式

    <!DOCTYPE html>
    <html>
    <head></head>
    <body>
        <div style="color:#ccc;"></div>
    </body>
    </html>
  3. 外部样式

    <!DOCTYPE html>
    <html>
    <head>
        <link href="../css/my.css" rel="stylesheet" type="text/css" />
    </head>
    <body></body>
    </html>

三种样式表比较

样式表优点缺点使用场景控制范围
行内样式表书写方便,权重高没有实现样式和结构分离较少控制一个标签
内嵌样式表部分结构和样式分离没有彻底分离较多控制一个页面
外部样式表完全实现结构和样式分离需要引入最多控制整个站点

CSS三大特性

层叠性

  1. 同一优先级的选择器样式冲突遵,循就近原则,即哪个样式的定义离得近,执行那个定义
  2. 样式不冲突,则都能执行

继承性

子标签会继承父标签的样式,子元素可以继承的样式有text-*,font-*,line-*以及color属性

特殊性(优先级)

不同的选择器具有不同的优先级(权重),选择器的权重通过specificity衡量,不同选择器的权重为:

选择器贡献值
继承的属性0,0,0,0
标签选择器0,0,0,1
类选择器、伪类选择器、伪元素选择器、属性选择器0,0,1,0
id选择器0,1,0,0
行内样式1,0,0,0
!important

!important属性用法:

div{
    /* important具有最高优先级,一旦出现优先执行 */
    color:orange!important;
}

选择器的权重可以叠加,但各种层级之间不存在进位关系,即十个标签选择器的权重为0,0,0,10而不是0,0,1,0,继承的权重为0,即便是继承自important权重也是0,叠加效果如下:

<style>
    .nav ul li{
        /*权重0,0,1,2*/
        color: black;
    }
    nav ul li{
        /*权重0,0,0,3*/
        color: green;
    }
    ul li{
        /*权重0,0,0,2*/
        color: yellow;
    }

    li{
        /*权重0,0,0,1*/
        color: blue;
    }
</style>

<div>
    <nav class="nav">
        <ul>
            <li>序号1</li>
            <li>序号2</li>
            <li>序号3</li>
        </ul>
    </nav>
</div>

标签显示模式

块级元素,独占一行,默认宽度为100%。块级元素内可以放块级元素和行内元素(p和标题h1~h6都是文字类标签比较特殊,只有文本能组成段落,文字类标签内部不能放其他块元素)

行内元素,不换行,无法设置宽高,但水平方向的padding和margin可以设置,默认宽度就是内容的宽度,行内元素只能容纳纯文本和行内元素(a标签比较特殊,内部可以放块元素)。

行内块元素,有几个特殊的标签<img>,<input>,<td>,它们是行内元素,但是具有块元素的特点,即可以对他们设置宽高和对齐属性

可以转换标签的显示模式,方式为:

div{
    /* 块级标签转换为行内标签模式 */
    display:inline;
}
span{
    /* 行内标签转换为块级 */
    display:block;
}
a{
    /* 行内标签转换为行内块模式 */
    display:inline-block; 
}

元素的显示和隐藏

CSS中有三个参数可以设置元素显示和隐藏,分别是display、visibility、overflow

  1. display设置对象是否显示及如何显示,(此方法最常用)

    .hid-div{
        /*隐藏元素,元素没有删除,只是被隐藏,位置也不保留*/
        display: none;
    }
  2. visibility设置是否显示对象,hidden隐藏、visible显示

    .hid-div2{
        /*隐藏元素,但是元素的位置被保留*/
        visibility: hidden;
    }
  3. overflow溢出隐藏,设置当对象的内容超过其指定的高度时如何管理内容,可选的参数如下:

    参数说明
    visible不剪切内容,也不添加滚动条
    auto超出自动显示滚动条,不超出不显示滚动条
    hidden不显示超出对象尺寸的内容
    scroll不管是否超出尺寸,都显示滚动条

设置溢出文字的显示和隐藏,包括word-break、white-space、text-overflow三种方式

  1. word-break设置自动换行规则(主要用来处理英文),可选参数包括

    属性说明
    normal使用浏览器默认的规则
    break-all允许在单词内换行
    keep-all只能在半角空格或连字符处换行
  2. white-space设置对象内文本的显示方式,通常用于强制一行显示内容,可选参数包括

    属性说明
    normal默认的处理方式,显示不开自动换行
    nowrap强制在一行内显示所有文本,直到文本结束或遭遇br标签
  3. text-overflow文字溢出,使用此属性需要强制文本在一行显示white-space:nowrap;,否则无效

    属性说明
    clip直接裁剪,不显示省略标记(...)标示对象内文本溢出
    ellipsis当对象内文本溢出时显示省略标记(...)

CSS精灵图

CSS精灵是一种处理网络图像的方式。它将一个页面涉及到的所有零星图片(图标)都集中到一张大图中去,然后将大图应用于网页。这样,当用户访问页面时,只需要发送一次请求即可获取全部图片。这种很多小的图片合成的大图被称为精灵图

精灵图主要通过背景图片使用,通过background-position控制位置,注意图片往上和左走是负值

CSS滑动门

使用CSS精灵图(主要是背景位置)和盒子的padding撑开宽度,方便适应不同字体

<style>
	/*
     * a设置背景左侧,padding撑开合适的宽度
     * span设置背景右侧,pdding撑开合适的宽度,剩下由文字继续撑开
     */
    a {
        background: url('../img/bk.jpeg') no-repeat;
        display: inline-block;
        height: 33px;
        padding-left: 15px;
    }
    a span {
        /*背景右对齐*/
        background: url('../img/bk.jpeg') no-repeat right;
        display: inline-block;
        height: 33px;
        padding-right: 15px;
    }
</style>
<li>
	<a href="#">
        <span>导航栏内容</span>
    </a>
</li>