纯CSS实现列表的背景色交替及鼠标划过变色

用纯CSS实现的列表背景色交替效果, 另外附加了个鼠标划过变色. 其实, 这是08年写的一个效果, 当时博客还叫Bluebird’s sky, 哈, 如今仅剩个本地的躯壳了, 域名都过期了.
纯CSS实现列表的背景交替及鼠标划过变色
列表背景色交替实现原理很简单,用一张二倍于列表单行高度的背景图,然后,上半部分PS成奇数行颜色,下半部分PS成偶数行颜色,然后将这张图定义给列表外围元素平铺.这样一来,纵使有万千行,它也会轻而易举的交替颜色.相之于JS实现,它只有寥寥几行代码,是不是轻了许多,但有一点, 背景图必须算好, 列表高度值也必须固定, 否则就悲剧了.
鼠标划过效果,不多言了, 定义元素的:hover. 悲剧的是, 万恶的是IE6不支持.
CSS核心代码点此查看DEMO

#demo dl{background:url(http://mrthink.net/demo/images/bg_dd1x60.png)}
#demo dl dd{padding-left:8px;height:30px;line-height:30px;cursor:pointer}
#demo dl dd:hover{background-color:#888;color:#fff}

另, 本文仅是一种CSS思路, 实际应用,请自行权衡项目需求.

CSS技巧之圆角背景与三角形

前端开发中两个很不错的小技巧, CSS三角形与圆角背景. 的确, 它们都可以通过图片来实现, 但, 抛开用代码实现可以减小图片加载量不说, 当你遇到三角形或圆角背景下还有一层非纯色背景时, 你又不得不考虑IE6 png兼容问题, 嗯, IE6,万恶之源. 此时, CSS三角形及圆角背景将是上佳选择.
查看演示: 点此查看DEMO
CSS三角形与圆角背景案例应用
CSS圆角背景
通过改变层叠元素的margin值实现圆角效果.当然,有人会说不用这么麻烦,CSS3几句代码就可以搞定,但目前来说不实用,支持的浏览器没几个.
css部分

