CSS3

CSS参考手册

一、初识CSS3

1.1 CSS是什么

CSS3在CSS2.1的基础上增加了很多强大的新功能。目前主流浏览器chrome、Safari、firefox、opera,甚至360 都支持CSS3 的大部分功能。
在编写CSS3样式时,不用的浏览器可能需要不同的前缀。他表示该CSS属性或规则尚未成为W3C标准的一部分,是浏览器的私有属性。虽然目前新版本的浏览器都不需要前缀,但是为了更好的向前兼容,前缀还是少不了。

前缀 浏览器
-webkit chrome和safari
-moz firefox
-ms IE
-o opera


1.2 CSS3能做什么

CSS3能给我们带来什么好处,简单的说CSS3吧很多以前需要图片和脚本来实现的效果,甚至动画效果,只需要短短几行代码就能搞定。比如圆角,图片边框,文字阴影和盒阴影,过渡、动画等。
CSS3简化了前端开发工作人员的设计过程,加快页面载入速度。
先来看看CSS3有哪些强大的功能:

  • 选择器
    CSS2我们通常用class、ID或tagname来选择HTML元素,CSS3的选择器强大的难以置信。
    它们可以减少在标签中的class和ID的数量更方便的维护样式表、更好的实现结构与表现的分离

  • 圆角效果
    CSS2做圆角通常需要使用背景图片,或繁琐的元素拼凑,现在很简单,border-radius帮你搞定

  • 块阴影与文字阴影
    可以对任意DIV和文字增加投影效果。

  • 色彩
    CSS3支持更多的颜色和更广泛的颜色定义。新颜色CSS3支持HSL,CMYK,HSLA和RGBA。

  • 渐变效果
    以前只能用PS做出的图片渐变效果,现在可以用CSS写。IE中的滤镜也可以实现。

  • 个性化字体
    字体太单一?使用@font-Face 轻松实现定制字体。

  • 多背景图
    一个元素上添加多层背景图片。

  • 边框背景图
    边框应用背景图片

  • 变形处理
    你可以对HTML元素进行旋转、缩放、倾斜、移动、甚至以前只能用JS实现的强大动画。

  • 多栏布局
    可以让你不用使用多个DIV标签就能实现多栏布局,浏览器解释这个属性并生成多栏,让文本实现一个仿报纸多栏结构。

  • 媒体查询
    针对不同屏幕分辨率,应用不同的样式。


二、 边框 border

2.1 边框圆角border-radius

使用方法:

border-radius:10px;   /* 所有角都使用半径为10px的圆角 */ 
border-radius: 5px 4px 3px 2px;   /* 四个半径值分别是左上角、右上角、右下角和左下角,顺时针 */ 

border-radius的单位也可以用 em 但是目前兼容性不太好。


2.1 边框阴影 box-shadow

box-shadow是向盒子添加阴影。支持添加同一个或多个。
很简答的额一段代码,就实现了投影效果。语法如下:

box-shadow: X轴偏移量 Y轴偏移量 [阴影模糊半径] [阴影扩展半径] [阴影颜色] [投影方式];

参数介绍:

描述
X轴偏移量 必须。水平阴影位置,允许负值
Y轴偏移量 必须。垂直阴影的位置,允许负值
阴影模糊半径 可选。模糊距离
阴影扩展半径 可选。阴影尺寸
阴影颜色 可选。阴影颜色,省略默认为黑色
投影方式 可选。设置为 inset 时为内部阴影,省略为外阴影

注意: inset 可以写在参数的第一个或最后一个,其它位置是无效的。

实例1:为元素设置阴影

.box_shadow{
  box-shadow: 4px 2px 6px #333;
}

实例2:为元素设置内阴影

.box_shadow{
  box-shadow: 4px 2px 6px #333 inset;
}

实例3:添加多个阴影

.box_shadow{
  box-shadow: 4px 2px 6px #ff0000, -4px -2px 6px #000, 0 0 12px 5px #3c0 inset;
}
  • 阴影模糊半径与阴影扩展半径的区别
    阴影模糊半径:可选,其值只能是正值,如果为0时,表示阴影不具有模糊效果。值越大阴影边缘越模糊。
    阴影扩展半径:可选,值可正可负,为正阴影扩大,为负则缩小。

  • X轴偏移量和Y轴偏移量可以设置为负值
    X轴偏移

.boxshadow-outset{
    box-shadow: -4px 4px 6px #666;
}

Y轴偏移

.boxshadow-outset{
    box-shadow: 4px -4px 6px #666;
}


2.3 为边框应用图片 border-image

此属性比background属性复杂一些。
border-image语法:

border-image:url(border.png) 70 70 70 70 repeat

想想一下:一个矩形,有四个边框,如果应用了边框图片,图片应该怎么分布呢?图片会被自动分成四等分用于四个边框。
可以理解为它是一个切片工具,会自动把用作边框的图片切割。怎么切割呢?为了方便理解,做了一张特殊图片,由9个矩形(7070)拼成一张图(210210),并标注好序号。如图:

#border-image{
   background:#F4FFFA;
   width:210px; height:210px; border:70px solid #ddd;
   border-image:url(borderimg.png) 70 repeat  
}

效果如下:



5是不被显示的。repeat的意思就是重复,目前刚好被整除。修改div的宽高,再看:


2、6、8、4部分边角被裁切了,而且是居中开始重复的。


  • round参数
    round可以理解为圆满觉得铺满。为了实现圆满会被压缩或拉伸。
#border-image {
     border-image:url(borderimg.png) 70 round;
 }


  • stretch参数
    拉伸,有多长拉多长。
border-image:url(borderimg.png) 70 stretch;
2,4,6,8分别被拉伸显示


三、颜色

3.1 颜色之RGBA

语法:

color: rgba(R, G, B, A)

R、G、B三个参数取正整数值,0255;百分数取值范围0100%。超出范围的数值江北截至最接近的取值极限。并非所有浏览器都支持百分数值。A取值0~1,不可为负数。
实例:

background-color: rgba(100,120,60,.5);


3.2 渐变色

CSS3 Gradient 分为线性渐变(linear)和径向渐变(radial)。由于不同的渲染引擎实现简便的语法不同,这里只说一下线性渐变。


参数:第一个参数指定渐变方向,可以用角度的关键词或英文来表示

角度 用英文 作用
0deg to top 从下至上
90deg to right 从左至右
180deg to bottom 从上至下
270deg to left 从右至左
- to top left 右下角到左上角
- to top right 左下角到右上角

第一个参数省略时,默认为“180deg” ,等同于“to bottom”。
第二个参数和第三个参数表示颜色的起点和终点,可以有多个颜色值:

background: linear-gradient(to left, red, orange,yellow,green,blue,indigo,violet);


四、文字与字体

4.1 文字与字体 text-overflow 与 word-wrap

  • text-overflow
    用来设置是否使用一个省略标记(...)标示对象内文本溢出,语法如下:

但是,text-overflow 只是用来说明文字溢出时用什么方式显示,要实现溢出时产生省略号的效果,还需定义强制文本在一行内显示(white-space:nowrap)溢出内容为隐藏(overflow:hidden;),只有这样才能实现一处文本显示省略号的效果,代码如下:

text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;


  • word-wrap
    也可以用来设置文本行为,当前行超过指定容器的边界时是否断开转行,语法如下:

normal为浏览器默认值,break-word设置在长单词或url地址内部进行换行,此属性不常用,用浏览器默认值即可。


4.2 嵌入字体@font-face

@font-face能够加载服务器端的字体文件,让浏览器端可以显示用户电脑没有安装的字体。语法如下:

@font-face {
    font-family : 字体名称;
    src : 字体文件在服务器上的相对或绝对路径;
}

设置之后,就可以像使用普通字体一样,在font-*中设置字体样式,比如:

p {
    font-size :12px;
    font-family : "My Font";   /*必须项,设置@font-face中font-family同样的值*/
}

说到浏览器对@font-face的兼容问题,这里涉及到一个字体format的问题,因为不同的浏览器对字体格式支持是不一致的,这样大家有必要了解一下,各种版本的浏览器支持什么样的字体,前面也简单带到了有关字体的几种格式,下面我就分别说一下这个问题,让大家心里有一个概念:

一、TureTpe(.ttf)格式:

.ttf字体是Windows和Mac的最常见的字体,是一种RAW格式,因此他不为网站优化,支持这种字体的浏览器有【IE9+,Firefox3.5+,Chrome4+,Safari3+,Opera10+,iOS Mobile Safari4.2+】;

二、OpenType(.otf)格式:

.otf字体被认为是一种原始的字体格式,其内置在TureType的基础上,所以也提供了更多的功能,支持这种字体的浏览器有【Firefox3.5+,Chrome4.0+,Safari3.1+,Opera10.0+,iOS Mobile Safari4.2+】;

三、Web Open Font Format(.woff)格式:

.woff字体是Web字体中最佳格式,他是一个开放的TrueType/OpenType的压缩版本,同时也支持元数据包的分离,支持这种字体的浏览器有【IE9+,Firefox3.5+,Chrome6+,Safari3.6+,Opera11.1+】;

四、Embedded Open Type(.eot)格式:

.eot字体是IE专用字体,可以从TrueType创建此格式字体,支持这种字体的浏览器有【IE4+】;

五、SVG(.svg)格式:

.svg字体是基于SVG字体渲染的一种格式,支持这种字体的浏览器有【Chrome4+,Safari3.1+,Opera10.0+,iOS Mobile Safari3.2+】。

这就意味着在@font-face中我们至少需要.woff,.eot两种格式字体,甚至还需要.svg等字体达到更多种浏览版本的支持。


4.3 text-shadow

text-shadow 可以用来设置文本的阴影效果,语法如下:

text-shadow: X-Offset Y-Offset blur color;

X-Offset: 表示阴影的水平便宜距离,其值为正时阴影向右偏移;反之向左偏移。
Y-Offset: 指阴影垂直偏移距离,如果正值,阴影向下;反之向上偏移。
blur: 指阴影的模糊程度,值不能是负值,如果值越大,阴影越模糊;反之阴影越清晰;如果不需要阴影模糊设值为0。
color: 指阴影颜色,可以使用rgba色。
实例:

text-shadow: 0 1px 1px #fff


五、与背景相关的样式:

5.1 background-origin

