CSS3新特征

学习笔记源自:绿叶

新增速览

新增选择器

新增属性

兼容性

查询浏览器兼容性

处理浏览器兼容:根据内核加上前缀
对于低版本的IE6~IE8,可以借助behavior属性来引入ie-css3.htc这个扩展文件来实现

检测内核

如我的iPad的Safari

新增选择器

属性选择器

CSS3新增的3个属性选择器使得选择器具有通配符的功能,正则表达式

如匹配doc文件 a[href$="doc"]

子元素伪类选择器

第一类

注意是父元素!

在实际开发中,子元素伪类选择器特别适合操作列表的不同样式,避免id和class泛滥,让结构与样式分离

第二类
:first-of-type、:last-of-type、:nth-of-type(n)、:only-of-type
按类型选择

:first-child在选择父元素下的子元素时,不仅要区分元素类型,还要求是第一个子元素。而:first-of-type在选择父元素下的子元素时,只需要区分元素类型,不要求是第一个子元素。

UI伪类选择器

UI,全称“User Interface”,也就是用户界面。

元素的状态包括:可用、不可用、选中、未选中、获取焦点、失去焦点等。UI伪类选择器的共同特点是:对于指定的样式,在默认状态下不起作用,只有当元素处于某种状态时才起作用。此外,大多数UI伪类选择器都是针对表单元素的。

:focus

具有该属性的元素:

  • 表单元素(按钮、单选框、复选框、文本框、下拉列表)
  • 超链接
::selection

定义页面中被选中文本的样式。

单冒号往往都是伪类,而双冒号往往都是伪元素。为整个页面的选中文本定义样式,我们只需要使用::selection{}就可以实现。其中,::selection前面是不需要加任何元素的。

:checked

定义单选框或复选框被选中时的样式。

:enabled和:disabled

定义表单元素如文本框、单选框、复选框等,“可用”和“不可用”这两种状态时的样式

:read-write和:read-only

可以使用:read-write选择器来定义表单元素“可读写”时的样式,也可以使用:read-only选择器来定义表单元素“只读”时的样式。

其他伪类选择器

使用:root选择器来选择HTML页面的根元素,也就是。可以用来定义整个页面的背景

使用:empty选择器来选择一个“不包含任何子元素和内容”的元素,也就是选择一个空元素。像HTML5的2048小游戏就可以用到:empty选择器

使用:target选择器来选取页面中的某一个target元素。所谓的target元素,指的是id被当成页面的锚点链接来使用的元素。

使用:not()选择器来选取某一个元素之外的所有元素。
例如对于“ul li:not(.first)”这个选择器,表示选择ul元素下除了第一个li元素之外的所有li元素。这个选择器非常重要,在实际开发中用得非常多

文本样式

text-shadow

text-shadow:x-offset y-offset blur color;

  • x-offset是“水平阴影”,值为正,则阴影向右偏移;如果值为负,则阴影向左偏移。
  • y-offset是“垂直阴影”,值为正,则阴影向下偏移;如果值为负,则阴影向上偏移。
  • blur是“模糊距离”,表示阴影的模糊程度。blur不能为负值。
    可以为文本定义多个阴影,阴影效果会按从左到右的顺序应用到文本上,因此可能会出现相互覆盖的效果。常用于定义四个方向不同的效果

text-stroke

text-stroke是一个复合属性,它是由text-stroke-width和text-stroke-color两个子属性组成的。

使用text-stroke配合color:transparent;,可以实现镂空文字。

text-overflow

text-overflow属性取值

要想实现文本溢出时就显示省略号效果,我们还需要结合white-space和overflow这两个属性来实现,overflow:hidden;white-space:nowrap;text-overflow:ellipsis;这三个是固定搭配的

想要实现这种多行文字的省略号效果,单纯使用CSS是无法实现的,必须借助JavaScript或jQuery才行。
这里推荐一个jQuery插件:jquery.dotdotdot.js

word-wrap、word-break

一般情况下,我们只会用到word-wrap:break-word;或word-break:break-all;这两个来实现强制换行

前者按单词换行,后者会把单词截断。这两个属性都是针对英文页面来说的

@font-face

把服务器中的字体文件下载到本地电脑,然后让浏览器端可以显示用户电脑没有安装的字体。

1
2
3
4
@font-face{
font-family: 字体名称;
src:url(文件路径);
}

然后使用font-family引用字体。

不建议使用@font-face来实现嵌入中文字体。这是因为中文字体文件大多数都是10MB以上。这么大的字体文件,会严重影响页面的加载速度,导致用户体验非常差。

实际上,@font-face方法不仅可以用于嵌入字体,还可以用于实现字体图标技术(即iconfont)。

颜色样式

opacity透明度

opacity属性取值是一个数值,取值范围为0.0~1.0。其中0.0表示完全透明,1.0表示完全不透明。

opacity属性不仅作用于元素的背景颜色,还会作用于内部所有子元素以及文本内容。