.r_top, .r_bottom {display:block; background:transparent; font-size:1px}/*左上右上角和左下右下角的容器*/
.r_a, .r_b, .r_c, .r_d {display:block; overflow:hidden}/*四个圆角*/
.r_a, .r_b, .r_c{height:1px}
.r_b, .r_c, .r_d{background:#cf6}
.r_a {margin:0 5px}
.r_b {margin:0 3px; border-width:0 2px}
.r_c {margin:0 2px}
.r_d {height:2px; margin:0 1px}

html部分


  
.....内容容器.....

CSS三角形
这个就比较简单了, 把元素定义成块级0大小(0宽0高0字号0行高)后, 通过改变元素的border-color值实现. 本文用的是em元素, 当然, 如果你项目中用em比较频繁, 为避免冲突也可以用samp,strong等元素.
当然, 即便用CSS实现的三角形, 万恶的IE6还是会给你添点麻烦: IE6不支持border-color的transparent值, 怎么办? 为ie6单独写一个border-color值, 然后用chroma滤镜实现透明, 详见代码
css部分

em{display:block;width:0;height:0;font-size:0;line-height:0;border-width:40px;border-style:solid;border-color:#cf6 #fff #39c #ffc;_filter:chroma(color=#000000)/*色度滤镜,让IE6实现透明borderColor.滤镜的颜色值不可简写*/}
em.a{border-color:transparent transparent #fff transparent;_border-color:#000 #000 #fff #000}
em.b{border-color:transparent transparent transparent #fff;_border-color:#000 #000 #000 #fff}
em.c{border-color:#fff transparent transparent transparent;_border-color:#fff #000 #000 #000}
em.d{border-color:transparent #fff transparent transparent;_border-color:#000 #fff #000 #000}

html调用


本文只是CSS实现方法只是众多CSS方法中的一种, 更多的方法, 请自行Google.

前端开发中一些常用技巧总结

自己前端开发中常用到的一些技巧及问题解决方法,会常更新,希望对前端路上的朋友有帮助.
JavaScript常用函数请点此前往: 一些常用且实用的原生JavaScript函数 , 你还可以前往兰芝博客, 查看由淘宝UED整理的前端tips: http://www.12sui.cn/develop/.
1.文章标题列表中日期居右显示的两种方法,方法A相对方法B省资源,但比方法B要多写两句代码,使用时请视情况而定:
方法A(经典论坛ariesjia提供的思路.感谢~):


@Mr.Think这是文章标题2010-10-10

然后定义p和span的样式:

p{position:relative}
p span{position:absolute; right:0}

方法B:


2010-10-10@Mr.Think这是文章标题

然后定义span右浮动:

p span{float:right}

其实这两种方法可以延伸到很多情况下,很实用的一种写法;
2.web标准中,同一页面中只能有一个h1标签.很多人知道这个概念,但做到的却很少;
3.空白外边距互相叠加的问题:一般通过添加透明边框或者1px的内边距避免.详细解读:http://mrthink.net/css-margin-overlying-way/;
4.ie6下max/min-width/height实现,_width:expression(document.body.clientWidth > 600 ? “600px” : “auto”); _height: expression(this.scrollHeight >600 ? “600px” : “auto”);.
5.html/class/id,最好统一以小写书写,这样更严谨(符合xhtml标准);
6.不推荐用下面代码兼容IE8:


如果是非短期性页面,尽量避免使用,页面应尽可能保证向后兼容.更多兼容方法请详细阅读: http://mrthink.net/cssandhtml-hack-mainbrower/
7.空div在IE(FF中没有)是有默认高度的,可以用定义:div { witdh:100%; background:#9c0; font-size:0}的方式去掉默认高度;
8.在使用table标签时应该尽可能的利用它本身的属性,最大限度的分离结构与样式.详细解读:http://mrthink.net/csshtml-colgroup-col-style/;
9.充分利用表单中label标签提升用户体验; 这一点对于页面中那些小的选项框,以及对残障人士阅读网站都有好处. 细节是用户体验的第一步;例如:


当鼠标点击SAMPLE时,光标将自动在文本域中获取焦点;
10.fieldset, legend标签, 鲜为人知,却很实用的一组标签;它可以很明了的把一组元素框起来,主要用于表单;
11.optgroup标签,鲜为人知,它对提升选择表单用户体验很有帮助.作用? 就是可以在有很多选项时,对这些选项分组:



12.表单都要加name值,name值是一个标识,不同于id,据我所发现,若是未定义name值,非IE浏览器下是无法通过document.formid获取到表单元素的.请看如下代码及注释:

<html>
<head>
<script>
window.onload=function(){
alert(document.mrform.length);  //所有浏览器均会弹出表单元素长度
alert(document.thinkform.length);  //仅IE会弹出该表单元素长度
}
</script>
</head>
<body>
<form name="mrform" id="thinkform" action="#">
......
</form>
</body>
</html>

13.同一行上文字与图片垂直居中对齐方法:为图片与文字的共同父元素所有的后代元素定义*{vertical-align:middle};
例如:


@Mr.Think

只需定义p*{vertical-align:middle}即可使文字与图片同行垂直居中.
14.同一行上文字与表单对齐方法: 设置表单元素第一字体为Tahoma(Verdana系列也可),并设置vertical-align:middle.建设大家把这个约定写入CSS RESET中,能减小很多麻烦:

body,button,input,select,textarea{font:12px/1.5 tahoma,arial,sans-serif; vertical-align:middle}

15.获取m至n间随机数的公式: Math.random()*(n-m)+m;
16.针对ie6下png背景显示问题,CSS中可以这样解决:_background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=crop, src=’http://mat1.gtimg.com/www/mb/images/openShadow.png’);
17.优先加载页面中的Sprite图(请参见Google首页源码):

if(document.images)new Image().src='images/sprite.png'

18.CSS及JavaScript中,非注释类中文(CSS中指字体),在最后优化时须转换成Unicode码,以避免编码错误时的乱码显示.
19.ie6/ie7下若overflow失效, 一般是由于元素中有relative定位元素,可为为父级元素添加position:relative解决.
20.ie6下border-color:transparent无效解决方法:

_border-color:#ff0 #047 #047 #047;_filter:chroma(color=#047)/*#047颜色值将被透明*/

最大限度的分离table的样式与结构

用table布局,相信大家都知道这是前端很诟病的事.但从HTML标签角度来看table标签,它的功能强大也是毋庸置疑的, 不然, 它也不会曾主导网站布局模式数年(甚至于现在仍有N多整站用table布局的网站). 但CSS+XHTML的兴起,使很多人开始妖魔化table这一标签,甚至以页面中是否有table来评判页面质量,这是不对的. table也有它存在的作用,很多页面功能(比如数据表格类,表单对齐等)用table实现远比用div实现起来简单明了.当然,本文不是为table平反的, 我只是想告诉大家如何最大限度的分离table的样式与结构.
分离样式,当然离不开CSS,而对于table标签,还有更多私有HTML属性可以利用.比如,thead,tr,th,td,tbody,tfoot,colgroup,scope.而本文正是利用这些属性,把样式从table中分离出来.
请看下图:

这是一个有6种背景色的table,如果按常规的table定义,想必大家都知道这个表格写出来该有多麻烦,你得一个个单元格的去加样式,加属性.其实,上面的效果完全可以有着很明了简洁的结构,也可以不通过修改html页面来改变它的样式.
HTML代码:点此查看DEMO

最大限度的分离table的样式与结构,Uh Oh!
LINENUM ID-1 ID-2 ID-3
1 A CY I
2 Br S KMQ
3 HTC LLI P
4 ACC G QO
5 Z AHD M
LINE.NO ID-1 ID-2 ID-3

CSS代码:

table#itab{border-collapse:collapse; border:1px solid #999; width:50em; margin:0 auto}
#itab caption{font-size:1em; font-weight:normal; color:#a40000}
#itab thead{background:#ffc}
#itab td,table#itab th{border:1px solid #ccc}
#itab td{padding-left:0.8em}
#itab tfoot{background:#fcc}
#itab .linenum{width:15%; background:#0cf}
#itab .id-1{width:20%; background:#cf9}
#itab .id-2{width:25%; background:#eee}
#itab .id-3{width:30%; background:#9ff}

如此一看,是不是明了很多.无非是把表格结构化,然后充分利用thead,th,tfoot等table私有属性定义不同的样式.这里不得不提一下colgroup标签,在本文DEMO中,它起到了很重要的作用.但个人认为,它也只能做一些定宽背景定义.它有一个很致命的弱点,不兼容. 比如用它来给列定义字体颜色,ie6下是正常,但其他浏览器好像都是不支持的(如果一定要用它来定义列的字体颜色和对齐方式,可以利用CSS高级选择器first-child为ie6外的浏览器定义样式,暂不详述).但不可否认colgroup是一个很实用的标签.
另外, 关于cellspacing/cellpadding/border如何用css控制, 我也为大家提供一下css代码:

table{border:0;margin:0;border-collapse:collapse}
table td, table, th{padding:0}

表格样式的分离,个人觉得完全用CSS分离也不是一个明智的选择,当有些效果CSS无法实现时,或者实现起来比较麻烦时,我们完全可以用JavaScript来实现你想呈现的效果.比如隔行换色,鼠标划过变色等效果(可扩展阅读奇或偶数行高亮显示及鼠标划过高亮显示类).
多思考,多发现,多实践.HTML的每一个标签如同我们身体的每一个器官,都有个它特定的功能,好好利用它们,相信能带给你很多惊喜.

CSS特性:空白外边距互相叠加

空白双边距是一个极容易误解的CSS特性.它不是CSS的bug,但如果我们一旦误解,将会给你带来很多麻烦.
先看如下demo代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>空白边距叠加demo@Mr.Think
<style>
body{width:300px; font-family:'微软雅黑'; font-size:1em; text-indent:10px; line-height:1.25}
div{background:#a40000;margin:10px}
div p{background:#eee;margin:15px}
</style>
</head>
<body>
<div><p>空白边距叠加demo@Mr.Think</p></div>
</body>
</html>

这是一个div元素内嵌套p的简单样例,先别复制保存为html测试,在你看完上面的代码后,你是否以为它出为你呈现如下图的效果?
空白外边距互相叠加
好,现在你可以复制上面代码,保存到本地,然后在浏览器中打开.你会惊讶的发现,它呈现给你的效果是这样的:
空白外边距互相叠加
为什么会这样呢?按CSS中,对于有块级子元素的元素计算高度的方式,如果元素没有垂直边框和填充,那其高度就是其子元素顶部和底部边框边缘之间的距离.故,子元素的顶部和底部空白边就突出到元素的外围了.p元素的15px外边距与div元素的10px的外边距形成一个单一的15px垂直空白边,另外,形式的这个空白边并非为div所包围,而是呈现在div的外围.所以,我们看到了第二张效果图.
如何解决?本人比较推荐两种解决方式:
其一,为外围元素定义透明边框.具体到本例,即在样式div中加入border:1px solid transparent;
其二,为外围元素定义内边距填充..具体到本例,即在样式div中加入padding:1px
另外,还可以通过外围元素绝对定位,或者定义子元素浮动等方式实现.