本文主要是对CSS中一些比较重要的高级部分作了一些整理,这些内容也许不是经常使用,但是都很强大。本文将长期更新。

边框

CSS2.1 规定:元素的背景是内容、内边距和边框区的背景。设置背景颜色时是没有问题的,背景色显示在边框下面,但是当使用背景图片时你会发现左边框和右边框下面并没有背景图片。这时需要把position-x和position-y设成负值,大小为border的宽度。我个人猜测原因是background-position的起始点是padding的左上角。

背景图片

背景定位

背景定位主要有三种方式:关键字,百分比和长度值。长度值比较简单,就是以元素的左上角为起点找到对应的坐标,然后从该点开始显示背景图片。

关键字和百分比的用法有点相似,比如:right, top,该关键字的意思是将图片的右上角放到元素的右上角,然后向左下方向显示图片。百分数值是同时作用于元素和图片上,例如:20%, 20%,意思是将图片的20%, 20%那个点放到元素的20%, 20%那个点上,如果图片和元素的大小一致则背景图片的左上角和元素的左上角重叠。

其实关键字的用法就是百分数值用法的一种快捷方式,left, top对应0%, 0%,certer, center则对应50%, 50%,right, bottom对应100%, 100%。

em

em是W3C推荐的尺寸单位,1em等于当前的字体尺寸。如果一个元素的 font-size 为 16 像素,那么对于该元素,1em 就等于 16 像素。在设置字体大小时,em 的值会相对于父元素的字体大小改变。如果父元素的字体大小为20px,则1em为20px。

浏览器中默认的文本大小是 16 像素。因此 1em 的默认尺寸是 16 像素。如果body的font-size为100%,则所有元素的默认字体大小为1em,也就是16px。

当使用em为字体大小时,em的值为父元素字体大小。而当使用em为长度单位时,即用于设置宽高时,em的值则为当前字体大小而不是父元素字体大小。例如父元素字体大小为20px,当前的元素的样式为:font-size: 1.5em; width: 2em,则当前元素的字体大小为30px(20 * 1.5),宽度为60px(2 * 30)。

行高line-height

line-height 属性设置行间的距离(行高)。在应用到一个块级元素时,它定义了该元素中基线之间的最小距离而不是最大距离。line-height 与 font-size 的计算值之差(在 CSS 中成为“行间距”)分为两半,分别加到一个文本行内容的顶部和底部。行内元素不可以设置高度和垂直方向的margin和padding,但是可以通过line-height来影响行内元素的布局,可以包含这些内容的最小框就是行框。

line-height 的值可以设为"normal","number","length","%"。"length"的值可以是15px,或者1em等,"%"的值基于当前元素字体的大小,和em单位类似。"number"的值如1, 2等,最终的行高是用这个数字乘以字体的大小。

line-height 具有继承性,就是当前元素的行高会传给全部的后代,其中"length"和"%"会直接把当前的具体值传给后代,而"number"只会把"number"本身传给后代,如1,而不会把乘以字体大小的值传给后代,后代元素拿到这个"number"之后再乘以它自己的字体大小,这样就比较灵活了,而且更合理。因此推荐使用"number"来设置行高。

font-family

CSS 定义了 5 种通用字体系列: Serif 字体, Sans-serif 字体,Monospace 字体,Cursive 字体,Fantasy 字体。其中我们比较常用的是Serif字体和Sans-serif 字体,Serif字体通俗讲就是有衬线字体,包括 Times、Georgia 和 New Century Schoolbook,而Sans-serif 字体则是无衬线字体,包括Helvetica、Geneva、Verdana、Arial 或 Univers。个体参考:CSS 字体系列

font-family的值可以是具体的字体,比如arial, times,也可以是字体系列,比如:"serif"、"sans-serif"、"cursive"、"fantasy"、"monospace"。如果是字体系列,浏览器就会从 sans-serif 字体系列中选择一个字体(如 Helvetica),因此设置字体时强烈建议将字体系列设为最后一个值,以防止前面设置的字体不能使用。