opacity属性在实际开发中用得也比较多,大多数时候都是配合:hover来定义鼠标指针移动到某个按钮或图片上时,改变透明度来呈现动态的效果。

RGBA颜色

在RGB基础上增加了一个透明度通道Alpha。取值范围为0.0~1.0。

RGBA中的透明度只会针对当前设置的属性起作用。

渐变

background:linear-gradient(方向, 开始颜色, 结束颜色)
线性渐变的“方向”取值有两种:一种是使用角度(单位为deg),另一种是使用关键字
线性渐变也可以接受一个“值列表”,用于同时定义多种颜色的线性渐变,颜色值之间用英文逗号隔开即可。
线性渐变使用的是background属性,而不是background-color属性。

background:radial-gradient(position,shape size, start-color, stop-color)
position用于定义圆心位置,取值跟background-position属性取值一样。shape size用于定义形状大小,由两部分组成,shape定义形状,size定义大小。
position和shape size都是可选参数。如果省略,则表示采用默认值。start-color和stop-color都是必选参数,可以有多个颜色值。

默认情况下,径向渐变的颜色节点是均匀分布的,不过我们可以为每一种颜色添加百分比,从而使得各个颜色节点不均匀分布。

边框样式

在前端开发中,我们都是秉着“尽量少用图片”的原则。能用CSS实现的效果,就尽量不要用图片。因为每一个图片都会引发一次HTTP请求,加上图片体积大,会极大影响页面的加载速度。

border-radius

可以为四个角设置圆角半径,“左上角、右上角、右下角、左下角”

上半圆实现原理:把高度(height)设为宽度(width)的一半,并且左上角和右上角的圆角半径定义与元素的高度一致,而右下角和左下角的圆角半径定义为0。

圆的实现原理:元素的宽度和高度定义为相同值,4个角的圆角半径定义为宽度(或高度)的一半(或者50%)。

实现椭圆: border-radius:x/y;
原理如下:元素的宽度和高度不相等,其中4个角的圆角水平半径定义为宽度的一半,垂直半径定义为高度的一半。

box-shadow

box-shadow:x-offset y-offset blur spread color style;
spread:定义阴影的大小。
style:定义是外阴影还是内阴影。style取值有两种:outset(默认值)和inset。当x-offset和y-offset都为0时,阴影都是向外发散或者向内发散。

多方向 box-shadow:左阴影, 上阴影, 下阴影, 右阴影;

border-colors

必须分别为4条边设定颜色。如果边框宽度(即border-width)为n个像素,则该边框可以使用n种颜色,即每像素显示一种颜色。

border-colors兼容性较差

border-image

4条边的切割宽度,依次为上边、右边、下边、左边(顺时针)。
平铺方式:有3种取值,分别为repeat、round和stretch。

各种图案尝试实现一下。

背景样式

background-size

background-size属性取值有两种:一种是长度值,如px、em、百分比等;另一种是使用关键字

第一种某一边多出来会被剪切;第二种有一条边可能填不满。

background-origin

使用background-origin属性来定义背景图片是从什么地方开始平铺的

background-origin往往都是配合background-position来使用的

background-clip

属性值同上,默认左上角的部分被剪切。

动画效果

CSS3中,动画效果包括3个部分:变形(transform)、过渡(transition)、动画(animation)。

transform

transform属性的变形方法:

平移有3种情况: translateX()、translateY()、translate()。

缩放也有3种情况:scaleX()、scaleY()、scale()。当x或y取值为0~1时,元素进行缩小;当x或y取值大于1时,元素进行放大。

倾斜也有3种情况:skewX()、skewY()、skew()。倾斜度数,单位为deg(即degree的缩写)。如果度数为正,则表示元素沿x轴方向逆时针倾斜或沿y轴方向顺时针倾斜
如transform:skewX(30deg)

其实skewX()方法的变形原理是这样的:由于元素限定了高度为100px,而skewX()方法是沿着x轴方向倾斜的,因此只要倾斜角度不超过180°,元素都会保持100px的高度,同时为了保持倾斜,元素只能沿着x轴方向拉长本身。

transform: rotate(angle); 参数angle表示元素相对于中心原点旋转的度数,单位为deg。如果度数为正,则表示顺时针旋转;如果度数为负,则表示逆时针旋转。

默认情况下,CSS3的各种变形(平移、缩放、倾斜等)都是以元素的中心原点进行变形的。
可以使用transform-origin属性来改变元素的中心原点。

transition

使用transition属性将元素的某一个属性从“一个属性值”在指定的时间内平滑地过渡到“另一个属性值”。凡是涉及CSS3过渡,我们都是结合:hover伪类来实现过渡效果的

transition: 过渡属性 过渡时间 过渡方式 延迟时间;

transition是一个复合属性,主要包括4个子属性:

在实际开发中,当有多个CSS属性需要实现过渡效果时,直接定义transition-property属性取值为all。即所有在hover中发生了改变的属性

transition-timing-function属性取不同值

