Open,记录,分享  for 积极自由的生活方式

一、absolute布局

现在B/S架构的网络应用程序越来越多,开发的时候界面布局是个头疼的问题,如何让界面能在不多的浏览器窗口范围内展示更多的内容,同时又能排布尽量多的功能模块,还要求整体布局随窗口和分辨率自适应?请看这篇文章吧:Html+CSS 构建 B/S结构软件界面 — 布局篇 — position方式。虽然我以前也曾想过用html全absolute来实现flash的mc布局方式,但最终由于失去了html的文档式的布局便捷而放弃。而作者通过使用position:absolute和其他html布局方式的结合来完成了传统C/S软件的流布局和边界布局,除了IE6的css隐患以外,是非常值得借鉴的思想。

二、css的hack

相信不少人在写页面的时候会用到css的hack,幻想通过这种方式不被各种不兼容部分标准的浏览器虐,但实际情况往往麻烦,避免了一个,如何避免另一个?不过我个人基本不抱有这种幻想,有时候宁愿多加一个元素也要尽量避免使用hack。如果你认为某些情况下不得不用,那么建议在使用之前看看zergine同学为“响应版主号召”的CSS Hack整理

三、css省略号

标题列表是非常常用的模块,而对于长文本的字符截断总是很麻烦,有时候我们甚至把这个皮球踢给后端的程序员来解决。不过读过这篇文章也许你以后会勇敢的承担在前端用css实现长文本截断的重任:用css使单行超出指定宽度的内容切去并在结尾出现省略号(IE FF 通过)

  最近在写css的时候,由于经常使用到很长的多级选择器,而碰到一些样式被覆盖或者覆盖不了的情况是相当的郁闷,所以专门花了一些时间对一些选择器做了对比测试。这里先说明一下,由于ie6不支持css2.0选择器,所以这些测试忽略了一些2.0的选择器和连接符,如伪类(:hover),属性([type=”text”]),子选择符(>)等,仅针对#id,.class,tag和空格连接符测试。

  定义:

  1. CSS句子:一个完整的选择器构成一个CSS句子,如.abb #cd div.class。而用逗号连接的算作多个句子的省略定义方法。
  2. CSS单词:CSS句子中任何一个#id或.class或tag都算作一个CSS单词,虽然照以前的理解一般把tag#id.class1.class2整个看作一个单词,但是在本文讨论范围内,这个只能算作一个由4个单词组成的词组。
  3. 优先级:对于选择到同一个元素的两个CSS句子,当他们定义该元素的同一个属性时,如果其中一个写在前而不会被写在后面的覆盖这个属性,那么就称这个CSS句子的优先级高于另一个。而当2个CSS句子互相调换在代码中的位置都是后面的覆盖前面的属性时,称这两个CSS句子有相同的优先级。

  测试用dom:

<html id="html" class="html">
<body id="body" class="body">
<div id="div">
    
<div id="test1" class="test test1">1第一行<br>第二行<br>自身</div>
    
<div id="test2" class="test test2">2第一行<br>第二行<br>自身</div>
    
<div id="test3" class="test test3">3第一行<br>第二行<br>自身</div>
    
<div id="test4" class="test test4">4第一行<br>第二行<br>自身</div>
    
<div id="test5" class="test test5">5第一行<br>第二行<br>自身</div>
    
<div id="test6" class="test test6">6第一行<br>第二行<br>自身</div>
    
<div id="test7" class="test test7">7第一行<br>第二行<br>自身</div>
    
<div id="test8" class="test test8">8第一行<br>第二行<br>自身</div>
</div>
</body>
</html>

  这里先给出8组选择器,每组两个,各位同学可以先想一想每组里面哪个选择器的优先级高:

/*第1组*/
#test1{height:2em;}
.test1{height:1em;}
 
/
*第2组*/
.body #test2{height:1em;}
#test2{height:2em;}
 
/
*第3组*/
div .test3{height:2em;}
#test3{height:1em;}
 
/
*第4组*/
.body #test4{height:2em;}
body #test4{height:1em;}
 
/
*第5组*/
html #test5{height:2em;}
body #test5{height:1em;}
 
/
*第6组*/
#body #test6{height:1em;}
.html #test6{height:2em;}
 
/
*第7组*/
html #body #test7{height:1em;}
.html .body #test7{height:2em;}
 
