title: 背景与边框
date: 2016-10-16
tags: CSS Secretsurl
在CSS3里咱们可使用RGBA和HSLA两种色彩模式,两者都可以用来在设置颜色的同时指定其它透明度。RGBA指的是“红色、绿色、蓝色和Alpha透明度”,而HSLA则表明“色调、饱和度、亮度和Alpha透明度”。spa
在RGBA模式里,前三个参数分别是红色、绿色和蓝色的强度值,取值从 0~255 或 0%~100% (最多见的是 0~255, 而非百分数形式)。而在HSLA模式里,前三个参数则分别表明色调( 0~360 )、饱和度( 0%-100% )和亮度( 0%~100% )。RGBA和HSLA第四个参数都是透明度,取值从0(彻底透明)到1(彻底不透明)。code
CSS3仍有opacity属性,但它的做用是使整个元素都半透明,包括前景内容,而不只是背景。图片
须要知道的是,在默认状况下,背景会延伸到边框所在区域的下层。因此即便咱们给边框设置了半透明的效果,那么从视觉上也是没法分辨的。因此,若是咱们不但愿背景侵入边框所在的范围,就须要使用到 CSS3 的 background-clip 背景切割属性,将它的值设置为 padding-box
。ip
border: 10px solid hsla(0%, 0%,100%,.5); background:white; background-clip:padding-box;
鲜为人知的是,box-shadow 还能够接受第四个参数(称为"扩展半径"),经过指定正值或者负值,可让投影面积加大或者减少。ci
一个正值的扩展半径加上两个为零的偏移量以及为零的模糊值,获得的投影其实就像是一道实线边框了,在加上 box-shadow 的最大好处,能够支持逗号分隔发法,那么咱们即可觉得其建立任意数量的投影了。rem
div{ height: 200px; width: 200px; background: yellowgreen; box-shadow: 0 0 0 10px #655,0 0 0 15px deeppink, 0 2px 5px 15px rgba(0,0,0, 0.6); }
有时当咱们只须要两层边框的时候,即可以使用 outline 属性来产生外层的边框,这种方案会变得很是灵活,而不一样于 box-shadow 只能模拟实现边框。input
div{ height: 200px; width: 200px; border: 20px solid #655; border-radius: 10px; outline: 5px dashed deeppink; }
描边的另外一属性 outline-offset 还能够控制它更元素边缘之间的间距,这个属性能够接受负值。it
div{ height: 200px; width: 200px; border: 20px solid #655; border-radius: 10px; outline: 5px dashed deeppink; outline-offset: -25px; }
可是,IE8 如下的并不支持 outline-offset 属性。io
去掉 input 标签 focus 时的亮色边框 input {outline:none}
有时,咱们但愿背景图片与容器的边角之间留出必定的空隙(相似内边距的效果),在 CSS2 的时代要实现这一点是很麻烦的。可是在 CSS3 的时代 background-position
属性已经获得了很好的扩展,而且当结合 background-origin
属性使用时,将发挥出更大的创造力。
在 CSS3 中,background-position 容许咱们指定背景图片距离任意角的偏移量,只需咱们在偏移量前指定关键字就行了。
须要知道的是,background-position 在默认状况下是以 padding-box 为基准的,不过,咱们可使用 CSS3 中一个新的属性 background-origin
来改变这种默认行为。background-origin 默认值一样为 padding-box,其它能够接受的值是,content-box 和 border-box。
#box{ width:500px; height:500px; border:20px solid rgba(0,0,0,0.5); background: url(img/adver2.jpg) no-repeat ; /*background-clip:content-box; */ background-position: right 20px bottom 10px; background-origin: content-box; padding:40px; }
如此,咱们在 background-position 中使用的边角关键字将会之内容区的边缘做为基准。
一个灵活的方法是使用两个嵌套的 div 来实现边框内圆角的效果。
#box{ background:#655; padding:0.8em; } #subBox { background: tan; padding:0.8em; border-radius:0.8em; }
在 CSS 渐变属性中使用百分比的做用是指某个颜色距离起点的起始位置。默认的渐变样式为从上往下,因此当某个颜色值设置了百分比后,便会从距离顶端相关的距离(百分比计算)开始填充实色。而渐变是也有空间占比的,渐变过渡区的占比为总的空间(高度或宽度)减去上下两个着色块空间占比剩下的空间。
但如果前面有比当前的颜色值百分比大的,会自动将当前颜色值的百分比设置为前面颜色中的最大百分比值。
此外,默认状况下,还会根据颜色的个数来为每一个颜色设置百分比,最后一个颜色的百分比值就是100%,而起始的值就是0%,中间若是再有多个颜色值,则根据100/(个数-1)平均下去。
如此,即可以作出一个简单的多重颜色线条的背景来:
#box{ width:400px; height:200px; background:linear-gradient( red 0, red 14.3%, orange 0, orange 28.6%, yellow 0, yellow 42.9%, green 0, green 57.2%, blue 0, blue 71.5%, indigo 0, indigo 85.8%, purple 0, purple 100%); }
颜色要设置两次,是由于每一个颜色须要一个起始着色点,而后还须要将两个颜色之间的渐变过渡区域覆盖为实色,消除过分效果。
渐变是一种由代码生成的图像,咱们能想对待其余任何背景图像那般来对待他,好比对其使用 background-size
来调整其大小。
div{ width:200px; height: 200px; background:linear-gradient( #fb3 50%, #58a 0 ); background-clip:padding-box; background-size: 20px 100%; }
div{ width:200px; height: 200px; background:linear-gradient( to right,/*or 90deg*/ #fb3 50%, #58a 0 ); background-clip:padding-box; background-size: 100% 20px; }
div{ width:200px; height: 200px; background:linear-gradient( 45deg, #fb3 0, #fb2 25%, #58a 0, #58a 50%, #fb3 0, #fb3 75%, #58a 0, #58a 100% ); background-clip:padding-box; background-size: 20px 20px; }
若是咱们须要为背景添加斜向条纹,那么便须要为贴片( 20px,20px)设置完整的色标。不幸的是,这种方法并不完美,当咱们尝试改变渐变的角度时,看起来会很糟糕。幸运的是,还有更好的方法来建立斜向条纹,即 repeating-linear-gradient 和 repeating-radial-gradient,循环式的重复渐变。
如此,便再也无须担忧如何去建立无缝拼接的贴片。而且,咱们会直接在渐变的色标中指定长度,而不是原来的 bakcground-size
,这里的长度是直接在渐变轴上进行度量的,它直接表明了条纹自身的宽度,对渐变来讲就是以整个元素的范围进行填充。
div{ width:200px; height: 200px; background:repeating-linear-gradient( 45deg, #fb3 0, #fb2 15px, #58a 0, #58a 30px ); }
需注意的是在这个方法中,若是咱们想要建立双色条纹,那么便须要使用四个色标才行。
div{ width:200px; height: 200px; background: deeppink; background-image: repeating-linear-gradient( 30deg, hsla(0,0%,100%,0.3), hsla(0,0%,100%,0.3) 15px, transparent 0, transparent 30px ); }
咱们首先为其指定了一个主色系的背景颜色,而后把半透明白色的条纹叠加在主色系背景之上获得浅色条纹。
桌布图(方格图)
div{ width:200px; height: 200px; background: white; background-image: linear-gradient( rgba(200,0,0,0.5) 50%,transparent 0), linear-gradient(90deg,rgba(200,0,0,0.5) 50%,transparent 0); background-size: 30px 30px; }
天然界中的事物都不是以无限平铺的方式存在的。大天然更不会以 "无缝" 的贴片重复本身。因此重现大天然的随机性也许展示更多的真实性。
background: hsl(20,40%,90%); background-image: linear-gradient( 90deg,#fb3 11px,transparent 0), linear-gradient(90deg,#ab4 23px,transparent 0), linear-gradient(90deg,#655 41px,transparent 0); background-size: 41px 100%,61px 100%,81px 100%; //41,61,81 都是质素
为了增长随机性的真实性,咱们将贴片尺寸进行了最大化。为了让最小公倍数最大化,即要达成相对质素,那么最好的方法即是使用质数。