outline

outline (轮廓)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。它和border的区别是outline不参与布局,就是说outline不会影响元素的盒模型,至多和其它元素重叠,而border则是盒模型的一部分,很多时候设置border会影响元素的宽度。另外一个区别是outline不能单独设置某个边的outline。

outline的特性可以用于调试CSS,你可以给元素加个outline来看一下元素的大小和位置是否正确,而不会影响页面的布局。

box-sizing

W3C标准的盒模型是元素的宽高是由内容的宽高加上Padding和Border的值决定的,就是对一个元素设定Padding和Border不会影响元素内容的宽高。而IE6以下的浏览器包括怪异模式(Quirks Mode)下的所有IE浏览器的盒模型为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制,就是说给元素设定width: 100px,则100px包括了内容的宽度,Padding和Border,如果Padding和Border的值改变,则元素内容的宽度也会改变,因为它们的总和始终是100px。

早几年的前端开发人员估计都被这个差异性折磨过,我也曾经痛恨这个问题。但是IE的这种做法也有方便的地方,所以在CSS3中引入了box-sizing属性,它的一个值是border-box,即可实现IE5的那种盒模型。我们举个例子来说明IE这种模型的用途。

场景是一个100px固定宽度的元素,需要一个背景色,内容离边框有10个px。如果是用W3C标准盒模型,代码如下:

        height: 80px;
padding: 10px 0;

下面的是CSS3的box-sizing: border-box的代码:

        box-sizing: border-box;
height: 100px;
padding: 10px 0;

W3C标准盒模型需要根据Padding和Border的值来计算内容的高度,并且一旦Pading和Border的值被修改,height的值必须跟着一起修改,这在开发阶段尤其麻烦。而box-sizing: border-box盒模型下,则不用考虑这些问题,只要设个高度为100px就行了,浏览器会自动根据元素的Padding和Border来对动态调整元素的内容的高度。示例代码

box-sizing的另外一个值是content-box,这个就是W3C标准的盒模型,这个值也是box-sizing的默认值。box-sizing是CSS3引入的一个样式,但是因为IE8就开始支持了,所以如果不考虑IE6和IE7的话就可以放心使用了。如果还不清楚请参考:CSS3 Box-sizing

参考文献

如需转载,请注明来自: BorisHuai前端修炼 > CSS语言精粹