transition属性分别写在“普通状态”和“悬浮状态”内的不同:移入时效果两者没有区别,但是如果把transition属性写在普通状态内,移出时会有过渡效果;如果把transition属性写在悬浮状态内,移出时没有过渡效果。

实践下遮罩层介绍,手风琴效果等。

animation

transition属性只能实现一次性的动画效果,而animation属性可以实现连续性的动画效果。

animation:动画名称 持续时间 动画方式 延迟时间 动画次数 动画方向;

定义动画

1
2
3
4
5
@keyframes 动画名{
0%{}
……
100%{}
}

0%表示动画的开始,100%表示动画的结束,0%和100%是必须的。不过,一个@keyframes规则可以由多个百分比组成,每一个百分比都可以定义自身的CSS样式,从而形成一系列的动画效果。如果仅仅只有0%和100%这两个百分比,可以使用关键字from和to来代替

然后使用animation属性来“调用动画”

animation-iteration-count属性取值有两种:一种是“正整数”,另一种是“infinite”

animation-direction属性取值有3个

使用animation-play-state属性来定义动画的播放状态。属性只有两个取值,running和paused

实践:了解一些酷炫动画的具体实现。

多列布局

浮动布局比较灵活,但不容易控制;定位布局可以精准定位,但是却不够灵活。

在CSS3中,多列布局常用的属性有

column-count属性取值有两种

column-width属性取值有两种

body就会自动根据容器宽度、每列宽度、内容多少这三者来计算列数。

column-gap属性取值有两个

column-rule属性跟border属性是非常相似的

column-span属性取值只有两种

实践:瀑布流布局

滤镜效果

在CSS3中,所有的滤镜效果都是使用filter属性来实现的。

brightness()方法的取值是一个百分比,其中0%~100%表示减弱图片的亮度,例如0%就是完全黑色;100%以上表示增强图片的亮度,例如200%就是将亮度提高2倍。

grayscale()方法的取值是一个百分比,其中0%表示不做任何修改,100%表示完全灰度(即黑白图片)。

复古滤镜,也叫褐色滤镜。

反色,指的是将红、绿、蓝3个通道的像素取各自的相反值。

hue-rotate()方法的取值是一个度数,单位为deg(即degree的缩写)。其中,0deg表示不旋转,360deg表示旋转360°,也就是相当于一个循环。

drop-shadow(x-offset y-offset blur color);

弹性盒子模型

通过弹性盒子模型,我们可以轻松地创建自适应浏览器窗口的“流动布局”以及自适应字体大小的弹性布局,使得响应式布局的实现更加容易。

在使用弹性盒子模型之前,必须为父元素定义“display:flex;”或“display:inline-flex;”


重点掌握flex、flex-flow、order、justify-content、align-items

flex-grow属性取值是一个数值,默认值为0。当取值为0时,表示不索取父元素的剩余空间;当取值大于0时,表示索取父元素的剩余空间(即子元素放大)。取值越大,索取得越多。
在使用flex-grow时,一般是不需要对弹性盒子内部的子元素定义宽度或高度的,否则会影响flex容器的比例分配。——即直接将父元素所有空间按比例分配

flex-shrink属性用于定义弹性盒子内部子元素的缩小比例。也就是当所有子元素宽度之和大于父元素的宽度时,子元素如何缩小自己的宽度。

flex-grow和flex-shrink是互斥的,不可能同时生效。flex-grow的默认值为0,而flex-shrink的默认值为1。

flex-basis就是width的替代品,它们都用来定义子元素的宽度。只不过在弹性盒子中,flex-basis的语义会比width更好。如果某一个子元素同时设置flex-basis和width,那么flex-basis的值会覆盖width的值。flex-basis属性取值有两个:一个是“auto”,即该子元素的宽度是根据内容多少来定的;另一个是“长度值”

flex-direction属性取值有4个,flex-direction属性是在弹性盒子(即父元素)上定义的。

flex-wrap属性常见取值有3个

使用order属性来定义弹性盒子内部“子元素”的排列顺序。order属性取值是一个正整数,即序号

justify-content属性取值

align-items属性取值

实现块元素在其父元素的水平居中和垂直居中很简单,只需要在其父元素中添加以下代码即可:

1
2
3
display: flex;
justify-content: center;
align-items: center;

其他样式

使用outline属性来定义表单中文本框的轮廓线样式,可以把轮廓线看成是一条特殊的边框来理解。

1
2
input[type="text"]:focus {
outline:1px solid red; }

使用initial属性直接将某个CSS属性重置为它的默认值,initial取值可以用于任何HTML元素上的任何CSS属性。

使用calc()函数通过“计算”的方式来定义某一个属性的取值。只能使用加(+)、减(-)、乘(*)和除(/)这4种运算。表达式中有加号(+)和减号(-)时,其前后必须有空格。在自适应布局中涉及不同单位之间的运算时用得非常多。

举例:三列平分布局

overflow-x和overflow-y这两个属性都有4种取值

使用pointer-events属性来定义元素是否禁用鼠标单击事件。pointer-events属性是一个与JavaScript有关的属性。比较常见的用法是获取验证码。