background-origin设置元素的背景图片的原始起始位置,语法如下:

background-origin: border-box | padding-box | content-box
  • border-box 表示从边框开始;
  • padding-box 表示从内边距(默认值);
  • content-box 表示从内容区域开始。


注意:北京如果是repeat-* 这个属性无效,他会从边框开始显示;只有在no-repeat的时候生效。


5.2 background-clip

用来将背景图片做适当的剪裁以适应实际需要。语法如下:

background-clip: border-box | padding-box | content-box | no-clip

参数分别表示从边框、内填充,或者内容区域向外裁剪背景。no-clip表示不裁切,和参数boeder-box显示同样的的效果。
background-clip默认值为border-box。效果如下:



5.3 background-size

设置背景图片的大小,以长度值或百分比显示,还可以通过cover和contain来对图片进行伸缩。语法:

background-size: auto | width | percentage | cover | contain

取值说明:

  • auto 默认值,不改变背景图片的原始高度和宽度;
  • width 成队出现如200px 50px,将背景图片宽高一次设置为前面两个值;当设置为一个值时,将其作为图片宽度值来等比缩放
  • percentage 0~100%之间的任何值,将背景图片宽高依次设置为所在元素宽高,乘以前面百分比得出的数值;当设置为一个值时,将其作为图片宽度值来等比缩放
  • cover 覆盖,将背景图片等比缩放以填满整个容器;
  • contain 容纳,即将背景图片等比缩放至某一边贴紧容器边缘为止。

在这里查看演示


5.4 multiple backgrounds

多重背景,也就是CSS2里background的属性外加orgin、clip和size组成的新background的多次叠加,缩写时用逗号隔开每组值;用分解写法时,如果多个背景图片,而其他属性只有一个(例如background-repeat只有一个),表明所有背景图片应用该属性值。语法缩写如下:

background: [background-color] | [background-image] | [background-position] | [/background-size] | [background-repeat] | 
            [background-attachment] | [background-clip] | [background-origin],...

上面简写还能拆解成一下形式:

background-image:  url1,url2,...,urlN;
background-repeat : repeat1,repeat2,...,repeatN;
backround-position : position1,position2,...,positionN;
background-size : size1,size2,...,sizeN;
background-attachment : attachment1,attachment2,...,attachmentN;
background-clip : clip1,clip2,...,clipN;
background-origin : origin1,origin2,...,originN;
background-color : color;

注意:

  • 用逗号隔开每组background的缩写值;
  • 如果有size,需要紧跟position并且用 “/” 隔开;
  • 如果有多个背景图片,而其他属性只有一个(例如background-repeat只有一个),表明所有背景图片应该用该属性值。
  • background-color只能设置一个。
    实例:
