跟着视频将 HTML 和 CSS (不包括 HTML5 和 CSS3)所有粗略学习了一遍以后,感受有必要再系统性地进行一下复习和总结。第一篇文章将会以一个小 demo 来总结一下 background
的用法。css
demo以下(涉及到本地图片,所以预览效果有问题):
https://jsfiddle.net/ChasonZhang/185mmr99/
效果以下:html
按钮来源(亚马逊(Amazon)的按钮样式):segmentfault
看了上面按钮样式以后,我想到的解决方案有以下几种:布局
最简单:直接使用不带文字的图片做为按钮的背景样式,缺点在于针对不一样的按钮宽度(如上图登陆按钮和购买按钮)须要设计师进行重复的绘制,增长了额外的工做量,且缺少重用性。学习
最完美:使用CSS进行绘制:
linear-gradient
和border-radius
,缺少在于部分低版本IE(具体哪一个版本待查证,印象中是 IE8 及如下)不兼容 border-radius。url最兼容:将使用图片和CSS绘制结合在一块儿。spa
background 属性在第3种方法中获得了充分的利用。.net
下图是 w3c 上关于 background 的属性清单:设计
通过简单的试验,能够得出如下几条结论:code
背景图片默认以原尺寸填充,填充范围包括盒模型的 padding 和 content 区域;
背景图片默认以左上角为原始位置(0, 0),默认按照从左到右、从上到下的顺序**重复填充**,直到填充满整个填充范围;
background-image
能够设置 background-size
(CSS3) 的值, background-color
不能够;感兴趣的话另外两个 CSS3 新属性也能够研究一下,不过兼容性都须要 IE9 及以上。
缩写形式: background: color image position/size repeat origin clip attachment initial|inherit;
,注意 /
的使用;
background 也有层级关系。
blackground 不影响盒模型的宽高,不属于盒模型的内容(content)。以前的浮动与清浮动系列文章里提到过,块元素占满整行,高度由内容撑开。也就是说,在 div 里输入几行文字,div 就有多高;可是若是 div 为空(除了背景图没有其余文字等内容),那么背景图就不会显出来。做为初学者曾经跳进过的坑,这一点仍是要注意的,插入纯背景图须要对块级元素设置宽高。可是,若是在 div 中插入 img
元素,那这就彻底不是一回事,虽然渲染效果可能如出一辙。
以上几点,是对 background
基本知识的总结,做为初学者,我觉得掌握到这种程度基本上算合格了。
样式代码以下:
<style type="text/css"> body { margin: 0;} .btn { margin: 20px auto; width: 135px; height: 31px; background-image: url(img/btn.jpg); background-repeat: repeat-x; } .btnL { height: 31px; background-image: url(img/btnL.jpg); background-repeat: no-repeat; } .btnR { height: 31px; background-image: url(img/btnR.jpg); background-repeat: no-repeat; background-position: right; line-height: 31px; text-align: center; font-size: 14px; } </style>
整个样式的思路是:
将按钮分为两部分:文字+背景。文字属于 html 里的内容,css主要设计的是样式。
将背景拆分为三部分,竖直着切三刀,左右分别是带两个圆角的小矩形,中间是一段横长的矩形。
将中间部分继续竖起切,切成一条条1像素宽的矩形,而后须要多宽的矩形,就用多少条1px矩形。打个简单的比方,就是先微分,再积分。
在这个例子中,使用 background
属性时,须要注意给全部块级元素设置宽,宽只须要 .btn 设置一次就能够。
代码以下,基本的三层嵌套布局。
<body> <div class="btn"> <div class="btnL"> <div class="btnR">加入购物车</div> </div> </div> </body>
知其因此然
在构造这个布局的时候,有一个问题须要明白:
为何 .btnR 须要放在 .btnL 里面?
.btnL 放在 .btn 里面能够理解,可是 .btnL 和 .btnR 不是并列关系吗?假设 .btnR 不放在 .btnL 里面,而是与之并列,会出现按钮背景两边圆角部分错位排列的效果,缘由在于两个块级元素都有宽高,会分别占据一行。
随着 CSS3 的发展,现在这个小 demo 并非解决相似样式的最佳方式了,可是里面蕴含着 **CSS 滑动门**的原理(前几年很是流行的一种方法,参考传智播客的导航栏)。固然了,在这里以这个小 demo 为例,主要是为了总结一下 background
的用法。