属性选择器:
div : 标签选择器 id : ID选择器 class : 类选择器 div .p : 交集选择器 div p : 后代选择器 div>p : 子代选择器 div+p : 相邻选择器(div标签相邻的p标签) div~p : (div标签后面的所有p标签) E:[attr] E:[attr=value] E:[attr^=value] E:[attr$=value] E:[attr*=value] E:[attr~=value] //不论类名有多少个,^代表必须以该value值开头,因此一个类包含多个类名,类名也必须以该value值开头,否则不等。结构选择器
E:first-child //代表E元素父节点下第一个子元素,并且该子元素与E一致,否则无效 E:last-child E:nth-child() E:nth-child(n) //n代表0,1,2,3....(当n小于1时无效) E:nth-last-child(1) //从后向前选择,表示倒数第一个元素伪类选择器
E:target //表示激活的状态,要配合锚点使用 E:empty //表示元素为空的状态伪元素:通过css模拟出html的效果
E::after E::before //代表在E元素内的最后一个位置插入虚构的元素伪元素选择器
E::first-letter E::first-line E::selector在CSS2中可以改变元素的透明度,但仍存在缺陷,改变外部元素的透明度,由于透明度继承性,会导致内部元素的透明度也发生改变,并且不能再更改内部元素的透明度。
<div id="parent"> <div id="son"></div> </div> #parent{ width:200px; height:200px; background-color:red; opacity:0.3; } #son{ width:100px; height:100px; background-color:blue; }CSS3新增了两种颜色模式:
RGBA : Red Green Blue (0-255) Alpha(0-1) HSLA : 色调(0-360) 饱和度(0-100%) 亮度(0-100%) 透明度(0-1)
text-shadow : 水平位移 垂直位移 模糊程度 阴影颜色 注:若在同一个元素上想使用多个阴影效果,可以并列写,用逗号隔开
<p class="tu">你好,世界</p> <p class="ao">你好,世界</p> body{ background-color:#ccc; } p{ color:#ccc; text-align:center; font-size:80px; font-weight:bold; margin-top:20px; } .tu{ text-shadow:-1px -1px 0 #fff,1px 1px 0 #000; } .ao{ text-shadow:-1px -1px 0 #000,1px 1px 0 #fff; }三个盒子:content-box、padding-box、border-box 盒模型:box-sizing : content-box(外加模式) / border-box(内减模式)
CSS3浏览器支持程度差,有时需要添加私有前缀
<div id="box"></div> //实现渐变效果 #box{ width : 200px; height : 200px; margin : 0 auto; border : 1px solid black; //实现从左到右 红色到蓝色的渐变效果 background : linear-gradient(left,red,blue); //添加私有前缀 background : -webkit-linear-gradient(left,red,blue); background : -moz-linear-gradient(left,red,blue); background : -ms-linear-gradient(left,red,blue); background : -o-linear-gradient(left,red,blue); }浏览器内核私有前缀: Google、Safari : -webkit- Firefox : -moz- IE : -ms- Opera : -o-
透视perspective仅仅是视觉上呈现3D效果,并不是真正的3D
<div id="in"> <div id="out"></div> </div> #in{ width: 500px; height: 500px; margin: 100px auto; perspective: 113px; background-color: red; transform: rotateY(75deg); } #out{ width: 200px; height: 200px; margin: 100px auto; background-color: pink; transform: rotateY(45deg); }想要真正的实现3D效果,使用transform-style:preserve-3d
<div id="in"> <div id="out"></div> </div> #in{ width: 500px; height: 500px; margin: 100px auto; background-color: pink; position: relative; transform: rotateY(85deg); transform-style: preserve-3d; } #out{ width: 300px; height: 300px; background-color: red; position: absolute; top: 100px; left: 100px; transform: rotateX(45deg); }=========================补充=============================
:target属于伪类选择器,就像上面所说的,表示激活的状态,需要配合锚点使用。
此处点击a标签,页面会自动跳转到#parent标签下(a标签自带的功能),配合:target,实现点击后改变样式,此时url后缀会加上#parent,即使刷新也会存在,只有手动删除才会恢复原来的样式。
<div id="parent"> <span>hello</span> </div> <div id="brand"> <a href="#parent">跳转</a> </div> #parent{ width: 100px; height: 1200px; background: pink; } #parent:target{ background: red; } #parent:target span{ color: green; }:nth-of-type : 确定了某个位置上的某类型的子元素 :nth-child : 只是确定了某个位置上的子元素,并没有确定类型
::before和::after不是指存在于标记中的内容,而是可以额外插入内容的位置。尽管生成的内容不会成为DOM的一部分,但它同样可以设置样式。
在浏览器中当我们选取某段文字,默认是浅蓝色背景+黑色字体。如果想改变这样的样式,可以通过::selection。但是该伪元素在IE中只有IE9支持,并且在Firefox中需要加-moz-前缀(::-moz-selection)、以及该伪元素只支持color和background-color两个属性的设置。
注:在CSS3中伪类用一个冒号:表示,而伪元素用两个冒号表示::
<span>hello world</span> span::selection{ color: #fff; background-color: pink; } span::-moz-selection{ color: #fff; background-color: pink; }boder-image浏览器支持度强一些,但运用在项目中仅存在一些前端爱好者的blog中。 为了更好的理解,暂时把boder-image在语法的表达形式进行属性的分解阐述(实际应用中是不能分解的,此处只是为了帮助更好理解该属性) 引入背景图片:boder-image-source 切割引入背景图片(切片):border-image-slice 边框图片的宽度:boder-image-width 边框背景图片的排列方式:boder-image-repeat
此处重点讲的是排列方式:repeat、round、stretch repeat(水平重复):边框从中间向两边不断平铺,在平铺过程中保持边框背景图片切片的大小,这样就造就了两端边缘可能有被切的现象; round(水平平铺):对边框背景图的切片进行压缩(或伸缩)来适应边框宽度的大小,进行排列,使其正好显示在区域内; stretch(水平拉伸):只会把相应的切片进行拉伸,适应边框的大小,默认值;
1)border-radius:<-length>{1}设置一个值:top-left/top-right/bottom-right和bottom-left四个值相等。 2)border-radius:<-length>{2}设置两个值:top-left和bottom-right一致、top-right和bottom-left一致。 3)border-radius:<-length>{3}设置三个值:top-left、top-right和bottom-left、bottom-right 4)border-radius:<-length>{4}设置四个值:top-left、top-right、bottom-right、bottom-left分别为不同的值。
boder-radius:<-length>/<-length>:四个角X轴/四个角Y轴 如果X与Y一致,可以省略为一个值。 boder-radius:<-length><-length><-length><-length>/<-length><-length><-length><-length> : 左上角X轴 右上角X轴 右下角X轴 左下角X轴 / 左上角Y轴 右上角Y轴 右下角Y轴 左下角Y轴
border-radius还是内半径和外半径之分
div{ width: 300px; height: 300px; border: 100px solid #ccc; /*大于100px 边框 和(内容+padding)半径都改变*/ border-radius: 150px; /*小于100px只有 边框 半径改变*/ border-radius: 50px; }boder-radius的应用:
div{ margin-top: 20px; } #box1{ width: 100px; height: 100px; background: orange; border-radius: 50%; } #box2{ width: 100px; height: 50px; background: pink; border-radius: 50px 50px 0 0; } #box3{ width: 100px; height: 100px; background: blue; border-radius: 100px 0 0 0; } #box4{ width: 100px; height: 50px; background: green; /*border-radius: 50px 50px 50px 50px/25px 25px 25px 25px;*/ border-radius: 50px/25px; }border-radius:50px/25px:代表四个角X轴为50px,Y轴为25px; border-radius:50px 25px:代表左上角和右下角X、Y轴都为50px,右上角和左下角X、Y轴都为25px;
box-shadow: none | [inset x-offset y-offset blur-radius spread-radius color],[inset x-offset y-offset blur-radius spread-radius color]…
box-shadow属性可以使用一个或多个阴影,用“逗号”隔开
inset:可选,阴影类型,设置为内阴影;默认为外阴影 x-offset:阴影水平偏移量(正右负左) y-offset:阴影竖直偏移量(正上负下) blur-radius:阴影模糊半径 spread-radius:阴影扩展半径,取正值将加深阴影深度,取负值可以向内压缩阴影,直到扩展半径等于模糊半径。
以下代码可以实现实线边框效果,但实质上并非“边框”,因为box-shadow并不是盒模型中的元素,不会计算到内容宽度(即box-shadow不会影响页面的任何布局)
*{ margin: 0; padding: 0; } .box{ width: 200px; height: 100px; margin-left: 30px; float: left; } .border{ border: 10px solid #ccc; } .box-shadow{ box-shadow: 0 0 0 10px red; }第二段代码:
#box{ width: 200px; height: 200px; background: url(1.jpg); border-radius: 50px; box-shadow: inset 5px 5px 5px 0 black; margin-bottom: 10px; } #img{ width: 200px; height: 200px; border-radius: 50px; box-shadow: inset 10px 10px 5px 0 black; } <div id="box"></div> <img src="1.jpg" id="img">注: 1. box-shadow的inset如果要运用在图片上,需要设置一个外容器,在将该图片设置为背景图片,接着使用box-shadow。如果直接运用的img标签上则无效。 2. 另外还要注意,如果一个图片大于设置的宽高度,直接用外容器设置背景图片与img标签设置图片,两者显示的区别。前者可能显示图片的一小部分,而img标签将图片进行压缩按照规定的宽度和高度并显示整张图片。 3. IE8以及以下低版本不支持。要想兼容IE低版本,可以使用IE的滤镜来模拟实现。
背景主要包括五个属性: background-color background-image background-repeat background-attachment(背景图片是固定还是滚动) background-position(背景图片位置)
与背景相关的新增属性: background-origin(指定背景图片的起点) IE9+ background-clip(指定背景图片的显示范围) IE9+ background-size(指定背景图片的尺寸大小) IE9+ background-break(指定内联元素的背景图片进行平铺时的循环方式) 多背景特性
background-origin:虽然现代浏览器都支持,但是在不同内核的浏览器下还是需要浏览器各自的前缀
background-position:top left; //1 background-position:left top; //2 background-position:50% 0; //3 #box{ width: 100px; height: 100px; background: url(1.jpg); margin: 10px; padding: 30px; border: 20px solid rgba(0,0,0,0.1); background-size: 50px 50px; background-repeat: no-repeat; //background-origin: padding-box; //默认 //background-origin: content-box; background-origin: border-box; }注:以上三个实例都是基于background-attachment:scroll情况下实现的,如果是属性值为fixed将不起任何作用。
background-clip:虽然现代浏览器都支持,但是在不同内核的浏览器下还是需要浏览器各自的前缀
background-clip: border-box(默认) | padding-box | content-box
#box{ width: 100px; height: 100px; background: url(1.jpg); margin: 10px; padding: 30px; border: 20px solid rgba(0,0,0,0.1); background-size: 50px 50px; background-repeat: no-repeat; background-clip: content-box; //超过content-box的其它部分都裁剪 }扩展:background-repeat属性值的不同,会导致background-image起点不同,只是平时我们用border-color属性覆盖住了它的显示,此时可以将border-color设置为半透明颜色,从而分析情况。
div{ width: 300px; height: 100px; border: 50px dashed rgba(0,0,0,0.5); /*半透明颜色,分析情况*/ background: url(1.jpg) no-repeat; background-color: rgba(255,0,0,0.8); padding: 30px; margin: 20px; } .no-repeat{ background-repeat: no-repeat; /*默认*/ } .repeat{ background-repeat: repeat; }由图可得:
当background-repeat: no-repeat(默认值)时,background-image是从元素的内边距左上角(padding)到边框右下角(border)结束。
当background-repeat:repeat时,background-image是从元素的边框左上角到边框右下角结束,从而将background-color覆盖。
看到这里,应该了解到background-position、background-origin以及background-clip三者具体的区别
background-size:虽然现代浏览器都支持,但是在不同内核的浏览器下还是需要浏览器各自的前缀
background-size: auto | <-number> | <-percentage> | cover | contain
auto:默认值
number:数值
percentage:相对于元素宽度来说的
cover:背景图片填充整个容器大小,可能会导致图片失真的情况,注意放大后的图片不是正中间,为了让背景图片放大后显示,可以结合background-position:center使用。
background-size:cover配合background-position:center常用来制作”满屏背景”效果。唯一的缺点是,需要制作一张足够大的背景图片,不然在较大的分辨率浏览器下会导致背景图片失真
contain:可以让背景图像保持本身的宽度和高度比例,将背景图片缩放到宽度或者高度正好适应所定义背景的区域。但是也可能会导致背景图片失真的情况,并且可能图片不能填充整个容器大小
定义:在Web网页中,一个元素所占据空间的大小由四个部分组成,分别是内容(Content)、内边距(Padding)、边框(border)、外边距(margin),由此构成了CSS盒模型。
在CSS盒模型中分为两种,一种是W3C的标准盒模型,另外一种是IE的传统盒模型。
W3C标准盒模型:元素的宽度/高度 = 内容宽度/高度 + padding + border
IE传统盒模型:IE5- IE6~7(Quirks模式下) 元素的宽度/高度 = 内容宽度/高度、 内容宽度/高度 = padding + border
box-sizing:指定盒模型计算的方式 IE8+ border-box(默认) | content-box | inherit
注:IE传统盒模型并不是一无是处,当定义好一个元素,并在一定范围内想修改该元素的padding或border时候,元素的总尺寸是不会发生变化的,不需要重新计算元素的盒子大小,不会影响页面的整体布局。
本质上说,渐变就是背景属性background-image中一个值,不在是以往的图片制作显示渐变效果,直接通过CSS3属性便可以直接操作,减轻了向服务器端发起的HTTP请求。
线性渐变
//从底部向顶部线性渐变 #top{ background-image: linear-gradient(to top,red,green,blue,pink); /*background-image: linear-gradient(0deg,red,green,blue,pink);*/ } //从右下角向左上角线性渐变 #top-left{ background: linear-gradient(to top left,red,green,blue,pink); /*background: linear-gradient(-45deg,red,green,blue,pink);*/ } //多颜色线性渐变 #many{ background: linear-gradient(to bottom,red 0%,green 20%,blue 38%,pink 52%,black 80%,grey 100%); }径向渐变
div{ width: 100px; height: 100px; margin: 10px 0 0 100px; border: 1px solid #ccc; font-size: 30px; } /*简单的径向渐变*/ #radial{ background-image: radial-gradient(pink,blue); } /*径向渐变*/ #circle{ background-image: radial-gradient(circle,pink,blue); /*background-image: radial-gradient(circle at 50% 50%,pink,blue);*/ /*background-image: radial-gradient(circle at center,pink,blue);*/ } /*制作一个半径为70、且圆心在中心点的径向渐变*/ #circle-70{ background-image: radial-gradient(2em circle at center,pink,blue); } /*椭圆渐变*/ #ellipse{ background-image: radial-gradient(ellipse,pink,blue); } /*自定义X、Y半径和圆心半径*/ #self{ /*<number>*/ background-image: radial-gradient(50px 30px at 30px 30px,pink,blue); /*<percentage>*/ /*background-image: radial-gradient(50% 30% at 30% 30%,pink,blue);*/ } /*多色径向渐变*/ #many{ background-image: radial-gradient(pink,blue,yellow,green); background-image: radial-gradient(pink 0%,blue 25%,yellow 52%,transparent 100%); }重复渐变:有时候希望在一个元素的背景上重复的渐变”模式”。在没有重复渐变的属性之前,主要通过重复背景图像(使用background-repeat)创建线性渐变,但没有创建重复的径向渐变的类似方式。因此CSS3推出了repeating-linear-gradient和repeating-radial-gradient。
/*重复线性渐变*/ #repeating-linear{ background-image: repeating-linear-gradient(pink 20px,blue 40px); /*background-image: repeating-linear-gradient(pink 20%,blue 40%);*/ } /*重复径向渐变*/ #repeating-radial{ background-image: repeating-radial-gradient(pink 20px,blue 40px); }注:对于不兼容渐变效果的浏览器,可以通过图片制作处理渐变效果、IE浏览器通过专门滤镜来处理等
CSS3变形是一些效果的集合,比如平移、旋转、缩放和倾斜效果,每个效果都称为变形函数(Transform Function),它们可以操作元素发生旋转、平移、缩放等变化。这些效果在之前都需要依赖图片、Flash或脚本才能完成,而使用纯CSS来完成这些变形无须加载额外的文件,减少了HTTP请求,加快了页面响应速度。
perspective属性(透视):简单理解为视距,用来设置用户和元素3D空间Z平面之间的距离。而其效应由它的值来决定,值越小,用户与3D空间Z平面距离越近,视觉效果更令人印象深刻; (官方说法:该属性可将可视内容映射到一个视锥上,继而投影到一个2D视平面上。如果不设置透视属性,则Z轴空间中的所有点将平铺到同一个2D视平面内,并且变换结果将不存在景深概念)
<div id="parent"> <div id="son"></div> </div> #parent{ width: 200px; height: 250px; margin: 100px 600px; background-color: pink; perspective: 500px; /*此处对父元素设置,对子元素设置无效*/ } #son{ width: 100%; height: 100%; background-color: blue; transform: rotateX(45deg); transform-origin: bottom; }backface-visibility属性: 决定元素旋转背面[ rotateY(180deg) ]是否可见。
hidden(默认) | visible
<div class="stage"> <div class="container"> <div class="card front"></div> <div class="card back"></div> </div> </div> ....以下在重复6个相同的div结构 .stage{ float: left; border: 1px dotted orange; position: relative; margin: 20px; border-radius: 8px; perspective: 1000; } .container{ width: 102px; height: 142px; position: relative; transition: 0.5s; transform-style: preserve-3d; } .card{ position: absolute; top: 0; right: 0; bottom: 0; left: 0; backface-visibility: hidden; } .front{ background: blue; } .back{ background: pink; transform: rotateY(180deg); } .stage:nth-child(1) .container{ transform: rotateY(0deg); } .stage:nth-child(2) .container{ transform: rotateY(-30deg); } .stage:nth-child(3) .container{ transform: rotateY(-60deg); } .stage:nth-child(4) .container{ transform: rotateY(90deg); } .stage:nth-child(5) .container{ transform: rotateY(-120deg); } .stage:nth-child(6) .container{ transform: rotateY(-150deg); } .stage:nth-child(7) .container{ transform: rotateY(-180deg); }注意:transform: rotateX(-180deg) translateZ(100px)与transform: translateZ(100px) rotateX(-180deg) 区别
/*先进行旋转再平移*/ transform: rotateX(-180deg) translateZ(100px); /*先进行平移再旋转*/ transform: translateZ(100px) rotateX(-180deg);下面在来看一个立方体的例子(疑惑点)
<div class="container"> <div class="cube hidden"> <div class="side front">1</div> <div class="side back">2</div> <div class="side right">3</div> <div class="side left">4</div> <div class="side top">5</div> <div class="side bottom">6</div> </div> </div> .container{ width: 500px; height: 300px; float: left; position: relative; margin: 200px 500px; perspective: 1200px; } .cube{ width: 100%; height: 100%; position: absolute; transform-style: preserve-3d; transform: rotateY(45deg); } .side{ display: block; position: absolute; width: 196px; height: 196px; border: 2px solid black; line-height: 196px; font-size: 120px; font-weight: bold; color: white; text-align: center; backface-visibility: hidden; /*疑惑点:不知道为什么无效*/ } .cube .front{ background: rgba(255,0,0,0.7); transform: translateZ(100px); } .cube .back{ background: rgba(0,255,0,0.7); transform: rotateX(-180deg) translateZ(100px); } .cube .right{ background: rgba(0,0,255,0.7); transform: rotateY(90deg) translateZ(100px); } .cube .left{ background: rgba(255,255,0,0.7); transform: rotateY(-90deg) translateZ(100px); } .cube .top{ background: rgba(255,0,255,0.7); transform: rotateX(90deg) translateZ(100px); } .cube .bottom{ background: rgba(0,255,255,0.7); transform: rotateX(-90deg) translateZ(100px); }我的解决办法是将rgba透明度全部调整至1。如果知道为什么第一段代码我的backface-visibility:hidden;是无效的,麻烦私信我,哈哈~
平移函数translate() 缩放函数scale() 旋转函数rotate() 倾斜函数skew()
outline : [outline-size] | [outline-style] | [outline-color] outline-offset 单独分开写,safari不能写在后面,否则无效
#box{ outline:10px solid #ccc; } #box{ border:10px solid #ccc; }由上面两个图可以知道,outline是不会影响元素的盒子大小。
border与outline的区别: 1. border是元素盒模型的组成部分之一,如果改变元素的border,元素盒子大小会发生变化。而outline不会变化; 2. 在border中可以设置单边的样式(比如border-top等),而outline四条边都是一样的; 3. border只能向外扩展,而outline-offset,不仅可以向外还可以向元素内部扩展;
//如下面的右图 #box{ width: 100px; height: 100px; border: 10px solid red; outline: 10px solid #ccc; outline-offset: -5px; }