background:url(http://static.mukewang.com/static/img/logo_index.png) no-repeat, 
           url(http://static.mukewang.com/static/img/logo_index.png) no-repeat;
background-position:left top,right bottom; 
background-size:200px, 150px;

等同于:

background:url(http://static.mukewang.com/static/img/logo_index.png) no-repeat left top / 200px 150px,
           url(http://static.mukewang.com/static/img/logo_index.png) no-repeat right bottom / 50% 40%;


5.5 综合实例:制作导航菜单

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>navbar</title>
  <style>
  .nav{
  color: #fff;
  width: 650px;
  height: 60px;
  display: flex;
  justify-content: space-evenly;
  align-items: center;
  border-radius: 10px;
  box-shadow: 0 4px 4px 0  rgba(200,10,10,.5);
  background: linear-gradient(to bottom,#ef5b53,red)
}
a{
  text-decoration:none;
  color:#fff;
  font-size:14px;
  text-shadow:0 2px 0 #c81f1f;
}
  </style>
</head>
<body>
  <div class="nav">
    <a href="#">Home</a>|
    <a href="#">About Me</a>|
    <a href="#">Portiolie</a>|
    <a href="#">Blog</a>|
    <a href="#">Resources</a>|
    <a href="#">Contact Me</a>
  </div>
</body>
</html>



六、CSS3选择器(上)

6.1属性选择器

在HTML中,通过各种各样的属性可以给元素增加很多附加信息,例如,通过id属性可以将不同的div元素进行区分。
在CSS2中引入了一些属性选择器,而CSS3在CSS2的基础上对属性选择器进行了扩展,新增三个属性选择器,是的选择器有了通配符的概念,这三个属性选择器与CSS2的属性选择器共同构成了CSS功能强大的属性选择器。

属性选择器 功能描述
E[att] 选择匹配元素E,且E元素定义了属性att,表示包含该属性的所有E元素
E[att^="val"] 选择匹配元素E,且E元素定义了属性att,其属性值以 val 开头 的任何字符串
E[att$="val"] 选择匹配元素E,且E元素定义了属性att,其属性值以 val 结尾 的任何字符串。刚好与E[att^="val"]相反
E[att*="val"] 选择匹配元素E,且E元素定义了属性att,其属性值 任意位置包含val 。即字符串与属性值中任意位置匹配

实例:

<a href="xxx.pdf">下载PDF文档</a>
<a href="#" class="icon">这个icon</a>
<a href="#" title="标题是more">标题是more</a>
a{color="#fff"}
a[href$=pdf]{
  background: orange;
}
a[class^=icon]{
  background: green;
}
a[title*=more]{
  background: blue;
}


6.2 结构性伪类选择器-root

root 选择器,从字面上可以很清楚的理解是根选择器,他的意思就是匹配元素E所在文档的根元素。在HTML文档中根元素始终是 html。

<div>:root选择器的演示</div>
:root {
  background: orange;
}

:root选择器等同于<html>元素,简单点说::root{background: orange;}html{background:orange}得到的效果相同。建议使用 :root 方法 。


6.3 结构性伪类选择器-not

not 选择器称为否定选择器,和Jquery的 :not 选择器一模一样,可以选择除某个元素之外的所有元素
拿 form 元素来说,比如你想给表单中除了submit按钮之外的input元素添加红色边框,css代码可以这样写:

<form action="#">
  <div>
    <label for="name">Text Input:</label>
    <input type="text" name="name" id="name" placeholder="没汁帅" />
  </div>
  <div>
    <label for="name">Password Input:</label>
    <input type="text" name="name" id="name" placeholder="没汁帅" />
  </div>
  <div>
    <input type="submit" value="Submit" />
  </div>
</form>  ​
form{
  width: 200px;
  margin: 20px auto;
}
div{
  margin-bottom: 20px;
}
input:not([type="submit"]){
  border: 1px solid red;
}

效果如下:



6.4 结构性伪类选择器-empty

:empty 选择器表示的就是空。用来选择没有任何内容的元素,这里没有内容值得是一点内容都没有,哪怕是一个空格也没有。

<p>这是一个段落</p>
<p>  </p>
<p></p>
p{
  background: orange;
  min-height: 30px;
}
p:empty{
  display: none
}


6.5 结构性伪类选择器-target

:target 选择器称为目标选择器,用来匹配文档(页面)的url的某个标志符的目标元素。举个栗子:

<h2><a href="#brand">Brand</a></h2>
<div class="menuSection" id="brand">content for Brand</div>
.menuSection{
  display: none;
}
:target{   /*这里的:target就是指id=“brand”的div对象*/
  display:block;
}

查看效果

  • 具体来说,触发元素的URL中的标志符通常会包含一个 # 号,后面带有一个 标志符名称,上面代码中是:#brand;
  • :target 就是用来匹配 id 为 brand 的元素(id="brand"的元素),上面代码中就是 div 元素。

多个 id 时的处理方式:
当同一个页面上有很多URL的时候可以取不同的名字,只要 # 号后的名称与 id=“”中的名称能对应就可以。栗子:

<h2><a href="#brand">Brand</a></h2>
<div class="menuSection" id="brand">
  content for Brand
</div>
<h2><a href="#jake">Brand</a></h2>
<div class="menuSection" id="jake">
 content for jake
</div>
<h2><a href="#aron">Brand</a></h2>
<div class="menuSection" id="aron">
  content for aron
</div>
#brand:target {
  background: orange;
  color: #fff;
}
#jake:target {
  background: blue;
  color: #fff;
}
#aron:target {
  background: red;
  color: #fff;
}


6.6 结构性伪类选择器 first-child

first-child 选择器表示的是选择父元素的第一个子元素的元素E。简单点理解就是选择元素中的第一个子元素,记住是子元素,不是后代元素。

举个栗子:
使用first-child选择器定位列表中的第一个列表项,并将序号颜色变为红色。

<ol>
  <li><a href="#">Link1</a></li>
  <li><a href="#">Link1</a></li>
  <li><a href="#">Link1</a></li>
  <li><a href="#">Link1</a></li>
</ol>
ol li{
  font-size: 20px;
  font-weight: bold;
  margin-bottom: 10px;
}
ol a{
  font-size: 16px;
  font-weight: normal;
}
ol li:first-child{
  color: red;
}

显示效果:



6.7 结构性伪类选择器 last-child

last-child 选择器,选择元素的最后一个子元素。例如改变列表的最后一个 li 的背景色,就可以使用这个选择器:ul li: last-child{background: blue;}

举个栗子,在博客排版中,每个段落都设置了 margin-bottom:20px; 假设不想让最后一个段落的 margin-botton,就可以使用last-child 选择器:

<div class="post">
  <p>第一段落</p>
  <p>第二段落</p>
  <p>第三段落</p>
  <p>第四段落</p>
  <p>第五段落</p>
</div>
p{
  margin: 0;
  padding: 0;
  line-height: 10px;
}
.post {
  padding: 10px;
  border: 1px solid #ccc;
  width: 200px;
  margin: 20px auto;
}
.post p{
  margin-bottom: 20px;
}
.post p:last-child{
  margin-bottom: 0;
}

实现的效果:


第一段落上边距和第五段落下边距是 line-height


6.8 结构性伪类选择器 nth-child(n)

:nth-child(n) 选择器是用来定位某个父元素的一个或多个特定的子元素。其中“n” 是其参数,而且可以使整数值(1、2、3、4),也可以是表达式(2n+1、-n+5)和关键词(odd、even),但参数 n 的起始值始终是 1 ,而不是 0
也就是说,参数 n 的值为0 时,选择器将选择不到任何匹配的元素。

  • :nth-child(n) 选择器中的 n 为一个表达式时,其中 n 是从 0 开始计算;
  • 当表达式的值为0或小于0的时候,不计算任何匹配的元素,如图:
n 2n+1 4n+1 4n+4 4n 5n-2 -n+3
0 1 1 4 - - 3
1 3 5 8 4 3 2
2 5 9 12 8 8 1
3 7 13 16 12 13 0
4 9 17 20 16 18 -1
5 11 21 24 20 23 -2

举个栗子:
通过:nth-child(n)选择器,并且参数使用表达式2n,将偶数行列表背景色设置为橙色。

<ol>
  <li>item1</li>
  <li>item2</li>
  <li>item3</li>
  <li>item4</li>
  <li>item5</li>
  <li>item6</li>
  <li>item7</li>
  <li>item8</li>
  <li>item9</li>
  <li>item10</li>
</ol>​
ol li:nth-child(2n){
  background: #ccc;
  color: red;
}
ol li:nth-child(2n+1){
  background: #ddd;
}


6.9 结构性伪类选择器 nth-last-child(n)

:nth-last-child(n) 选择器和前面的 nth-child(n) 选择器非常相似,只是这里多了一个 “last”,作用有所区别,表示从父元素的最后一个子元素开始计算,来选择特定的一个元素。

举个栗子:
选择下面列表中倒数第三个列表项,将其背景设置为橙色。

<ol>
  <li>item1</li>
  <li>item2</li>
  <li>item3</li>
  <li>item4</li>
  <li>item5</li>
  <li>item6</li>
  <li>item7</li>
  <li>item8</li>
  <li>item9</li>
  <li>item10</li>
  <li>item11</li>
  <li>item12</li>
  <li>item13</li>
  <li>item14</li>
  <li>item15</li>
</ol>​
ol li:nth-last-child(3){
  background: orange;
}

效果如下:



6.10 first-of-type选择器

:first-of-type 选择器类似于 first-child 选择器,不同之处就是指定了元素的类型,主要用来定位一个父元素下的某个类型的第一个子元素。

又来举个栗子:
通过 :first-of-type 选择器,定位div容器中的第一个 p 元素(p不一定是容器中的第一个子元素),并设置其为橙色。

<div class="wrapper">
  <div>我是一个块元素,我是.wrapper的第一个子元素</div>
  <p>我是一个段落元素,我是不是.wrapper的第一个子元素,但是他的第一个段落元素</p>
  <p>我是一个段落元素</p>
  <div>我是一个块元素</div>
</div>
.wrapper {
  width: 500px;
  margin: 20px auto;
  padding: 10px;
  border: 1px solid #ccc;
  color: #fff;
}
.wrapper div {
  background: green;
}
.wrapper p {
  background: blue;
}
.wrapper p:first-of-type{
  background: orange;
}

效果如下:



6.11 nth-of-type(n)选择器

:nth-of-type(n) 选择器和 :nth-child(n) 选择器非常类似,不同的是它只计算父元素中指定的某种类型的子元素。
当某个元素的子元素不单单是同一种类型的子元素时,使用:nth-of-type(n) 选择器来定位于父元素中某种类型的子元素是非常方便和实用的。
:nth-of-type(n) 选择器中的 “n” 和 :nth-child(n) 选择器中的 “n” 参数一样,可以是具体的整数,也可以是表达式,还可以是关键词。

举个栗子:
通过 :nth-of-type(2n) 选择器,将容器 “div.wrapper” 中偶数段数的背景设置为橙色。

<div class="wrapper">
  <div>我是一个Div元素</div>
  <p>我是一个段落</p>
  <div>我是一个Div元素</div>
  <p>我是一个段落</p>
  <div>我是一个Div元素</div>
  <p>我是一个段落</p>
  <div>我是一个Div元素</div>
  <p>我是一个段落</p>
  <div>我是一个Div元素</div>
  <p>我是一个段落</p>
  <div>我是一个Div元素</div>
  <p>我是一个段落</p>
  <div>我是一个Div元素</div>
  <p>我是一个段落</p>
  <div>我是一个Div元素</div>
  <p>我是一个段落</p>
</div>
.wrapper p:nth-of-type(2n){
  background: orange;
}


6.12 last-of-type选择器

:last-of-type 选择器和 :first-of-type 选择器功能是一样的,不同的是他选择的是父元素下的某个类型的 最后一个子元素

栗子栗子:
通过 :last-of-type 选择器,将容器 “div.wrapper” 中最后一个段落元素背景设置为橙色。

<div class="wrapper">
  <p>我是第一个段落</p>
  <p>我是第二个段落</p>
  <p>我是第三个段落</p>
  <div>我是第一个Div元素</div>
  <div>我是第二个Div元素</div>
  <div>我是第三个Div元素</div>
</div>
.wrapper p:last-of-type{
  background: orange;
}

演示结果:



6.13 nth-last-of-type(n)选择器

:nth-last-of-type(n) 选择器和 :nth-of-type(n) 是一样的,选择父元素中指定的某种子元素类型,但它的起始方向是从最后一个子元素开始,而且他的使用方法类似于上节介绍的 :nth-last-child(n) 选择器一样。

栗子:
通过 :nth-last-of-type(n) 选择器将容器“div.wrapper” 中的倒数第三个段落背景设置为橙色。

<div class="wrapper">
  <p>我是第一个段落</p>
  <p>我是第二个段落</p>
  <p>我是第三个段落</p>
  <p>我是第四个段落</p>
  <p>我是第五个段落</p>
  <div>我是一个Div元素</div>
  <p>我是第六个段落</p>
  <p>我是第七个段落</p>
</div>
.wrapper p:nth-last-of-type(3){
  background: orange;
}


6.14 only-child选择器

only-child 选择器选择的是父元素中只有一个子元素,而且只有唯一一个子元素。也就是说,匹配的元素的父元素中仅有一个子元素,而且是一个唯一的子元素。

举个栗子:
通过 “only-child” 选择器,来控制仅有一个子元素的背景样式,为了更好的理解,栗子通过对比的方式来向大家演示。

<div class="post">
  <p>我是一个段落</p>
  <p>我是一个段落</p>
</div>
<div class="post">
  <p>我是一个段落</p>
</div>
.post p{
  background: green;
  color: #fff;
  padding: 10px;
}
.post p:only-child {
  background: orange;
}


6.15 only-of-type选择器

:only-of-type 选择器用来选择一个元素是它的父元素的唯一一个相同类型的子元素。这样说或许不太好理解,这么说吧,:only-of-type 是表示一个元素他有很多的子元素,而其中只有一种类型的子元素是唯一的,使用:only-of-type 选择器就可以选中这个元素中的唯一一个类型子元素。

还是要举个栗子说明:
通过:only-of-type 选择器来修改容器中仅有一个div元素的背景色为橙色。

<div class="wrapper">
  <p>我是一个段落</p>
  <p>我是一个段落</p>
  <p>我是一个段落</p>
  <div>我是第一个div元素</div>
</div>
<div class="wrapper">
  <div>我是一个div</div>
  <ul>
    <li>我是一个列表项</li>
  <ul>
  <p>我是一个段落</p>
</div>
.wrapper div:only-of-type {
  background: orange;
}



七、 CSS3 选择器(下)

7.1 :enabled选择器

在web表单中,有些表单元素有可用(:enabled)和不可用(:disabled)状态,比如输入框,密码框,复选框等。在默认情况之下,这些表单元素都处在可用状态。那么我们可以用过伪选择器 :enabled 对这些表单元素设置样式。

举个栗子:
同过 :enabled 选择器,修改文本输入框的边框为2像素的红色边框,并设置他的背景色为灰色。

<form action="#">
  <div>
    <label for="name">Text Input:</label>
    <input type="text" name="name" id="name" placeholder="可用输入框"  />
  </div>
   <div>
    <label for="name">Text Input:</label>
    <input type="text" name="name" id="name" placeholder="禁用输入框" disabled="disabled" />
  </div>
</form>  
div{
  margin: 20px;
}
input[type="text"]:enabled {
  background: #f0f0f0;
  border: 2px solid red;
}


7.2 :disabled选择器

:disabled 选择器刚好与 :enabled 选择器相反,用来选择不可用表单元素。要正常使用 :disabled 选择器,需要在表单元素的HTML中设置 "disabled" 属性。

举个栗子:
通过 :disabled 选择器,给不可用输入框设置明显的样式。

<form action="#">
  <div>
      <input type="text" name="name" id="name" placeholder="我是可用输入框"/>
  </div>
  <div>
    <input type="text" name="name" id="name" placeholder="我是不可用输入框" disabled />
  </div>
</form>
form{
  margin: 50px;
}
div{
  margin-bottom: 20px;
}
input{
  background: #fff;
  padding: 10px;
  border: 1px solid orange;
  border-radius: 3px;
}
input[type="text"]:disabled{
  background: rgba(0,0,0,.1);
  border: 1px solid rgba(0,0,0,.1);
  color: rgba(0,0,0,.1);
}


7.3 :checked选择器

在表单元素中,单选按钮和复选按钮都具有选中和未选中状态(要想覆盖这两个按钮默认样式比较困难)。在CSS3中我们可以通过状态选择器 :checked 配合其他标签实现自定义样式。而 :checked 表示的是选中状态。

举例:
通过 :checked 状态来自定义复选框效果。

<svg viewBox="0 0 1024 1024" width="0"><defs><path id="icon-right" d="M416.832 798.08C400.64 798.08 384.512 791.872 372.16 779.52L119.424 525.76C94.784 500.992 94.784 460.8 119.424 436.032 144.128 411.264 184.128 411.264 208.768 436.032L416.832 644.928 814.4 245.76C839.04 220.928 879.04 220.928 903.744 245.76 928.384 270.528 928.384 310.656 903.744 335.424L461.504 779.52C449.152 791.872 432.96 798.08 416.832 798.08Z" p-id="2551"></path></defs></svg>
<form action="#">
  <div class="wrapper">
    <div class="box">
      <input type="checkbox" checked />
      <span><svg viewBox="0 0 1024 1024" width="20"><use xlink:href="#icon-right" x="20" y="20"/</svg></span>
    </div>
    <lable for="usename">我是选中状态</lable>
  </div>
  <div class="wrapper">
    <div class="box">
      <input type="checkbox" />
      <span><svg viewBox="0 0 1024 1024" width="20"><use xlink:href="#icon-right" x="20" y="20"/</svg></span>
    </div>
    <label for="usepwd">我是未选中状态</label>
  </div>
</form> 
form {
  border: 1px solid #ccc;
  padding: 20px;
  width: 300px;
  margin: 30px auto;
}
.wrapper {
  margin-bottom: 10px;
}
.box {
  display: inline-block;
  width: 20px;
  height: 20px;
  margin-right: 10px;
  position: relative;
  border: 2px solid orange;
  vertical-align: middle;
}
.box input {
  opacity: 0;
  position: absolute;
  top:0;
  left:0;
}
.box span{
  fill: orange;
}
input[type="checkbox"] + span {
  opacity: 0;
}
input[type="checkbox"]:checked + span {
  opacity: 1;
}

查看在线效果


7.4 ::selection选择器

::selection 伪元素是用来匹配突出显示的文本(用鼠标选择文本时的文本)。浏览器默认情况下,用鼠标选择网页文本是以“深蓝的背景,白色的字体”显示的,效果如下:

有时候设计要求,不适用上图那种浏览器默认的突出文本效果,需要一个与众不同的效果,此时 ::selection 伪元素就非常实用。不过 fireFox浏览器还需要添加前缀。

举个栗子:
通过“::selection” 选择器,将 web 中选中的文本背景变成红色,文本变成白色。

<p>“::selection”伪元素是用来匹配突出显示的文本。浏览器默认情况下,选择网站文本是深蓝的背景,黑色的字体,</p>
::-moz-selection{
  background: red;
  color: white;
}
::selection {
  background: red;
  color: white;
}

注意:
1、 IE9+、Opera、Chrome以及Safari中支持 ::selection 选择器。
2、 FireFox支持替代的 ::-moz-selection


7.5 :read-only选择器

:read-only 伪类选择器用来指定处于只读状态元素的样式。简单点理解就是,元素中设置了 "readonly='readonly'"。

举个栗子:
通过 :read-only 选择器来设置地址文本框的样式。

<form action="#">
  <div>
    <label for="name">姓名:</label>
    <input type="text" name="name" id="name" placeholder="成都平原" />
  </div>
  <div>
    <label for="address">地址:</label>
    <input type="text" name="address" id="address" placeholder="四川盆地" readonly="readonly" />
  </div>
</form>  
form{
  width: 300px;
  padding: 10px;
  border: 1px solid #ddd;
  margin: 50px auto;
}
form div{
  margin-bottom: 10px;
}
input[type="text"]{
  border: 1px solid orange;
  padding: 5px;
  background: #fff;
  border-radius: 5px;
}
input[type="text"]:-moz-read-only{
  border-color: #ccc;
}
input[type="text"]:read-only{
  border-color: #ccc;
}


7.6 :read-write选择器

:read-write 选择器刚好与 :read-only 选择器相反,主要用来指定当元素处于非只读状态时的样式。

举个栗子:
通过 :read-write 选择器来设置不是只读囧间的文本框样式。

<form action="#">
  <div>
    <label for="name">姓名:</label>
    <input type="text" name="name" id="name" placeholder="成都平原" />
  </div>
  <div>
    <label for="address">地址:</label>
    <input type="text" name="address" id="address" placeholder="四川盆地" readonly="readonly" />
  </div>
</form>  
form{
  width: 300px;
padding: 10px;
border: 1px solid #ccc
margin: 50px auto;
}
form div{
  margin-bottom: 10px;
}
input[type="text"]{
  border: 1px solid orange;
  padding: 5px;
  background: #fff;
  border-radius: 5px;
}
input[type="text"]:-moz-read-only{
  border-color: #ccc;
}
input[type="text"]:read-only{
border-color: #ccc;
}
input[type="text"]:-moz-read-write{
  border-color: #f36;
}
input[type="text"]:read-write{
  border-color: #f36;
}


7.7 ::before 和 ::after

**::before 和 ::after ** 这两个主要用来给元素的前面或后面插入内容,这两个常和“content”配合使用,使用场景最多的就是清除浮动。

.clearfix::before,
.clearfix::after{
  content: ".";
  display: block;
  height: 0;
  visibility: hidden;
}
.clearfix:after{
  clear: both;
}
.clearfix{
  zoom: 1;
}

当然也可以利用他们制作出其他更好的效果。如图:



实现方法:

<body>
  <div class="box effect">
    <h1>Hello World!</h1>
  </div>
</body>
h1{
  color: white;
}
.box {
  width:70%;
  height: 40vh;
  background:url(http://f.hiphotos.baidu.com/image/pic/item/503d269759ee3d6db032f61b48166d224e4ade6e.jpg) no-repeat 100%;
  margin:40px auto;
  text-align:center;
  display:flex;
  justify-content: center;
  align-items: center;
  border: 1px solid #fff;
}
.effect{
  position:relative;       
    -webkit-box-shadow:0px 1px 4px rgba(0, 0, 0, 0.3), 0px 0px 40px rgba(0, 0, 0, 0.1) inset;
       -moz-box-shadow:0px 1px 4px rgba(0, 0, 0, 0.3), 0px 0px 40px rgba(0, 0, 0, 0.1) inset;
            box-shadow:0px 1px 4px rgba(0, 0, 0, 0.3), 0px 0px 40px rgba(0, 0, 0, 0.1) inset;
}
.effect::before, .effect::after{
    content:"";
    position:absolute; 
    z-index:-1;
    -webkit-box-shadow:0px 0px 20px rgba(0,0,0,0.8);
    -moz-box-shadow:0px 0px 20px rgba(0,0,0,0.8);
    box-shadow:0px 0px 20px rgba(0,0,0,0.8);
    top:50%;
    bottom:0;
    left:10px;
    right:10px;
    -moz-border-radius:100px / 10px;
    border-radius:100px / 10px;
}

上面代码作用在 class=effect 上的div 前(before) 后(after)都添加一个空元素,然后在这两个空元素添加阴影特效。
更多图片阴影效果,可以在 这里 学习。


7.8 综合实例:切换背景图像

完成的实际效果在 这里 查看



八、CSS3中的变形

8.1 旋转 rotate()

旋转 rotate() 函数通过指定的角度参数使元素相对原点进行旋转。它主要在二维空间内进行操作,设置一个角度用值,用来指定旋转的幅度。如果这个值为正值,元素相对原点中心顺时针旋转;如果这个值为负值,元素相对原点中心逆时针旋转。如图:

<div class="wrapper">
  <div></div>
</div>
.wrapper {
  width: 200px;
  height: 200px;
  border: 1px dotted red;
  margin: 100px auto;
}
.wrapper div {
  width: 200px;
  height:200px;
  background: orange;
  -webkit-transform: rotate(45deg);
  transform: rotate(45deg)
}


8.2 扭曲 skew()

扭曲 skew() 函数能够让元素倾斜显示。他可以将一个对象以中心位置围绕着 X轴 和 Y轴 按照一定的角度倾斜。这与 rotate() 函数的旋转不同,rotate() 函数只是旋转,而不会改变元素的形状。skew() 函数不会旋转,而只会改变元素的形状。

skew() 具有三种情况:

8.2.1 skew(x,y)

使元素在水平和垂直方向同时扭曲(X轴和Y轴同时按一定的角度值进行扭曲变形):

-webkit-transform: skew(10deg,30deg);
   -moz-transform: skew(10deg,30deg);
        transform: skew(10deg,30deg);

第一个参数对应 X轴,第二个参数对应 Y轴。如果第二个参数未提供,则值为0,也就是 Y轴方向无斜切。

8.2.2 skewX(x)

仅使元素在水平方向扭曲变形(X轴扭曲变形):

-webkit-transform: skewX(30deg);
   -moz-transform: skewX(30deg);
        transform: skewX(30deg);
8.2.3 skewY(y)

仅使元素在垂直方向扭曲变形(Y轴扭曲变形):

-webkit-transform: skewY(30deg);
   -moz-transform: skewY(30deg);
        transform: skewY(30deg);


8.3 缩放 scale()

缩放 scale() 函数让元素根据中心原点对对象进行缩放。

scale()也有三种情况:

8.3.1 scale(x,y)

使元素水平方向和垂直方向同时缩放(也就是X轴和Y轴同时缩放):

div {
  width: 200px;
  height: 200px;
  margin: 100px auto;
  background: orange;
}
div:hover {
  -webkit-transform: scale(1.5,0.5);
     -moz-transform: scale(1.5,0.5);
          transform: scale(1.5,0.5);
}

注意:Y是一个可选参数。如果没有设置Y值,则表示X,Y两个方形的缩放倍数(X轴缩放);

8.3.2 scaleX(x)

元素仅水平方向缩放(X轴缩放)

div:hover {
  -webkit-transform: scaleX(1.5);
     -moz-transform: scaleX(1.5);
          transform: scaleX(1.5);
}
8.3.3 scaleY(y)

元素仅垂直方向缩放(Y轴缩放)

div:hover {
  -webkit-transform: scaleY(1.5);
     -moz-transform: scaleY(1.5);
          transform: scaleY(1.5);
}

注意:
scale()的取值默认值的值为 1,当设置为 0.01 到 0.99 之间的任何值,作用使一个元素缩小;而任何大于或等于1的值,作用是让元素放大。


8.4 位移 translate()

translate()函数 可以将元素向指定的方形移动,类似于 position 中的 relative。或以简单的理解为,使用translate() 函数,可以把元素从原来的位置移动,而不影响在X、Y轴的任何 web 组件。

translate 我们分为三种情况:

8.4.1 translate(x,y)

水平方向和垂直方向同时移动(也就是X轴和Y轴同时移动)

.wrapper {
  width: 200px;
  height: 200px;
  border: 1px solid #999;
  margin: 50px auto;
}
.wrapper div{
  opacity: .7;
  width: 200px;
  height: 200px;
  background: orange;
  transform: translate(40px,40px);
}
8.4.2 translateX(x)

仅水平方向移动(X轴移动)

.wrapper div{
  transform: translateX(100px);
}
8.4.3 translateY(y)

仅垂直方向移动(Y轴移动)

.wrapper div{
  transform: translateY(40px);
}


8.5 矩阵 matrix()

matrix() 是一个含六个值得(a,b,c,d,e,f)变换矩阵,用来指定一个2D变换,相当于直接应用一个 [a,b,c,d,e,f] 变换矩阵。就是基于水平方向(X轴)和垂直方向(Y轴)重新定位元素,此属性值使用涉及到数学中的矩阵。

  • a为元素的水平伸缩量,1为原始大小;
  • b为纵向(Y轴)扭曲,0不变;
  • c为横向(X轴)扭曲,0不变;
  • d为垂直伸缩量,1为原始大小;
  • e为水平偏移量,0是初始位置;
  • f为垂直偏移量,0是初始位置。

例如要实现如下效果:


代码只需这样写:

.wrapper div{
  transform: matrix(2,.5,.5,2,0,0);
}


8.6 原点 transform-origin

任何一个元素都有一个中心点,默认情况下,其中心店是居于元素X轴和Y轴的50%处。
在没有重置 transform-origin改变元素原点位置的情况下,CSS变形进行的旋转、位移、缩放、扭曲等操作都是以元素自己中心位置进行变形。但很多时候,我们可以通过 transform-origin 来对元素进行原点位置改变,使元素原点不在元素的中心位置,以达到需要的原点位置。

transform-origin 取值和元素设置背景中的 background-position取值类似,如下表所示:

关键词 百分比
top = top center = center top 50% 0
right = right center = center right 100%或(100% 50%)
bottom=bottom center=center bottom 50% 100%
left = left center = center left 0 或(0 50%)
center = center center 50% 或(50% 50%)
top left = left top 0 0
right top = top right 100% 0
bottom right = right bottom 100% 100%
bottom left = left bottom 0 100%

举个栗子:
通过transform-origin 改变元素原点到左上角,然后进行顺时针旋转 45 度。

<div class="wrapper">
  <div><span class="text">原点在默认位置处</span></div>
</div>
<div class="wrapper transform-origin">
  <div><span>原点重置到右下角</span></div>
</div>
.wrapper{
  width: 200px;
  height: 200px;
  float: left;
  margin: 100px;
  border: 2px dotted #888;
  line-height: 200px;
  text-align: center;
}
.wrapper div{
  color: #fff;
  background: orange;
  transform: rotate(45deg);
}
.transform-origin div{
  transform-origin: right bottom;
}

效果如下:




九、 CSS3 中的动画

早期在Web中要实现动画效果,都是依赖于 JS或Flash来完成。但在CSS3 中新增加了一个新的模块 transition 他可以通过一些简单的CSS时间来触发元素的外观变化,让效果显得更加细腻。
简单点说,就是通过鼠标的单击、获得焦点,被点击或对元素任何改变中触发,并平滑地以动画效果改变CSS的属性值

在CSS中创建简单的过渡效果可以从以下几个步骤来实现:
第一,在默认样式中声明元素的初始状态样式;
第二,声明过渡元素最终状态样式,比如悬空状态;
第三,在默认样式中通过添加过渡函数,添加一些不同的样式。

CSS3的过渡 transition 属性是一个复合属性,主要包括以下几个子属性:

  • transition-property:指定过渡或动态模拟的CSS属性;
  • transition-duration:指定完成过渡所需的时间;
  • transition-timing-function:指定过渡函数;
  • transition-delay:指定开始出现的延迟时间。


9.1 过渡属性 transition-property

transition-property 用来指定过渡动画的CSS属性名称,而这个过渡属性只有具备一个中点值的属性(需要产生动画的属性)才能具备过渡效果,其对应具有过度的CSS属性主要有:

属性1 属性2 属性3 属性4
background-color background-position border-bottom-color border-bottom-width
border-left-color border-left-width border-right-color border-right-width
border-spacing border-top-color border-top-width bottom
clip color font-size font-weight
height left letter-spacing line-height
margin-bottom margin-left margin-right margin-top
max-height max-width min-height min-width
opacity outline-color outline-width padding-bottom
padding-left padding-right padding-top right
text-indent text-shadow vertical-align visibility
width word-spacing z-index -

举个栗子:
鼠标hover时背景色改为橙色

div{
  width: 200px;
  height: 200px;
  background-color: red;
  margin: 20px auto;
  -webkit-transition: background-color .5s ease .1s;
  transition: background-color .5s ease .1s;
}
div:hover{
  background-color: orange;
}

查看在线演示

注意:当“transition-property”属性设置为all时,表示的是所有 中点值 的属性。比如:
初始状态设置了样式 width、height、background,当终始状态都改变了这三个属性,那么all代表的就是 width、height、background三个属性。如果终始状态只改变了width、height,那么all代表的就是width、height。


9.2 过渡所需时间 transition-duration

transition-duration 属性主要用来设置一个属性过渡到另一个属性所需时间,也就是从旧属性过渡到新属性花费的时间长度,即持续时间

举个栗子:
鼠标hover时让正方形变成圆形,并让动画持续1s。

div{
  width:200px;
  height:200px;
  background-color: orange;
  margin:100px auto;
  -webkit-transition-property: -webkit-border-radius;
  transition-property: border-radius;
  transition-duration: 1s;
  -webkit-transition-timing-function: ease-out;
  transition-timing-function: ease-out;
  -webkit-transition-delay: .5s;
  transition-delay: .5s;
}
div:hover{
  border-radius: 100px;
}

查看在线演示


9.3 过渡函数 transition-timing-function

transition-timing-function 属性指的是过渡的“缓动函数”。主要用来指定浏览器的过渡速度,以及过渡期间的操作进展情况,其中主要包括以下几种函数:

函数 功能描述 图例
linear 规定以相同速度开始至结束的过渡效果 cubic-bezier(0,0,1,1)
ease 规定慢速开始,然后变快,然后慢速结束的过渡效果 cubic-bezier(0.25,0.1,0.25,1)
ease-in 规定以慢速开始的过渡效果 cubic-bezier(0.42,0,1,1)
ease-out 规定以慢速结束的过渡效果 cubic-bezier(0,0,0.58,1)
ease-in-out 规定以慢速开始和慢速结束的过渡效果 cubic-bezier(0.42,0,0.58,1)
cubic-bezier(n,n,n,n) 在 cubic-bezier 函数中定义自己的值 可能的值是 0 至 1 之间的数值

举个栗子:
在 hover 状态下,让容器从一个正方形慢慢过渡到一个圆形,而整个过渡是先加速在减速,也就是运用 ease-in-out 函数。

div {
  width: 200px;
  height:200px;
  background: red;
  margin: 20px auto;
  transition-property: border-radius;
  transition-duration: 2s;
  transition-timing-function: ease-in-out;
  transition-delay: .1s;
}
div:hover{
  border-radius: 100%;
}


9.4 过渡延迟时间 transition-delay

transition-delay 属性是用来设置过渡动画的持续时间,而 transition-delay 主要用来指定一个动画开始执行的时间,也就是说当改变元素属性值后多长时间开始执行。

有时我们想改变两个或者多个css 属性的 transition 效果时,只要把几个 transition 的声明串在一起,用 逗号(“,”)隔开,然后各自可以有各自不同的延续时间和其时间的速率变换方式。但需要注意的一点:第一个时间的值为 transition-duration ,第二个为transition-delay。

例如:

a{
  transition:background 0.8s ease-in 0.3,
             color 0.6s ease-out 0.3;
}

还是举个实例:
通过 transition 属性将一个 200px * 200px的橙色容器,在鼠标hover状态时,过渡到一个 300px * 300px 的红色容器。而且整个过渡0.1s 后触发,并且整个过渡持续 2s。

<div class="wrapper">
  <div>鼠标放到这里来</div>
</div>
.wrapper{
  width: 400px;
  height: 400px;
  margin: 20px auto;
  border: 2px dotted red;
}
.wrapper div {
  width: 200px;
  height: 200px;
  background-color: orange;
  transition: all 2s ease-in .1s;
}
.wrapper div:hover{
  width: 300px;
  height: 300px;
  background-color: red;
}


9.5 Keyframes 介绍

Keyframes 被称为关键帧,其类似于 Flash 中的关键帧。在CSS3中其主要以“@keyframes”开头,后面紧跟着是动画名称加上一对花括号“{...}”,括号中就是一些不同时间段样式规则。例如

@keyframes changecolor{
  0%{
    background: red;
  }
  100%{
    background: orange;
  }
}

在一个 keyframes 中的样式规则可以由多个百分比构成的,如在 ”0%“ 到 ”100%“ 之间创建更多个百分比,分别给每个百分比中给需要有动画效果的元素加上不同的样式,从而达到一种在不断变化的效果。

经验技巧: 在@keyframes中定义动画名称时,其中 ”0%“ 到 ”100%“ 还可以使用关键词 from和 to 来代表,其中0%对应的是from,100%对应的是to。

浏览器的支持情况:
Chrome和Safari需要前缀 -webkit;Firefox 需要前缀 -moz。

还是栗子:
通过 keyframes 声明一个名叫”wobble“ 的动画,从 ”0%“ 开始到 ”100%“ 结束,同时还经历了一个”40%“ 和 ”60%“ 两个过程。
”wobble“ 动画在”0%“时定位到left为100培训,背景色为red;
然后在 ”40%“ 时元素过渡到left为150px,背景色为yellow;
接着在”60%“ 时元素过渡到 left 为50px,背景色为orange;
最后”100%“ 时动画结束。元素又回到起点left 100px处,背景色变为red。

查看在线演示

<div>鼠标</div>
@keyframes animate {
  0%{
    margin-left: 100px;
    background: red;
  }
  40%{
    margin-left: 250px;
    background: yellow;
  }
  60%{
    margin-left: 50px;
    background: orange;
  }
  100%{
    margin-left: 100px;
    background: red;
  }
}
div{
  width:100px;
  height:100px;
  background: red;
  color:#fff;
  margin-left: 100px;
}
div:hover{
  animation: animate 2s ease-in-out .1s;
}


9.6 CSS3中调用动画

animate-name属性主要用来调用@ keyframes 定义好的动画。需要特别注意:animation-name调用的动画名需要和 ”keyframes“ 定义的动画名完全一致(区分大小写),如果不一致将不具有任何动画效果。

语法:animation-name: none | IDENT[,noneIdent]*

    1. IDENT是由 @keyframes 创建的动画名;
    1. none为默认值当值为none时,将没有任何动画效果,这可以用于覆盖任何动画。

注意:需要在 Chrome 和 Safari 上面的基础上加上 -webkit 前缀,Firefox加上 -moz。

举栗:
让圆围着矩形重复移动。查看在线演示

@keyframes around{
  0%{
    transform: translate(0,0);
  }
  25%{
    transform: translate(180px,0);
  }
  50%{
    transform: translate(180px,180px);
  }
  75%{
    transform: translate(0,180px);
  }
  100%{
    transform: translate(0,0)
  }
}
div{
  width: 200px;
  height: 200px;
  border: 1px solid red;
  margin: 20px auto;
}
div span{
  display: inline-block;
  width: 20px;
  height: 20px;
  border-radius: 100%;
  background: orange;
  animation: around;
  animation-duration: 10s;
  animation-timing-function: ease;
  animation-delay: 1s;
  animation-iteration-count: infinite;
  /* animation: around 10s ease 1s infinite; */
}


9.7 设置动画播放时间 animation-duration

animation-duration 主要用来设置CSS3动画播放时间,其使用方法和transition-duration类似,是用来指定元素播放动画所持续的时间长,也就是完成从 0% 到 100% 一次所需的动画时间。单位:s。

语法:animation-duration: <time>[,<time>]*

取值<time> 为数值,单位为秒,其默认值是”0“,这意味着动画周期为”0“,也就是没有动画效果(如果值为负会被视为”0“)。


9.8 设置动画播放方式 animation-timing-function

animation-timing-function属性主要用来设置动画播放方式。主要让元素根据时间的推进改变属性值的变换速率,简单点说就是动画的播放方式。语法如下:

animation-timing-function:ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(<number>, <number>, <number>, <number>) [, ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(<number>, <number>, <number>, <number>)]*

他和transition-timing-function一样,具有以下几种变换方式:

函数 功能描述 图例
linear 规定以相同速度开始至结束的过渡效果 cubic-bezier(0,0,1,1)
ease 规定慢速开始,然后变快,然后慢速结束的过渡效果 cubic-bezier(0.25,0.1,0.25,1)
ease-in 规定以慢速开始的过渡效果 cubic-bezier(0.42,0,1,1)
ease-out 规定以慢速结束的过渡效果 cubic-bezier(0,0,0.58,1)
ease-in-out 规定以慢速开始和慢速结束的过渡效果 cubic-bezier(0.42,0,0.58,1)
cubic-bezier(n,n,n,n) 在 cubic-bezier 函数中定义自己的值 可能的值是 0 至 1 之间的数值


9.9 设置动画开始播放时间 animation-delay

animation-delay属性用来定义动画开始播放的时间,用来触发动画播放的时间点。和 transition-delay 属性一样,用于定义在浏览器开始执行动画之前等待的时间。

语法规则:animation-delay: <time>[,<time>]*


9.10 设置动画开始播放次数 animation-iteration-count

animation-iteration-count 属性主要用来定义动画的播放次数。

语法规则:animation-iteration-count: infinite | <number>[,infinite | <number>]*

1、其值通常为整数,但也可以使用带有小数的数字,其默认值为1,这意味着动画将从开始到结束只播放一次。

2、如果取值为infinite,动画将会无限次的播放。

举例:

通过animation-iteration-count属性让动画move只播放5次,代码设置为:

animation-iteration-count: 5;

注意:Chrome或Safari浏览器,需要加入-webkit-前缀!


9.11 设置动画播放方向 animation-direction

animation-direction 属性主要用来设置动画播放方向。

语法:animation-direction: normal | alternate [,normal | alternate]*
主要有两个值: normal 、alternate

  • normal 默认值,如果设置为normal,动画的每次循环都是向前播放;
  • alternate 他的作用是,动画在播放 第偶数次向前播放,第奇数次反方向播放。

注意:Chrome或Safari浏览器,需要加入 -webkit- 前缀!

查看这个实例


9.12 设置动画播放状态 animation-play-state

animation-play-state 属性主要用来控制元素动画的播放状态。

参数:主要有两个值 running | paused。

  • running 默认值,作用是让动画播放,也可以通过running 将暂停的动画重新启动。播放不一定从元素懂得开始播放,而是从暂停的位置开始播放。
  • paused 将正在播放的动画停下来,暂停了动画播放,元素的样式将回到最原始的设置状态。

例如,让停止的动画在hover 时播放,不hover状态停止。

div:hover span {
  animation-play-state: running;
}


9.13 设置动画时间外属性 animation-fill-mode

属性定义在动画开始之前和动画结束之后发生的操作。主要具有四个属性:none、forwards、backwords和both。其属性值对应效果如下:

属性值 效果
none 默认值,表示动画将预期进行和结束,在动画完成其最后一帧时,动画会反转到初始帧处。
forwards 表示动画在结束后继续应用最后的关键帧的位置
backwards 会在向元素应用动画样式时迅速应用动画的初始帧
both 元素动画同时具有forards 和 backwards 效果

在默认情况下,动画不会影响他的关键帧之外的属性。使用 animation-fill-mode 属性可以修改动画的默认行为。
简单的说就是告诉动画在第一关键爱你镇上等待动画开始,或者在动画结束时停在最后一个关键帧上而不回到动画的第一帧上。或者同时具备这两个效果。

例如:让动画停在最后一帧处:

animation-fill-mode: forwards;

查看在线实例


9.14 综合实例:制作3D旋转

根据学过的transition 属性和 transform 等内容,实现如下 3D旋转动画下拉导航。

查看在线效果



十、 布局样式

10.1 多列布局 columns

为了能在WEB中实现类似报纸,杂志那种多列排版的布局,W3C特意增添了一个多列布局模块(CSS Multi Column Layout Module)。它主要应用在文本的多列布局方面。

语法:columns: <column-width> || <column-count>

多列布局 columns 属性参数主要就两个属性参数:列宽列数

参数 说明
column-width 主要用来定义多列中每列的宽度
column-count 主要用来定义多列中的列数

举个栗子:
要显示2栏,每栏宽度100培训,代码:

columns: 200px 2;

大部分浏览器都支持,但需要添加私有前缀。


10.2 多列布局 column-width

column-width的使用和CSS中的width属性一样,不过不同的是,column-width属性在定义元素的列宽的时候,既可以单独使用,也可以和多列属性中的其他属性配合使用。

语法: column-width: auto | <length>

属性值 说明
auto 值为auto或者没有显式的设置值时,元素多列的列宽将由其他属性来决定。如column-count
length 使用固定值来设置元素列的宽度,其主要是由数值和长度单位组成,不过其值只能是正值,不能为负值。


10.3 多列布局 column-count

此属性主要用来给元素指定想要的列数和允许的最大列数。

语法:column-count: auto| <integer>

取值说明:

属性值 说明
auto 此值为column-count的默认值,表示元素只有一列,其主要依靠浏览器计算自动设置
integer 此值为正整数值,主要用来定义元素的列数,取值为大于0的整数,负值无效

举个栗子:
将列分成四列显示,代码如下:

column-count: 4;


10.4 列间距 column-gap

此属性主要用来设置列与列之间的间距。

语法:column-gap: normal || <length>

取值说明

属性值 说明
normal 默认值,默值为1em(如果你的字号是px,其默认值为你的font-size值)
length 此值用来设置列与列之间的距离,其可以使用px,em单位的任何整数值,但不能是负值

举个栗子:
将内容分为三列显示,列与列之间的间距为2em。

column-count: 3;
column-gap: 2em;


10.5 列表边框 column-rule

此属性用来定义列与列之间的边框宽度、边框样式和边框颜色。简单点,就有类似于常用的border属性。 但是column-rule 是不占用任何空间位置的,在列与列之间改变其宽度不会改变任何列的位置。

语法:column-rule: <column-rule-width> | <column-rule-style> | <column-rule-color>

取值说明:

属性值 说明
column-rule-width 用来定义列边框的宽度,其默认值为“medium”,column-rule-width属性接受任意浮点数,但不接受负值。但也像border-width属性一样,可以使用关键词:medium,thick和thin
column-rule-style 用来定义列边框样式,其默认值为none。column-rule-style属性值与border-style值相同,包括none、hidden、dotted、dashed、solid、double、groove、ridge、outset
column-rule-color 类似于border-color属性,主要用来定义列边框颜色,是默认值为前景色color的值,使用时相当于border-color。接受所有颜色,如果不希望显示颜色可以设置为 transparent(透明色)

例如:为了能有效区分栏目之间的关系,可以为其设置一个列边框,代码为:

column-rule: 2px dotted green;


10.6 跨列设置 column-span

此属性树妖用来定义一个分列元素的子元素能跨列多少。column-width、column-count等属性能让一个元素分成多列,不管里面元素如何排放顺序,他们都是从左向右的放置内容,但有时我们需要其中一段内容或一个标题不进行分列,也就是横跨所有列,此时column-span就可以轻松实现。

语法:column-span: none | all;

取值说明:

属性值 说明
none 默认值,表示不跨越人接列
all 跟none相反,表示元素跨越所有列,并定位在列的Z轴之上

例如:要把第一个标题跨越所有列

column-span: all;


10.7 盒模型

CSS中有一种基础设计模式叫做盒模型,盒模型定义了WEB页面中的元素如何来解析。CSS中每一个元素都是一个盒模型,包括html和body标签元素。
在盒模型中主要包括 width、height、border、background、padding和margin这些属性,而且他们之间的层次关系可以相互影响。

从上图中可以看出padding属性和content属性层叠background-image属性,层叠background-color属性,他们四者之间构成了Z轴(垂直屏幕的坐标)多重层叠关系。
但是border属性与margin属性、padding属性三者之间应该是平面上的并级关系,并不能构成Z轴的层叠关系。

box-sizing:
在CSS中盒模型被分为两种,第一种是W3C的标准模型,另一种是IE的传统模型,他们相同之处都是对元素计算尺寸的模型,具体说不是对元素的 width、height、padding、和border以及元素实际尺寸的计算关系,他们不同之处是两者的计算方法不一致,原则上来说盒模型是分得很细的,这里所看到的主要是外盒模型和内盒模型,如下面的计算公式:

W3C标准盒模型:
外盒尺寸计算(元素空间尺寸):
element空间高度 = 内容高度 + 内距 + 边框 + 外距
element空间宽度 = 内容宽度 + 内距 + 边框 + 外距
内盒尺寸计算(元素大小):
element高度 = 内容高度+ 内距 + 边框(height为内容高度)
element宽度 + 内容宽度 + 内距 + 边框 (width为内容宽度)

IE 传统下盒模型(IE6以下,不包含IE6版本或“QuirksMode下IE5.5+“)
外盒尺寸计算(元素空间尺寸)
element空间高度 = 内容高度 + 外距(height包含了元素内容高度、边框、内距)
element空间宽度 = 内容宽度 + 外距(width包含了元素内容宽度、边框、内距)
内盒尺寸计算(元素大小)
element高度=内容高度(height包含了元素内容高度、边框、内距)
element宽度=内容宽度(width包含了元素内容宽度、边框、内距)

在elemnet新增加了box-sizing属性,能够实现定义盒模型的尺寸解析方式。

**语法:box-sizing: content-box | border-box | inherit

取值说明:

属性值 说明
content-box 默认值,让元素维持W3C的标准盒模型,内容+内边距+边框=元素大小
border-box 按传统IE盒子模型计算,元素大小=内容+内边距+边框
inherit 使元素继承父元素的盒模型模式

content-box 和 border-box 两者区别,他们之前的区别可以通过下图来展示:


两句话解释什么是box-sizing

  1. CSS2中,元素(例如div)的内边距(padding)和边框(border)会把元素自身撑大。想要个100*100px的div,都要事先计算,例如,内容80px + 内边距15px + 边框5px = 100px

  2. CSS3中,新增 box-sizing 属性,如果设置元素为 box-sizing: border-box,那么元素的内边距(padding)和边框(border)不会再把元素自身撑大。例如,设置div为100 * 100px,那么无论div里内容、内边距、边框的宽高怎么变化,div的大小永远都是100 * 100px


10.8 伸缩布局-flex

请参考之前的文章: flex布局



十一、 Media Queries 与Responsive 设计

本节重点:如何使用CSS3中的Media Queries模块让一个页面适应不同的终端(或屏幕尺寸),从而让页面具备良好的用户体验。
Media Queries是CSS3新增加的一个模块功能,其最大的特色就是通过CSS3 来查询媒体,然后调用对应的样式。需要了解其中两个重要部分,第一个媒体类型,第二个是媒体特征。

11.1 媒体类型 Media Type

CSS2常用的是all、screen、print,但是W3C总共列出了10种媒体类型。如下表所示:

设备类型
All 所有设备
Brallle 盲人用点字法触觉回馈设备
Embossed 盲文打印机
Handheld 便携设备
Print 打印用纸或打印预览视图
Projection 各种投影设备
Screen 电脑显示器
Speech 语音或音频合成器
Tv 电视机类型设备
Tty 使用固定密度字母栅格的媒介,比如电传打字机和终端

在实际中媒体类型有近十种之多,实际之中常用的也就那么几种,不过媒体类型的引用方法也有很多种,常见的有: link标签、@import和CSS3新增的@media几种:

  • link方法
    link方法引入媒体类型其实就是在 <link> 标签引用样式的时候,通过 link 标签中的media 属性来指定不同的媒体类型。如下:
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
<link rel="stylesheet" type="text/css" href="print.css" media="print" />
  • @import方法
    可以引用样式文件,同样也可以用来引用媒体类型。@import引入媒体类型主要有两种方式:

    (1) 在样式中通过 @import 调用另一个样式文件:

@importurl(rest.css) scrren;
@importurl(print.css) print;

     (2) 在head标签中的style中引入,但这种使用方式在IE6~7都不被支持,如样式文件中调用另一个样式文件时,就可以指定对应的媒体类型。

<head>
<style type="text/css">
    @importurl(style.css) all;
</style>
</head>
  • @media方法
    @media是CSS3中新引进的一个特性,被陈伟媒体查询。在页面中也可以通过这个属性来引入媒体类型。@media引入媒体类型和 @import有点类似也具有两种方式:
    (1)在样式表中引用媒体类型:
@media screen{
  .class:{
    background: red;
    color: #fff;
  }
}

(2)使用@media 引入媒体类型的方法是在 head 标签中 style 中引用:

<head>
<style type="text/css">
   @media screen{
    .class:{
      background: red;
      color: #fff;
    }
  }
</style>
</head>


11.2 媒体特征

Media Queries能在不同的条件下使用不同的样式,是页面在不同的终端设备下达到不同的渲染效果。前面最简单的加少了media Queries如何引用到项目中,但是Media Queries有其自己的使用规则。

语法:@media 媒体类型 and (媒体特性) {style}

注意:使用Media Queries必须要使用”@media“开头,然后指定媒体类型(也可以称为设备类型),随后是指媒体特征(也可以称之为设备特性)。媒体特性的数法方式和样式的书写方式非常相似,例如:

max-width: 400px;

从前面表中可以得知,主要有十种媒体类型和13种媒体特征,将其组合就类似于不同的CSS集合。但与CSS属性不同的是,媒体特性是通过min/max来表示大于等于或小于作为逻辑判断,而不是使用小于和大于这样的符号来判断。


11.2.1 最大宽度 max-width

“max-width”是指媒体特性中最常用的一个特性,其意思是指媒体类型小于或等于指定的宽度时,样式生效。如:

@media screen and (max-width: 480px){
  .ads{
    display: none;
  }
}


11.2.2 最小宽度 min-width

“min-width” 与 “max-width” 相反,指的是媒体类型大于或等于指定宽度时,样式生效。

@media screen and (min-width: 900px){
  .wrapper{width: 980px;}
}


11.2.3 多个媒体特性使用 and

Media Queries可以使用关键词 “and” 将多个媒体特性结合在一起。也就是说,一个Media Queries中可以包含0到多个表达式,表达式又可以包含0到多个关键字,以及一种媒体类型。

比如,当屏幕在600px-900px之间时,body的背景色渲染为“#f5f5f5”,如下所示。

@media screen and (min-width: 600px) and (max-width: 900px){
  body {
    background-color: #f5f5f5;
  }
}


11.2.4 设备屏幕的输出宽度 Device Width

在智能设备上,例如iPhone、iPad等,还可以根据屏幕设备的尺寸来设置相应的样式(或者调用相应的样式文件)。同样的,对于屏幕设备同样可以使用“min/max” 对应参数,如“min-device-width”或者 “max-device-width”。

<link rel="stylesheet" media="screen and (max-device-width:480px)" href="iphone.css" />

上面的代码指的是“iphone.css”样式适用于最大设备宽度为480px,比如说iPhone上的显示,这里的“max-device-width”所指的是设备的实际分辨率,也就是指可视面积分辨率。


11.2.5 not关键词

使用关键词 “not” 来排除某种指定的媒体类型,也就是用来排除复合表达式的设备。换句话说,not关键词白哦是对后面的表达式执行取反操作,如:

@media not print and (max-width: 1200px){style}

上面代码表示的是:样式代码将被使用在除打印设备和设备宽度小于1200px下所有设备中。


11.2.5 only关键词

only用来指定某种特定的媒体类型,可以用来排除不支持媒体查询的浏览器。其实only很多时候是用来对那些不支持Media Query但却支持Media Type的设备隐藏样式表的。
其主要有:支持媒体特性的设备,正常调用样式,此时就当only不存在;表示不支持媒体特性但又支持媒体类型的设备,这样就会不读样式,因为其先会读取only而不是screen;另外不支持Media Queries的浏览器,不论是否支持only,样式都不会被采用。

<linkrel="stylesheet" media="only screen and (max-device-width:240px)" href="android240.css" />

在Media Query中如果没有明确指定Media Type,那么其默认为all,如:

<linkrel="stylesheet" media="(min-width:701px) and (max-width:900px)" href="mediu.css" />

另外在样式中,还可以 使用多条语句来将同一个样式应用于不同的媒体类型和媒体特性中,指定方式如下所示。

<linkrel="stylesheet" type="text/css" href="style.css" media="handheld and (max-width:480px), screen and (min-width:960px)" />

上面代码中style.css样式被用在宽度小于或等于480px的手持设备上,或者被用于屏幕宽度大于或等于960px的设备上。

到目前为止,CSS3 Media Queries得到了众多浏览器支持,除了IE6-8浏览器不支持之外,在所有现代浏览器中都可以完美支持。还有一个与众不同的时,Media Queries在其他浏览器中不要像其他CSS3属性一样在不同的浏览器中添加前缀。


11.3 Responsive 设计

响应式设计要考虑元素布局的秩序,而且还需要做到“有求必应”,那就需要满足以下三个条件:网站必须建立灵活的网格基础;引用到网站的图片必须是可伸缩的;不同的显示风格,需要在Media Queries上写不同的样式。

(1)流体网格
流体网格是一个简单的网格系统,这种网格设计参考了流体设计中的网格系统,将每个网格各自使用百分比来控制网格大小。这种网格系统最大的好处是让你的网格大小随时根据屏幕尺寸大小做出相应的比例缩放。

(2)弹性图片
弹性图片指的是不给图片设置固定尺寸,而是根据流体网格进行缩放,用于适应各种网格的尺寸。而实现方法比较简单:

img {max-width: 100%;}

但是这种方法在IE8 中图片会失踪,解决方法可以参考一下下面的方法。使用background-image给元素使用背景图片,显示/隐藏父元素,给父元素使用不同的图片,然后通过MediaQueries来控制这些图片显示或隐藏。
举个栗子:

<img src="image.jpg" data-src-600px="image-600px.jpg" data-src-800px="image-800px.jpg" />
@media (min-device-width:600px){
img[data-src-600px]{
  content: attr(data-src-600px,url);
  }
}
@media (min-device-width:800px){
  img[data-src-800px] {
  content:attr(data-src-800px,url);
  }
}

(3)媒体查询
媒体查询在CSS3中得到了强大的扩展。使用这个属性可以让你的设计根据用户终端设备适配对应的样式。这也是响应式设计中最为关键的。可以说Responsive设计离开了Medial Queries就失去了他生存的意义。简单的说媒体查询可以根据设备的尺寸,查询出适配的样式。Responsive设计最关注的就是:根据用户的使用设备的当前宽度,Web页面将加载一个备用的样式,实现特定的页面风格。

(4)屏幕分辨率
Responsive设计利用Media Queries属性针对浏览器使用的分辨率来适配对应的CSS样式。因此屏幕分辨率在Responsive设计中是一个很重要的东西,因为只有知道Web页面要在哪种分辨率下显示何种效果,才能调用对应的样式。

(5)主要断点
设备宽度的临界点。在Media Queries中,其中媒体特性“min-width”和“max-width”对应的属性值就是响应式设计中的断点值。简单点说,就是使用主要断点和次要断点,创建媒体查询的条件。而每个断点会对应调用一个样式文件(或者样式代码),如下图所示:

上图的style.css样式文件运用在Web页面中,但这个样式文件包括了所有风格的样式代码,也就是说所有设备下显示的风格都通过这个样式文件下载下来。当然,在实际中还可以使用另一种方法,也就是在不同的断点加载不同的样式文件,如下图所示:

上图主要显示的是主要断点,主要断点加载的不同样式文件直接将影响Web的效果。除了主要断点之外,为了满足更多效果时,还可以在这个基础上添次要断点。不过主要断点和次要断点增加之后,需要维护的样式也相应的增加,成本也相对应的增加。因此在实际使用中,需要根据自身产品需求,决定断点。

综合下来,设置断点应把握三个要点:满足主要的断点;有可能的话添加一些别的断点;设置高于1024的桌面断点。


11.4 Responsive 布局技巧

  • 在Responsive中少用或不用:
    第一, 尽量少用无关紧要的div;
    第二,不要使用内联元素(inline);
    第三,尽量少用JS或flash;
    第四,丢弃没用的绝对定位和浮动样式;
    第五,摒弃任何冗余结构和不使用100%设置。

  • 在Responsive多用:
    第一,使用HTML5 Doctype和相关指南;
    第二,重置好你的样式(reset.css);
    第三,一个简单的有语义的核心布局;
    第四,给重要的网页元素使用简单的技巧,比如导航菜单之类元素。

使用这些技巧,无非是为了保持你的HTML简单干净,而且在你的页面布局中的关键部分(元素)不要过分的依赖现代技巧来实现,比如说CSS3特效或者JS脚本。

说了这么多,怎么样的布局或者说HTML结构才是简单干净的呢?这里教大家一个快速测试的方法。你首先禁掉你页面中所有的样式(以及与样式相关的信息),在浏览器中打开,如果你的内容排列有序,方便阅读,那么你的这个结构不会差到哪里去。


11.5 Responsive设计之 meta标签

在响应式设计中如果没有这个meta标签,你就是蹩脚的,响应式设计就是空谈。meta标签被称为可视区域meta标签,使用方法如下:

语法: <meta name="viewport" content="" />

其中content 的属性值主要有一下几个,用来处理可视区域:

content属性值 详细描述
width 可视区域的宽度,值可以是一个具体数字或关键词device-width
height 可视区域的高度,值可以是一个具体数字或关键词device-height
initial-scale 页面首次被显示时,可视区域的缩放级别,取值为1.0时将使页面按实际尺寸显示,无任何缩放
minimun-scale 可视区域最小缩放级别,表示用户可以将页面缩小的程度,取值为1.0时将禁止用户缩小至实际尺寸以下
maximun-scale 可视区域最大缩放级别,表示用户可以将页面放大的程度,取值为1.0时将禁止用户放大至实际尺寸以上
user-scalable 指定用户是否可以对页面进行缩放,设置为yes将允许缩放,no为禁止缩放

在实际项目中,为了让Responsive设计在智能设备中能显示正常,也就是浏览WEB页面适应屏幕的大小,显示在屏幕上,可以通过这个可视区域的meta标签进行重置,告诉他使用设备的宽度为视图的宽度,也就是说禁止其默认的自适应页面的效果,具体设置如下:

<meta name="viewport" content="width=device-width,initial-scale=1.0"/>

另外一点,由于Responsive设计是结合CSS3的Media Queries属性,才能尽显Responsive设计风格,但大家都清楚,在IE6-8中完全是不支持CSS3 Media。

下面我们一起来看看CSS3 Meida Queries在标准设备上的运用,大家可以把这些样式加到你的样式文件中,或者单独创建一个名为“responsive.css”文件,并在相应的条件中写上你的样式,让他适合你的设计需求。

media-queries.js(http://code.google.com/p/css3-mediaqueries-js/)      
 respond.js(https://github.com/scottjehl/Respond)
 <!—[if lt IE9]>
      <scriptsrc=http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js></script>
 ​<![endif]>


11.6 Responsive设计之 - 不同设备的分辨率设置

大家可以把这些样式加到你的样式文件中,或者单独创建一个名为“responsive.css”文件,并在相应的条件中写上你的样式,让他适合你的设计需求:
(1)1024px显屏

@media screen and (max-width : 1024px) {                    
    /* 样式写在这里 */          
}    

(2)800px显屏

@media screen and (max-width : 800px) {                    
    /* 样式写在这里 */          
}    

(3)640px显屏

@media screen and (max-width : 640px) {                    
    /* 样式写在这里 */          
}    

(4)iPad横版显屏

@media screen and (max-device-width: 1024px) and (orientation: landscape) {              
  /* 样式写在这 */            
}     

(5)iPad竖版显屏

@media screen and (max-device-width: 768px) and (orientation: portrait) {         
  /* 样式写在这 */            
}     

(6)iPhone和Smartphones

@media screen and (min-device-width: 320px) and (min-device-width: 480px) {              
  /* 样式写在这 */            
}       



十二、 用户界面与其他重要属性

12.1 自由缩放属性 resize

resize 允许用过通过拖动的方式来修改元素的尺寸从而改变元素的大小。到目前为止,可以使用 overflow 属性的任何容器元素。
resize 属性主要是用来改变元素尺寸大小的,其主要目的是增强用户体验,但使用方法非常简单:

语法: resize: none | both | horizontal | vertical | inherit

取值说明:

属性值 取值说明
none 用户不能拖动元素修改尺寸大小
both 用户可以拖动元素,同时修改元素的宽度和高度
horizontal 用户可以拖动元素,仅可以修改元素的宽度,但不能修改元素的高度
vertical 用户可以拖动元素,仅可以修改元素的高度,但不能修改元素的宽度
inherit 继承父元素的 resize 属性

例如:通过resize 属性,让文本域可以沿水平方向拖大。

textarea {
  -webkit-resize: horizontal;
  -moz-resize: horizontal;
  -o-resize: horizontal;
  -ms-resize: horizontal;
  resize: horizontal;
}


12.2 CSS3外轮廓属性 Outline

外轮廓Outline在页面中呈现的效果和边框 border 呈现的效果极其相似,但是和border完全不同,外轮廓线不占用网页布局空间,不一定是矩形,外轮廓是属于一种动态样式,只有元素获取到焦点或者被激活时呈现。

outline属性早在CSS2中就出现了,主要是用来在元素周围绘制一条轮廓线,可以起到突出元素的作用。但是并未得到各主流浏览器的广泛支持,在CSS3中对outline作了一定的扩展,在以前的基础上增加新特性。

语法: outline: [outline-color] | [outline-style] | [outline-width] | [outline-offset] | inherit

outline-color] | [outline-style] | [outline-width] 三个属性同border-color、border-style、border-width。
属性取值如下:

属性值 属性值说明
outline-color 默认值是黑色。定义轮廓的颜色,属性值为CSS中定义的颜色值,在实际应用中,可以将此参数省略
outline-style 默认值none。定语轮廓线的样式,属性为CSS中定义的样式,省略后不会对轮廓线进行绘制
outline-width 默认值medium,表示绘制中等宽度的轮廓线。属性可以是一个宽度值
outline-offset 定义轮廓边框的偏移位置的数值,此值可以取负数值。当此参数的值为正数值,表示轮廓边框向外偏离多少个像素;当此参数的值为负数值,表示轮廓边框向内偏移多少个像素
inherit 元素继承父元素的outline效果

举个栗子:
制作一个双色边的盒子

div {
  padding: 20px;
  margin: 30px;
  outline: red solid 2px;
  border: 2px solid green;
}


12.3 CSS3生成内容

在Web中插入内容,在CSS2.1时代依靠的是JavaScript来实现。但进入CSS3进代之后我们可以通过CSS3的伪类“:before”,“:after”和CSS3的伪元素“::before”、“::after”来实现,其关键是依靠CSS3中的“content”属性来实现。不过这个属性对于img和input元素不起作用。

content配合CSS的伪类或者伪元素,一般可以做以下四件事情:

功能 说明
none 不生成任何内容
attr 插入标签属性值
url 使用指定的绝对或相对插入一个外部资源(图像,声频,视频或者浏览器支持的其他任何资源)
string 插入字符串

实例展示:
在CSS中有一种 清除浮动的方法叫“clearfix”。而这个“clearfix”方法就使用了“content”,只不过只是在这里插入了一个空格。如下所示:

.clearfix:before,
.clearfix:after {
   content:””;
   display:table;
}
.clearfix:after 
   clear:both;
   overflow:hidden;
}

插入元素的实例:

<a href="#" title="我是一个title属性值">我是元素</a>

可以通过 “:after” 和 “:content:attr(title)” 将元素的 “title”值插入到元素内容“我是元素”之后:

a:after {
  content:attr(title);
  color:#f00;
}


12.4 综合实例:制作3D旋转视屏展示区

查看在线演示

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 1、属性选择器:id选择器 # 通过id 来选择类名选择器 . 通过类名来选择属性选择器 ...
    Yuann阅读 1,521评论 0 7
  • 话题背景:如今网页展示的姿势是这样的 图片来自:设计之家 炫酷的网页展示,支撑它的正是强大的CSS3,还有什么理由...
    aliensq阅读 1,967评论 0 2
  • 转载请声明 原文链接 关注公众号获取更多资讯 这篇文章主要总结H5的一些新增的功能以及一些基础归纳,这里只是一个提...
    程序员poetry阅读 9,015评论 22 225
  • CSS3 是最新的 CSS 标准,并且完全向后兼容,不过目前W3C 仍然在对 CSS3 规范进行开发,虽然标准的规...
    颭夏阅读 3,843评论 4 42
  • CSS3简介 CSS3的现状 浏览器支持程度差,需要添加 私有前缀 ; 移动端支持优于PC端; 不断改进中; 应用...
    magic_pill阅读 732评论 0 1