/
*第8组*/
#html.html .body #test8{height:1em;}
.html #body.body #test8{height:2em;}

  现在公布答案:

  1. 仅一个选择器单词的时候#id高于.class应该不用说了;
  2. div#test2比#test2多了一个单词,那么多一个单词的优先级高,这里可以暂时理解成多一个单词就选择的更精确;
  3. 同样多一个单词,但其中一个有#id选择,则#test3要高于div .test3;
  4. .body #test4高于body #test4,暂时可理解为同样多层级时,.class高于tag;
  5. html #test5与body #test5有同样的优先级,先写的会被覆盖,这里猜测同样的层级数,优先级与层级跨越的深度无关;
  6. #body #test6高于.html #test6,理解为#id优于.class也与层级深度无关;
  7. 最后两个比较有难度了,但浏览器下的结果是html #body #test7高于.html .body #test7,怎样理解我先不说;
  8. #html.html .body #test8与.html #body.body #test8同级。

  其实越到后面,应该越是能看出一种模糊的规则来。经过我反复的分析,最终从模糊的感觉中发现了其中的奥秘,或者说是一种说得通的解释:

  把css句子的单词组成定义为“数位”,像个十百位的数字一样,css中不同的单词代表不同的权重数位,分别是#id,.class,tag三个数位依次从高到低排列,组成了相当于十进制数字的百位,十位,个位。再把每个css句子中个各种单词的个数代入到刚刚划分的数位里,就可以得到一个类似于十进制数字的三位数,只是在css的优先级数位里,没有进位的概念,无数个低位单词也还是低于一个高位的单词。从而结论就是,按#id,.class,tag的数位统计了css的单词个数并代入各个数位后,只要比较两个css数字的大小(从高位到低位依次比较),就能得出两个css的优先级

  用这个规则重新比较一遍前面的例子:

  1. 1,0,0>0,1,0
  2. 1,1,0>1,0,0
  3. 0,1,1<1,0,0
  4. 1,1,0>1,0,1
  5. 1,0,1=1,0,1
  6. 2,0,0>1,1,0
  7. 2,0,1>1,2,0
  8. 2,2,0=2,2,0

  用这个方法很容易就能比较出最后两组例子的优先级,对于前述的一些情况也可以做出合理的解释,所以在没有更好的css选择器解释方法之前,这个数位计算法是非常方便且容易理解的。

[测试页面地址]

  网易博客一直被我当作一个值得学习的产品,除了过度使用ajax造成几乎无法被搜索引擎收录外,其中不管是架构思想还是技术上都还是有一些令人叹为精妙的地方的。

  前几天发现了他登录框的弹出浮动层一个新的变化,在IE下拖动浏览器滚动条的时候,浮动层的居中效果已经不再会随滚动条微弱的抖动了。可以对比一下,显然新浪的博客却还没有找到解决方案,右下角的浮动小广告在滚动页面时仍然会抖动。由于IE并不支持css里position:fixed;的方法,所以我就开始一边拖他的登录框,一边思考他是如何实现浏览器滚动无抖动的。当我把登录框使劲往右侧一拖时,更另我惊奇的事情发生了,整个框居然盖住了浏览器右边的滚动条,感觉像是被拖到浏览器外面去了一样!

  苦于在IE下看不到他ajax出来的源代码,于是换到FF,并打开强大的firebug,小样儿,还不快给爷现出原形!鼠标定位到登录框上,看到他的css里只有个position:absolute;是值得关注的,并没有使用FF下可以固定定位的fixed。继续找到登录框的父级容器,上面的css除了继承的*{margin:0;padding:0;}和body里的字体外,什么都没有了,而且在浏览器上下滚动的时候也不像用JS做的定位,于是更感到奇怪。再看与其同级的有一个id是blog-163-com-body的div,firebug指示其占有的区域是整个屏幕,而且css里第一行赫然的写着height:100%;!再点body看css,同样写了height:100%;。难道就是传说中的100%高度“大法”?果然html标签也是!但还是没想通什么页面里面的元素可以挡住滚动条,还特意测试了下html标签下appendChild,失败,于是又仔细看一遍css,终于发现了里面惊人的秘密:

html大致结构:

<html>
    
<body>
        
<div id="blog-163-com-body" class="bggb">真正内容的区域</div>
        
<div id="_$$_outer_layer">放置各种浮动层的区域</div>
    
</body>
</html>

css主要实现:

html{height:100%; overflow:hidden; border:0;}
body{height:100%; overflow:hidden;}
#blog-163-com-body.bggb{width:100%; height:100%; position:relative; overflow-y:scroll; overflow-x:auto;}

  答案的关键就在于对容器的理解,和对溢出高度滚动条的控制,通过一个普通的div模拟了整个浏览器的滚动条,以使得可以让他同级的元素盖在他上面。分析之后,完成了一个DEMO,并真正发现了这样做的好处:

  1. 实现了无JS相对窗口固定的浮动层
    (主要针对IE不能使用position:fixed)
  2. 让页面里的元素可以盖住浏览器的滚动条
    (这样最大的好处就是在使用弹出层并添加半透明不可点的背景时不再需要根据页面的长度计算高度了,完全css控制,而且滚动条被遮挡后也直接限制了鼠标滚轮的操作)
  3. 拥有了基本的“页面管理器”的思想
    (我个人提出的一种管理页面里各种消息框,弹出层以及类似flash的深度管理的初步思想)

  最后不得不感叹网易做前端这块的人真够变态!这么无敌的招数都能想出来,真是佩服,看来taobaoUED招聘的css题目也应该加上这一道:“如何实现无JS相对窗口固定的浮动层”,或者“如何让页面里的元素盖住浏览器的滚动条”,才算的上足够变态。