[置顶] CSS语言精粹的更多相关文章

  1. [置顶] CSS+DIV总结

         HTML在Web飞速发展的过程中起着重要作用,有着重要地位.HTML初衷是为了表达标签(<p>.<table>)的内容信息.同时文档布局由浏览器来完成,不使用任何格式 ...

  2. [置顶] css 背景透明,文字不透明,alpha滤镜,opacity,position:relative;

    都知道,在alpha滤镜下,背景透明了,里面的文字也会跟随透明,我们可以设置内容的position为relative可以解决这个问题 但是在position为absolute这么做却没有效果,怎么解决 ...

  3. [置顶] 轻量级语言Lua入门

    作为一个脚本爱好者,而且是脚本(Perl)起家的我,一有空就喜欢学习下这些脚本语言.据说魔兽世界.愤怒小鸟都用到了它,所以今天研究下Lua这个叫法有点奇特的脚本 [转载请注明出处:http://blo ...

  4. [置顶] C语言学习入门

    编译文件:cc -c one.c two.c  生成.o目标文件 链接文件:cc one.o two.o     默认生成 a.out 执行文件 指定生成的可执行文件名   cc -o one one ...

  5. [置顶] C语言itoa()函数和atoi()函数详解(整数转字符C实现)

    头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为: int atoi (const char * str); [函数说明]ato ...

  6. [置顶] C语言单元测试框架

    unitest.h /****************************************************************************** * * * This ...

  7. [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long

    这些数据类型的sizeof具体长度依赖于编译器和操作系统(32-bit or 64-bit) 1: 首先,参见c99标准 标准中没有定义这些数据类型的长度,而是定义了这些数据类型能表达的大小范围的最小 ...

  8. [置顶] C语言中 || 和 &&

    || 或操作,|| 为界将表达式分为两部分,他会先算前一部分,如果前一部分为真,他将停止运算,如果为假,他才会算第二部分,你这里第一部分就为真了,第二部分当然也就不会算了. 例如:  a || b , ...

  9. 《JavaScript语言精粹》小记

    一.前言 以下内容均摘自<JavaScript语言精粹>一书,本人在读这本书时,发现作者诠释JavaScript很犀利,特别是数组部分,固记录下来,想和大家分享下. 随笔主要包含两大部分: ...

随机推荐

  1. Laravel 之父:让 Laravel、Symfony、 Zend 来一场公平的性能测试

    网上充斥着各式各样的 PHP 框架性能对比的文章.然而,他们总是把“苹果”和“橘子”做对比(看上去有点儿像,都是圆的,但其实不是一码事).这次,我将着重对 Laravel.Symfony 和 Zend ...

  2. 湖南大学ACM程序设计新生杯大赛(同步赛)I - Piglet treasure hunt Series 1

    题目描述 Once there was a pig, which was very fond of treasure hunting. The treasure hunt is risky, and ...

  3. 网络流24题之最长k可重线段集问题

    对于每个线段拆成两个点,如同之前一样建图,由于可能出现垂直于x轴的 所以建图由i指向i~ 继续最小费用最大流 By:大奕哥 #include<bits/stdc++.h> using na ...

  4. [BZOJ4651][NOI2016]网格(Tarjan)

    下面直接给出结论,相关证明见官方题解. 1.若跳蚤数不超过1或仅有两只跳蚤且相邻,则答案为-1. 2.若跳蚤形成的连通块个数大于1,则答案为0. 3.若跳蚤之间建图存在割点,则答案为1. 4.否则为2 ...

  5. 【插头DP】BZOJ3125-city

    开学忙成狗,刷题慢如蜗牛…… [题目大意] 给出一个m*n的矩阵里面有一些格子为障碍物,一些格子只能上下通行,一些格子只能左右通行,一些格子上下左右都能通行.问经过所有非障碍格子的哈密顿回路个数. [ ...

  6. 【贪心+Treap】BZOJ1691-[Usaco2007 Dec]挑剔的美食家

    [题目大意] 有n头奶牛m种牧草,每种牧草有它的价格和鲜嫩度.每头奶牛要求它的牧草的鲜嫩度要不低于一个值,价格也不低于一个值.每种牧草只会被一头牛选择.问最少要多少钱? [思路] 显然的贪心,把奶牛和 ...

  7. hdu 3681 压缩dp+搜索

    题意:一个机器人想越狱,他只能带一定电量的电池,'S'表示道路可行,'G'表示充电器, 只可充电一次,但是可以经过很多次.'F'表示起点,'Y'表示要破坏的机关,也是只能破坏一次,但是可以经过无数次. ...

  8. bzoj 1026

    很久以前做过的一道数位DP,现在用一种新的解决数位DP的比较一般的方法. 数位DP裸题是:求[L,R]有多少个数. 先转化成求[0,R]有多少个数,然后区间相减即可. 对于[0,R]中的所有数,用0补 ...

  9. bzoj1002 生成树计数 找规律

    这道题第一眼是生成树计数,n是100,是可以用O(n^3)的求基尔霍夫矩阵的n-1阶的子矩阵的行列式求解的,但是题目中并没有说取模之类的话,就不好办了. 用高精度?有分数出现. 用辗转相除的思想,让它 ...

  10. PAT甲级1098. Insertion or Heap Sort

    PAT甲级1098. Insertion or Heap Sort 题意: 根据维基百科: 插入排序迭代,消耗一个输入元素每次重复,并增加排序的输出列表.在每次迭代中,插入排序从输入数据中删除一个元素 ...