1 css3介绍
CSS3是CSS(层叠样式表)技术的升级版本,于1999年开始制订,2001年5月23日W3C完成了CSS3的工作草案,主要包括盒子模型、列表模块、超链接方式、语言模块、背景和边框、文字特效、多栏布局等模块 。(百度百科)
CSS演进的一个主要变化就是W3C决定将CSS3分成一系列模块。浏览器厂商按CSS节奏快速创新,因此通过采用模块方法,CSS3规范里的元素能以不同速度向前发展,因为不同的浏览器厂商只支持给定特性。但不同浏览器在不同时间支持不同特性,这也让跨浏览器开发变得复杂。(百度百科)
浏览器前缀
被w3c采纳之前的写法:各前缀是区分各个浏览器厂商。
-webkit-border-radius:220px; /* chrome和safari支持 */
-ms-border-radius:220px; /* Microsoft IE */
-moz-border-radius:220px; /* firefox */
-o-border-radius:200px; /* opora */
border-radius: 220px; /* 被w3c采纳之后的写法 */
2 css3选择器
2.1 属性选择器
选择器[属性1][属性2]…(选择居有该属性的元素,添加样式)
选择器[属性名^=属性值](选择具有该属性且以该属性值开头的元素)
选择器[属性名$=属性值](选择具有该属性且以该属性值结尾的元素)
选择器[属性名*=属性值](选择具有该属性且其属性值中含有此属性值的元素)
选择器[属性名~=属性值](选择具有该属性且其属性值中此属性值是以空格分隔的独立部分)
写法例:
/* 选择具有alt属性的图片 加橙色边 */
img[alt]{
border:3px solid orange
}
/* 选择具有title属性的图片 加灰色边 */
img[title]{
border:3px solid grey
}
/* 选择具有title属性 且title属性为"小狗" 给黑边 */
img[title='小狗']{
border:3px solid black
}
/* 选择具有title属性 且title属性以"猫"为开头 给红边 ^ */
img[title^="猫"]{
border:3px solid red
}
/* 选择具有title属性 且title属性以"猫"为结尾 给紫色边 $ */
img[title$="猫"]{
border:3px solid purple
}
/* 选择具有title属性 且title属性包含"猫" 给蓝边 * */
img[title*="猫"]{
border:3px solid blue
}
/* 具有alt属性 并且alt属性中"猫"是以空格分隔的独立部分 加绿色边 */
img[alt~="猫"]{
border:3px solid green
}
/* 多属性 既有title又有alt */
img[title][alt]{
border:3px solid rebeccapurple
}
/* 选择具有.cartoon 加橙色边 */
img[class~="cartoon"]{
border:3px solid orange
}
2.2 关系选择器
空格 后代选择器
+ 下一个兄弟
~ 下边所有的兄弟
> 儿子选择器
例:
/* 选择section的后代 加蓝色边框 */
section div{
border:1px solid blue
}
/* 选择widow后面紧挨下一个兄弟div,加绿边 */
.widow + div{
border:3px solid green
}
/* 选择 widow下边所有的兄弟姐妹 */
.widow ~ div{
border:3px solid red
}
/* 选择section 的第一代p 子代 加橙色边框 */
section > p{
border:3px solid orange
}
2.3 伪类选择器
2.3.1 伪类选择器之child、type
注意:在IE8的之前版本必须声明<!DOCTYPE> ,这样才能生效。
nth-child规定的父元素对应的子元素,指所有子元素,若是恰好第n个元素标签不为所选标签,则无效果。
p:first-child 选择属于其父元素的首个子元素的每个p元素,并为其设置样式。
p:last-child 选择属于其父元素最后一个子元素每个 p元素。
p:only-child 选择属于其父元素的唯一子元素的每个 p元素。(就是这个盒子里只有这一个元素且为p元素的)
img:nth-child(n) 规定属于其父元素的第n个子元素的标签(img)(包括其子标签)的样式。
nth-of-type则不一样,针对同级兄弟元素,只判断和自己一样的元素
p:first-of-type 选择属于其父元素的首个p元素,并为其设置样式。
p:last-of-type 选择属于其父元素最后一个p元素。
p:only-of-type 选择属于其父元素的唯一p元素。(就是这个盒子里只有这一个p元素的,同时可以存在别的元素)
img:nth-of-type(n)选择器匹配同类型中的第n个同级兄弟元素。(必须同级,只匹配兄弟img)
n 可以是数字、关键词或公式。
数字:1~100+
关键词:odd:匹配下标是奇数 和 even:匹配下标是偶数 的子元素的关键词(第一个子元素的下标是 1)
。
公式:例如:2n+1(匹配3、5、7…)
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
p {
width: 100px;
}
/* 选择属于其父元素的第二个p设置样式(如果该父元素第二个子元素不是p则不成立) */
p:nth-child(4) {
border: 3px solid orange
}
/* 选择属于其父元素的所有p标签为奇数的元素。 */
p:nth-child(odd) {
border: 10px solid rgb(88, 79, 212);
}
/* 选择属于其父元素的前三个p的元素 */
p:nth-child(-n+2) {
border: 10px solid rgb(223, 31, 31)
}
h1:only-child {
border: 10px solid rgb(39, 194, 78)
}
</style>
</head>
<body>
<div>
<h1>葫芦娃</h1>
</div>
<div>
<h1>葫芦娃</h1>
<p>大娃</p>
<p>大娃</p>
<p>大娃</p>
<p>大娃</p>
</div>
<p>二娃</p>
<p>三娃</p>
<p>四娃</p>
<div>
<p>五娃</p>
<p>六娃</p>
<p>七娃</p>
</div>
</body>
</html>
效果图:
2.3.2 伪类选择器之link、visited、hover、active
:link 选择器设置所有未访问链接的样式(对已经访问的链接没有样式。)
:visited 选择器设置访问过的页面链接的样式,
:hover 选择器当有鼠标悬停在其上的链接样式,
:active 选择器设置当你点击链接时的样式。
注意:
a:hover 必须在 a:link 和 a:visited 之后,需要严格按顺序才能看到效果。
a:active 必须在 a:hover 之后。
2.3.3 伪类选择器之新增表单
针对表单元素(input)
:focus input:focus 选择元素输入后具有焦点
:disabled 选择所有禁用的表单元素(disabled="disabled"禁用)
:enabled 选择所有启用的表单元素(默认启用)
:lang 向带有指定 lang 属性开始的元素添加样式。
:checked 选择器匹配每个选中的输入元素(仅适用于单选按钮或复选框)。
测试源码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>伪类选择器4</title>
<style>
fieldset {
margin: 50px;
padding: 20px;
line-height: 40px;
}
/*当表单元素处于焦点时*/
input[type="text"]:focus {
background-color: #f40;
}
/*当表单元素处于被选中状态时*/
input[type="radio"]:checked+label {
font-weight: bold;/* 字体加粗 */
}
/* 点击判断是否勾选agree,默认是禁用属性,是则去掉禁用属性 */
#nextStep:disabled {
background-color: #ccc;
}
#nextStep:enabled {
font-weight: bold;
font-style: italic;
}
p:lang(zh) {
font-family: "微软雅黑";
}
p:lang(en) {
font-family: Verdana, Geneva, sans-serif;
}
</style>
<script>
window.onload = function () {
var agree = document.getElementById('agree');
var nextStep = document.getElementById('nextStep');
agree.onclick = function () {
//当用户点击checkbox的时候,需要判断,这个agree是否是选上状态。如果是,则nextStep可用。否则,nextStep不可用
if (agree.checked == true) {
nextStep.disabled = false;
} else {
nextStep.disabled = true;
}
}
}
</script>
</head>
<body>
<fieldset>
<legend>表单</legend>
<form action="">
<label for="">姓名:</label>
<input type="text" name="username" id="username"><br>
<label for="">性别:</label>
<input type="radio" name="sex" id="man" value="">男
<input type="radio" name="sex" id="woman" value=""><label for="woman">女</label>
<input type="radio" name="sex" id="baomi" value=""><label for="baomi">保密</label><br>
<input type="checkbox" id="agree"><label for="agree">我同意以上协议</label><br>
<input type="button" value="上一步">
<input type="button" value="下一步" id="nextStep" disabled>
</form>
</fieldset>
<fieldset>
<legend>lang</legend>
中文简体
<p lang="zh">中文简体</p>
Ti Amo
<p lang="en">Ti Amo</p>
</fieldset>
</body>
</html>
效果图:
2.3.4 伪类选择器之空、非
:empty选择器选择每个没有任何子级的元素(包括文本节点)。针对非行内元素
:not(selector) 选择器匹配每个非selector的元素。
/*空元素*/
li:empty{
height: 20px;width: 20px;
background-color: gold;
}
/*给h1内为空的h1添加样式*/
h1:empty{
height: 20px;width: 20px;
background-color: rgb(35, 150, 70);
}
/*给非空的li加灰色下底边*/
li:not(:empty){
border-bottom:1px dashed gray;
}
/*具有非.special类的li标号字体颜色显示#5f5f5f*/
li:not(.special){
color:#5f5f5f;
}
/*除第一个外,其它li的标号背景色显示为#29b6e9*/
li:not(:first-child)>b{
background-color:#29b6e9;
}
2.3.5 伪类选择器之target
作为属性的target常用属性:_blank新窗口打开链接;_self默认本窗口打开链接
这里主要是说明作为伪类选择器的target
# 锚的名称是在一个文件中链接到某个元素的URL。元素被链接到目标元素。
:target 在到达锚点的时候同时设置样式。
/* 锚记 */
h2:target{
color:red;
}
<a href="#title1">CSS(层叠样式表)</a>
<h2 id="title1">CSS (层叠样式表)</h2>
点击a就会跳转到id为title1的元素(h2)位置上。(并且赋予样式)
2.4 伪元素选择器
::before 伪元素可用于在指定元素内容之前插入一些内容。
::after 伪元素可用于在指定元素内容之后插入一些内容。
在IE8中,进入了:before和:after这两个伪类,但是在IE9中,将这两个伪类归位了伪元素。但同样支持以前伪类的写法。
::selection 伪元素向用户选择的元素部分添加样式。(鼠标选中部分)
::first-line 伪元素用于向指定元素中的文本的首行添加特殊样式。
::first-letter 伪元素用于向指定元素中的文本的首字母添加特效样式。
/* 在section盒子前面插入以下内容 */
section::before{
content:"在前边插入的内容";
width:200px;
height:200px;
border:1px solid #000;
display: block;
}
/* 在section盒子后面插入以下内容*/
section::after{
content:"";
display: block;
clear:both; /* 清除浮动 */
height:0;
visibility: hidden;
}
/* 对div中选中的部分添加红色背景 */
div::selection{
background: red;
}
/* 兼容IE6的做法 */
.clearfix{
zoom:1
}
zoom:设置或检索对象的缩放比例,触发IE浏览器的haslayout属性,解决浮动,margin重叠等一些问题。 zoom是IE浏览器的专用属性,以前火狐以及谷歌等一些其它浏览器是不支持的,也没有通过W3C的标准。不过现在这个属性开始标准化,已经出现在了css3的草案中,也就是CSS3中的transform: scale这个属性来实现。 用法:ie下子元素浮动时候父元素不随着自动扩大的问题,使用下面的CSS写法 .父元素 { overflow: auto; zoom: 1 }, |
伪元素配合伪类选择器使用
css源码:
/* 配合伪类选择器使用*/
section > span:hover::before{
content: "[";
}
section > span:hover::after{
content:"]"
}
效果图展示:鼠标移上去后
3 css3新属性
3.1 透明度写法
background-color:rgba(0,0,255,0.3);(第四个位置:0~1,颜色愈来愈深)
background-color:transparent;(默认全透明,可通过浏览器调整)(#00000000~#000000透明至不透明)
opacity:.1;(0~1,颜色愈来愈深)
3.2 圆角属性
圆角属性的语法格式:
border-radius: px | %;
当border-radius的值,大于等于宽度高度一半的时候,会变为正圆。
border-radius:左上 右上 右下 左下
border-top-left-radius 左上角
border-top-right-radius 右上角
border-bottom-right-radius 右下角
border-bottom-left-radius 左下角
border-radius的值如果是百分比的话,横向的百分比是相对于宽的,纵向的百分比是相对于高的。
如果border-radius的值写成像素,对于长方形来说,只能做成胶囊圆角。如果想做成椭圆,只能写百分比。当border-radius的值大于等于50%,就成为一个椭圆。
3.3 阴影属性
3.3.1 盒子阴影(box-shadow)
从IE9开始支持盒子阴影。
box-shadow: 右 下 羽化值 延展 背景颜色 (inset);
css样式源码:
<style>
html,body,ul,li,ol,dl,dd,dt,p,h1,h2,h3,h4,h5,h6,form,fieldset,legend,img{margin:0;padding:0}
div{
width:150px;
height:150px;
background:skyblue;
border: 1px solid black;
margin:25px;
float:left;
/* line-height:150px; */
text-align: center;
}
/*
box-shadow: 右 下 羽化值 延展 颜色
*/
/* 水平方向的阴影 */
div:first-child{
-webkit-box-shadow:5px 0;
-ms-box-shadow:5px 0;
-moz-box-shadow:5px 0;
-o-box-shadow:5px 0;
box-shadow: 5px 0;
}
div:nth-child(2){
box-shadow: 0 5px;
}
div:nth-child(3){
box-shadow: 5px -5px;
}
/* 右下有阴影,加模糊程度 */
div:nth-child(4){
box-shadow: 5px 5px 20px;
}
/* 右下有阴影,加模糊程度,比原本的盒子上下左右大10px */
div:nth-child(5){
box-shadow: 5px 5px 10px 10px;
}
/* 右下有阴影,加模糊程度,比原本的盒子上下左右大10px 发红光 */
div:nth-child(6){
box-shadow: 5px 5px 10px 10px red;
}
/* 内发光 */
div:nth-child(7){
box-shadow:inset 5px 5px 10px 10px red;
}
/* 多个阴影 */
div:nth-child(8){
box-shadow:inset 5px 5px 10px 10px red,0 0 20px 10px yellow,10px 10px 20px 10px pink;
}
</style>
body部分源码:
<div>水平方向的阴影</div>
<div>垂直方向的阴影</div>
<div>右上方向的阴影</div>
<div>右下有阴影,加模糊程度</div>
<div>右下有阴影,加模糊程度,比原本的盒子上下左右大10px</div>
<div>右下有阴影,加模糊程度,比原本的盒子上下左右大10px 发红光 </div>
<div>内发光</div>
<div>多个阴影</div>
效果图:
3.3.2 文本阴影(text-shadow)
文字阴影从IE10开始支持的。
text-shadow: 右 下 羽化值 颜色;
文字阴影没有延展,没有inset,其它和box-shadow一样。
例:
css部分:
h1{color:pink;text-shadow: 5px 5px 10px blue;}
body部分:
<h1>文本阴影效果!</h1>
效果图:
3.4 背景新属性
3.4.1 CSS2中的背景属性
background-color 背景色
background-image 背景图
background-repeat 是否平铺
background-position 背景图定位
background-attachment fixed表示固定背景图。scroll背景图随着屏幕滚动而滚动。
3.4.2 背景起源(backgroun-origin)
背景起源,就是背景是相对于谁进行定位的。
background-origin: padding-box | border-box | content-box;
background-origin的默认取值是padding-box。
padding-box 背景图像相对于边界框进行定位(默认/计算border不算padding)
border-box 背景图像相对于边界框的边进行定位(只以盒子实际边为准/border和padding都不计算)
content-box 背景图像的相对于内容进行定位(计算border和padding)
例:padding-box:border-box:content-box:
background-origin属性指定background-position属性应该是相对位置。
注意如果背景图像background-attachment是"固定/fixed",这个属性没有任何效果。
3.4.3 背景裁切(backgrou-clip)
background-clip属性指定背景绘制区域。
background-clip: border-box | padding-box | content-box
border-box 默认值。背景绘制在边框方框内(覆盖到边界框/默认)
padding-box 背景绘制在衬距方框内(不覆盖border)
content-box 背景绘制在内容方框内(不覆盖border和padding)
例:border-box:padding-box:content-box:
3.4.4 背景大小(background-size)
background-size属性指定背景图片大小。
background-size:auto auto 默认的情况
background-size:px px 背景图大小将以该大小来呈现
background-size:100% 100% 宽度与盒子等宽,高度与盒子登高
background-size:100% auto 宽度与盒子等宽,高度自动等比缩放
background-size:auto 100% 高度与盒子等高,宽度自动等比缩放
background-size:cover 缩放背景图到刚好覆盖盒子为止(以最小边铺满为准,笔者认为==100%)
background-size:contain 在保证背景图完整显示的情况下,尽可能的缩放背景图到等高或等宽。
3.4.5 背景渐变(linear-gradient)
最好还是写兼容浏览器写法或者用pie插件
background-image:linear-gradient;(线性梯度)
linear-gradient(开始的位置,颜色值1,颜色值2,…)
linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片。
创建一个线性渐变,需要指定两种颜色,还可以实现不同方向(指定为一个角度)的渐变效果,如果不指定方向,默认从上到下渐变。
css部分:
<style>
*{
margin: 0;
padding: 0
}
div {
width: 150px;
height: 150px;
border: 1px solid black;
margin: 30px;
float: left;
}
.dv1 {
/*红色出现在起始位置,蓝色出现在终点(从左到右)*/
/* background-image: -webkit-linear-gradient(left, red, blue);
background-image: -ms-linear-gradient(left, red, blue);
background-image: -moz-linear-gradient(left, red, blue);
background-image: -o-linear-gradient(left, red, blue); */
background-image: linear-gradient(to right, red, blue);
}
.dv2 {
/*红色出现在起始位置,蓝色出现在终点(从上到下)*/
background-image: linear-gradient(to bottom, red, blue);
}
.dv3 {
/*红色出现在起始位置,蓝色出现在终点(从左上到右下)*/
background-image: linear-gradient(to bottom right, red, blue);
}
.dv4 {
/*变划分区域红色(0~33.33%)蓝色(33.33%~66.66%)黄色(66.66%~100%)
(默认根据颜色的个数百分比划分区域/三个颜色各自划分33%,四个颜色划分25%...)*/
background-image: linear-gradient(to bottom, red, blue, yellow);
}
.dv5 {
/*渐变划分区域红色(0~25%)蓝色(25%~50%)黄色(50%~75%)绿色(75%~100%)*/
background-image: linear-gradient(to bottom, red, blue, yellow, green);
}
.dv6 {
/*渐变划分区域红色(0~20%)蓝色(20%~50%)黄色(50%~80%)绿色(80%~100%)百分比是出现起点*/
background-image: linear-gradient(to bottom, red, blue 20%, yellow, green 80%);
}
</style>
body部分:
<div class="dv1">从左到右</div>
<div class="dv2">从上到下</div>
<div class="dv3">从左上到右下</div>
<div class="dv4"></div>
<div class="dv5"></div>
<div class="dv6"></div>
效果图展示:
3.4.6 径向渐变(radial-gradient)
Internet Explorer 9 及之前的版本不支持渐变。
background-image: radial-gradient(颜色1, 颜色2, …);
background-image: radial-gradient(shape size at position(位置处的形状大小), 开始颜色, …, 结束颜色);
radial-gradient() 函数用径向渐变创建 “图像”。
径向渐变由中心点定义。径向渐变 - 颜色结点均匀分布
为了创建径向渐变你必须设置两个颜色。
css部分:
<style>
*{
margin: 0;
padding: 0
}
div {
width: 200px;
height: 100px;
border: 1px solid black;
margin: 30px;
color: black;
float: left;
}
.d1 {
/* background-image:radial-gradient(宽半径 高半径, 起始颜色,颜色2,...,终止颜色); */
background-image: radial-gradient(100px 50px, green, pink, blue, red, gold, white);
}
.d2 {
background-image: radial-gradient(red, gold, purple);
}
.d3 {
/* background-image:radial-gradient(定义渐变形状, 起始颜色,颜色2,...,终止颜色); */
background-image: radial-gradient(circle, red, gold, purple);
}
.d4 {
/* background-image:radial-gradient(定义渐变的大小,可能值 at 圆心位置x 圆心位置y, 起始颜色,颜色2,...,终止颜色); */
background-image: radial-gradient(closest-side at 60% 55%, red, gold, purple);
}
.d5 {
background-image: radial-gradient(farthest-side at 60% 55%, red, gold, purple);
}
.d6 {
background-image: radial-gradient(closest-corner at 60% 55%, red, gold, purple);
}
</style>
body部分:
<body>
<div class="d1">控制半径大小</div>
<div class="d2">椭圆形 Ellipse(默认)<br>farthest-corner (默认) : 指定径向渐变的半径长度为从圆心到离圆心最远的角</div>
<div class="d3">圆形 Circle:指定圆形的径向渐变</div>
<div class="d4">closest-side :指定径向渐变的半径长度为从圆心到离圆心最近的边</div>
<div class="d5">farthest-side :指定径向渐变的半径长度为从圆心到离圆心最远的边</div>
<div class="d6">closest-corner : 指定径向渐变的半径长度为从圆心到离圆心最近的角</div>
</body>
效果图展示:
3.4.7 多背景
从IE9开始,一个盒子可以加多个背景,多个背景是指多个背景图,非多个背景色。
多个背景之间以逗号分隔。
例如:background:背景图1 content-box, 背景图2 padding-box, 背景图3 border-box, …(谁的写前面会覆盖其他的背景图)
content-box是指background-origin和background-clip都为content-box;
padding-box是指background-origin和background-clip都为padding-box;
…
div{
width:300px;
height:300px;
border:100px dotted red;
margin:100px auto;
padding:100px;
color:white;
background:url(../images/48/1.png) content-box,url(../images/48/2.png) padding-box,url(../images/48/3.png) border-box;
}
效果图:
3.4.8 背景图与插入图片区别
- 插入图片语义高,可以被搜索引擎收录到;背景图语义低,不能搜索引擎收录到;
- 插入图片站位,背景图不占位;
- 背景图非常容易控制,因为有background-position,background-origin,background-size等。插入图片不容易控制。
- 背景图可以用精灵图
3.4.9 插入图片会出现的bug
==bug: 插入图片的时候会出现10px的白边 ==
解决办法1
img{
display: block;
}
解决办法2
img{
vertical-align: middle;
}
3.5 让IE678部分支持CSS3
可以通过一个第三方的库PIE_IE678.js让IE678部分支持CSS,例如:圆角、盒子阴影。