??xml version="1.0" encoding="utf-8" standalone="yes"?>
<HEAD>
<TITLE>始终在页面固定位|的?lt;/TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html" charset="gb2312">
</HEAD>
<style>
<!--
.div{
position: absolute;
border: 2px solid red;
background-color: #EFEFEF;
line-height:90px;
font-size:12px;
z-index:1000;
}
-->
</style>
<BODY>
<div id="Javascript.Div1" class="div" style="width: 240; height:90" align="center">正中...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc1(){
document.getElementById("Javascript.Div1").style.top=document.body.scrollTop+(document.body.clientHeight-document.getElementById("Javascript.Div1").offsetHeight)/2
document.getElementById("Javascript.Div1").style.left=document.body.scrollLeft+(document.body.clientWidth-document.getElementById("Javascript.Div1").offsetWidth)/2;
}
</SCRIPT>
<div id="Javascript.Div2" class="div" style="width: 240; height:90;" align="center">左上...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc2(){
document.getElementById("Javascript.Div2").style.top=document.body.scrollTop
document.getElementById("Javascript.Div2").style.left=document.body.scrollLeft;
}
</SCRIPT>
<div id="Javascript.Div3" class="div" style="width: 240; height:90;" align="center">左下...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc3(){
document.getElementById("Javascript.Div3").style.top=document.body.scrollTop+document.body.clientHeight-document.getElementById("Javascript.Div3").offsetHeight;
document.getElementById("Javascript.Div3").style.left=document.body.scrollLeft;
}
</SCRIPT>
<div id="Javascript.Div4" class="div" style="width: 240; height:90;" align="center">右上...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc4(){
document.getElementById("Javascript.Div4").style.top=document.body.scrollTop;
document.getElementById("Javascript.Div4").style.left=document.body.scrollLeft+document.body.clientWidth-document.getElementById("Javascript.Div4").offsetWidth;
}
</SCRIPT>
<div id="Javascript.Div5" class="div" style="width: 240; height:90;" align="center">右下...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc5(){
document.getElementById("Javascript.Div5").style.top=document.body.scrollTop+document.body.clientHeight-document.getElementById("Javascript.Div5").offsetHeight;
document.getElementById("Javascript.Div5").style.left=document.body.scrollLeft+document.body.clientWidth-document.getElementById("Javascript.Div5").offsetWidth;;
}
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
<!--
function scall(){
sc1();sc2();sc3();sc4();sc5();
}
window.onscroll=scall;
window.onresize=scall;
window.onload=scall;
//-->
</SCRIPT>
<div style="position: absolute; top: 0; left: 0; width: 10000; height: 4000;"></div>
</BODY>
</HTML>
最q?l常有朋友问我一些工作中遇到的CSS问题。他们L不能很好的控制CSSQ媄响CSS的效率发挥。我来分析ȝ一下错误所在,帮助大家更加Ҏ使用CSS?/p>
本文ȝ了我开始用CSS布局Ҏ以来所有的技巧和兼容ҎQ我愿意把这些与你分享,我会重点解释一些新手容易犯的错?包括我自׃犯过?Q如果你已经是CSS高手Q这些经验技巧可能已l都知道Q如果你有更多的Q希望可以帮我补充?/p>
使用~写可以帮助减少你CSS文g的大,更加Ҏ阅读。css~写的主要规则请参看?a target="new">常用css~写语法ȝ》,q里׃展开描述?/p>
忘记定义寸的单位是CSS新手普遍的错误。在HTML中你可以只写width="100"Q但是在CSS中,你必ȝ一个准的单位Q比如:width:100px width:100em。只有两个例外情况可以不定义单位Q行高和0倹{除此以外,其他值都必须紧跟单位Q注意,不要在数值和单位之间加空根{?/p>
当在XHTML中用CSSQCSS里定义的元素名称是区分大写的。ؓ了避免这U错误,我徏议所有的定义名称都采用小写?/p>
class和id的值在HTML和XHTML中也是区分大写的,如果你一定要大小写合写Q请仔细认你在CSS的定义和XHTML里的标签是一致的?/p>
当你写给一个元素定义class或者idQ你可以省略前面的元素限定,因ؓID在一个页面里是唯一的,而clas s可以在页面中多次使用。你限定某个元素毫无意义。例如:
div#content { /* declarations */ }可以写成
#content { /* declarations */ }q样可以节省一些字节?/p>
通常padding的默认gؓ0Qbackground-color的默认值是transparent。但是在不同的浏览器默认值可能不同。如果怕有冲突Q可以在样式表一开始就先定义所有元素的margin和padding值都?Q象q样Q?/p>
* {
margin:0;
padding:0;
}
CSS中,子元素自动承父元素的属性|象颜艌Ӏ字体等Q已l在父元素中定义q的Q在子元素中可以直接l承Q不需要重复定义。但是要注意Q浏览器可能用一些默认D盖你的定义?/p>
如果对同一个元素的定义有多U,以最接近(最一U?的定义ؓ最优先Q例如有q么一D代?/p>
Update: Lorem ipsum dolor set
在CSS文g中,你已l定义了元素pQ又定义了一个class"update"
p {q两个定义中Qclass="update"被使用Q因为class比p更近。你可以查阅W3C的?Calculating a selector’s specificity?了解更多?/p>
一个标{֏以同时定义多个class。例如:我们先定义两个样式,W一个样式背景ؓ#666Q第二个样式?0 px的边框?/p>
.one{width:200px;background:#666;}
.two{border:10px solid #F00;}
在页面代码中Q我们可以这栯?/p> <div class="one two"></div>
q样最l的昄效果是这个div既有#666的背景,也有10px的边框。是的,q样做是可以的,你可以尝试一下?/p>
CSS初学者不知道使用子选择器是影响他们效率的原因之一。子选择器可以帮助你节约大量的class定义。我们来看下面这D代码:
<div id="subnav">q段代码的CSS定义是:
div#subnav ul { /* Some styling */ }你可以用下面的方法替代上面的代码
<ul id="subnav">样式定义是:
#subnav { /* Some styling */ }用子选择器可以你的代码和CSS更加z、更加容易阅诅R?/p>
Z节省字节Q我不要l背景图片\径加引号Q因为引号不是必ȝ。例如:
background:url("images/***.gif") #333;可以写ؓ
background:url(images/***.gif) #333;如果你加了引P反而会引v一些浏览器的错误?/p>
当一些元素类型、class或者id都有共同的一些属性,你就可以使用l选择器来避免多次的重复定义。这可以节省不少字节?
例如Q定义所有标题的字体、颜色和marginQ你可以q样写:
h1,h2,h3,h4,h5,h6 {如果在用时Q有个别元素需要定义独立样式,你可以再加上新的定义Q可以覆盖老的定义Q例如:
h1 { font-size:2em; }当你用CSS来定义链接的多个状态样式时Q要注意它们书写的顺序,正确的顺序是Q?link :visited :hover :active。抽取第一个字母是"LVHA"Q你可以记忆?LoVe HAte"(喜欢讨厌)。ؓ什么这么定义,可以参考Eric Meyer的?a target="new">Link Specificity》?/p>
如果你的用户需要用键盘来控Ӟ需要知道当前链接的焦点Q你q可以定?focus属性?focus属性的效果也取决与你书写的位置Q如果你希望聚焦元素昄:hover效果Q你把:focus写在:hover前面Q如果你希望聚焦效果替代:hover效果Q你把:focus攑֜:hover后面?/p>
一个非常常见的CSS问题Q定位用Q动的时候,下面的层被Q动的层所覆盖Q或者层里嵌套的子层出了外层的范围?/p>
通常的解军_法是在Q动层后面d一个额外元素,例如一个div或者一个brQƈ且定义它的样式ؓclear: both。这个办法有一点牵强,q运的是q有一个好办法可以解决Q参看这文章?a target="new">How To Clear Floats Without Structural Markup?注:本站尽快翻译此??/p>
上面2U方法可以很好解xQ动超出的问题Q但是如果当你真的需要对层或者层里的对象q行clear的时候怎么办?一U简单的Ҏ是用overflow属性,q个Ҏ最初的发表在?a target="new">Simple Clearing of Floats》,又在?a target="new">Clearance》和?a target="new">Super simple clearing floats》中被广泛讨论?/p>
上面那一UclearҎ更适合你,要看具体的情况,q里不再展开。另外关于float的应用,一些优U的文章已l说得很清楚Q推荐你阅读Q?a target="new">Floatutorial》、?a target="new">Containing Floats》和?a target="new">Float Layouts?/p>
q是一个简单的技巧,但是值得再说一遍,因ؓ我看见太多的新手问题都是问这个:CSS如何横向居中Q你需要定义元素的宽,q且定义横向的marginQ如果你的布局包含在一个层(容器)中,pq样Q?/p>
你可以这样定义它横向居中:
#wrap {但是IE5/Win不能正确昄q个定义Q我们采用一个非常有用的技巧来解决Q用text-align属性。就象这P
body {W一个body的text-align:center; 规则定义IE5/Win中body的所有元素居?其他览器只是将文字居中) Q第二个text-align:left;是将#warp中的文字居左?/p>
因ؓ老版本浏览器不支持CSSQ一个通常的做法是使用@import技巧来把CSS隐藏h。例如:
@import url("main.css");然而,q个Ҏ对IE4不v作用Q这让我很是头疼了一阵子。后来我用这L写法Q?/p> @import "main.css";
q样可以在IE4中也隐藏CSS了,呵呵Q还节省?个字节呢。想了解@import语法的详l说明,可以看这里?a target="new">centricle’s css filter chart?/p>
有些时候,你需要对IE览器的bug定义一些特别的规则Q这里有太多的CSS技?hacks)Q我只用其中的两种ҎQ不微软在卛_发布的IE7 beta版里是否更好的支持CSSQ这两种Ҏ都是最安全的?/p>
另外一U方法,我认为比CSS Hacks更加l得赯验是采用微Y的私有属性条件注?conditional comments)。用q个Ҏ你可以给IE单独定义一些样式,而不影响L式表的定义。就象这P
<!--[if IE]>当调试CSS发生错误Q你p象排版工人,逐行分析CSS代码。我通常在出问题的层上定义一个背景颜Ԍq样p很明昄到层占据多大I间。有些h用borderQ一般情况也是可以的Q但问题是,有时候border 会增加元素的寸Qborder-top和boeder-bottom会破坏纵向margin的|所以用background更加安全些?
另外一个经常出问题的属性是outline。outline看v来象boederQ但不会影响元素的尺寸或者位|。只有少数浏览器支持outline属性,我所知道的只有Safari、OmniWeb、和Opera?/p>
在写CSS代码的时候,对于~进、断行、空|每个人有每个人的书写习惯。在l过不断实践后,我决定采用下面这L书写样式Q?/p>
selector1,
selector2 {
property:value;
}
当用联合定义时Q我通常每个选择器单独写一行,q样方便在CSS文g中找到它们。在最后一个选择器和大括号{之间加一个空|每个定义也单独写一行,分号直接在属性值后Q不要加I格?/p>
我习惯在每个属性值后面都加分P虽然规则上允许最后一个属性值后面可以不写分P但是如果你要加新样式时容易忘记补上分可生错误,所以还是都加比较好?/p>
最后,关闭的大括号}单独写一行?/p>
I格和换行有助与阅读?/p>
q好QOpera ?Firefox 都有相应的hackҎ?
Opera 提供了一?-o-text-overflow:ellipsis 来模拟CSS3中的 text-overflow:ellipsisQ郭爽的Blog里有一?span class="nobr">demo?
而FirefoxQ有A献了一个Firefox独有的XBL技术实?-- Simulating text-overflow on Firefox with unobtrusive JavascriptQ?博客的作者劝大家不要再花_֊d扑օ他针对Firefox的解军_法了Q因Z已经p了大量的旉都无法找C个满意的Ҏ。从
demo 源码中可以看到如下的CSS属性定?
text-overflow:ellipsis;
-moz-binding:url("moz-text-overflow.xml#XBLDocument");
从代码中看出Q这个解x案还需要一?xml 格式的XBLlg定义文g以及配套的一?js 文gQ其实我想也可以通过直接~写js 来实现相同的效果Q不q不如标题中所说的那么 unobtrusive 而已?
最后,一个兼容主浏览器?text-overflow CSS 定义可能如下Q?
.textOverflow {
overflow: hidden;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
-moz-binding: url("moz-text-overflow.xml#XBLDocument");/*配套对应的xml和js文g*/
}
公司的项目中需要显C由用户提供URI链接的图片,可是预先无法L囄的尺寸大,如果囄寸q大会影响面布局。最理想的解x案自然是自动生成~略图,涉及的后台工作较为复杂,用CSSq行控制是一个可以接受的捷径?
如果?width 属性强行设定显C尺怼乎太不智能。幸?Firefox/Opera/IE 7 都提供了 max-width 属性支持。假定希望图片显C宽度不过500像素QCSS可能如下Q?
fit-image { border : 0; max-width : 500px; }
让我痛恨?IE6 不支?max-width 属性,但是利用 IE 独有?expression 属性可以迂回的解决q个问题?
fit-image { border : 0; max-width : 500px; width: expression ( function(img){ img.onload=function(){ this.style.width = ''; this.style.width = (this.width > 500)?"500px":this.width+"px" }; return '120px' //加蝲时显C宽度ؓ120px }(this) ); }
利用<img> ?onload 事g使图片加载完成后计算其尺寸大,如果过500像素显CZؓ500像素Q否则显C其默认宽度?
expression 不是W合WEB标准的做法,不到万不得以不徏议用。但是不能不承认IE的很多扩展是不错的,IE不应该被轻视Q?
<script>
window.onload = function(){
var div = document.getElementById("test");
var s = div.currentStyle || window.getComputedStyle(div,'') || document.defaultView.getComputedStyle(div, '');
var p = s.width || s.getPropertyValue("width");
alert(p);
</script>