網頁制作Poluoluo文章簡介:網頁布局教程:邊距和絕對定位.
這篇文章繼續前面發起的關於自動定位的話題,先前在描述關於自動定位的一些基本信息之後,我留下了一些可能用在布局中的方法,現在是時候討論元素定位的改進問題了。
玩弄絕對定位元素於股掌之間
首先,回憶一下自動定位是如何觸發的,設置絕對定位元素的left、top、right、bottom屬性為默認的“auto”值,而不是給定長度值。當屬性為“auto”值時,絕對定位元素不會參考任何定位的祖先元素,而是參照它作為靜態流動元素應該放置的“static”位置。它占據著該位置,但仍保持在一個單獨的層上,或許會疊加在文本流上。
一般情況下會很好,但真正這樣做會使我們失去對每一個邊距屬性的控制,當我們需要將AP元素放置到理想位置時,我們就需要正常的利用這些屬性了。如果AP元素的靜態位置碰巧與我們想讓其放置的位置不一致時,有一種可能的方法可以使自動定位元素發射偏移—-margin。
規則說明,margins在所有AP元素上都能工作,且不會與其它margin 折疊,這大大簡化了這種狀況,但是,有一個問題會導致混淆——AP元素作為內聯元素時,如span和link。
在起前一篇文章曾經提到忽略了邊距和補白的所有top和bottom屬性,但是,AP元素會執行所有的margins和paddings,及時他們是純粹的span和link。這是因為,AP元素會將其轉換成包含塊,或者更具體些—塊元素。
借助於margin使AP元素向四周移動,這看起來不錯,但當你參照前一篇文章中的自動定位演示頁,你會有一點陌生,這是演示頁:
view sourceprint?01.
<
p
>
02.
Vestibulum lacus tellus, adipiscing in, volutpat sit amet, dictum ac.
03.
Duis euismod
04.
sapien quis tellus. Vivamus aliquam, lorem a accumsan consequat, dolor
05.
est iaculis
06.
est, nec pulvinar magna ipsum at lacus. Duis aliquam. Sed mattis.
07.
Morbi ipsum
08.
ipsum, euismod ut, scelerisque quis, faucibus et, tortor. Sed aliquam
09.
erat vel justo.
10.
Etiam lacinia, massa a ultrices pellentesque,
11.
<
a
href
=
"#"
12.
class
=
"linkparent1"
>Link text<
span
>Tooltip text</
span
></
a
>
13.
dolor ante sagittis nibh, eget interdum ante lectus nec est. Fusce
14.
rutrum faucibus
15.
mauris. Aliquam cursus nisl at diam. Lorem ipsum dolor sit amet.
16.
</
p
>
17.
id="line17"
18.
.linkparent1 {
19.
color: #a00;
20.
}
21.
.linkparent:hover span {
22.
left: auto;
23.
} /* this hover on the link changes the nested span's left value to
24.
auto */
25.
.linkparent span {
26.
position: absolute;
27.
left: -999em;
28.
border: 1px solid white;
29.
background: #446;
30.
color: white;
31.
font-weight: bold;
32.
padding: 2px 4px;
33.
text-decoration: none;
34.
} /* tooltip may be custom styled as desired */
35.
.linkparent:hover {
36.
background: url(bgfix.gif);
37.
} /* Applies 1x1 transparent bgfix.gif on hover - IE hover bug fix */
當鼠標經過“link-text”時,AP出現在窗口之中,自動定位將其放在一個內聯span應該出現的位置上,即使span是絕對定位,並且是一個塊元素,就浏覽器而言,絕對定位的span元素像內聯元素那樣,同時它又是擁有諸如margin、padding和border等屬性的塊元素。
同時,回憶一下第二個演示頁,我給span特定的定義了“display:block”屬性,那樣,所有非IE浏覽器將span放置到新一行上,並且是從段落的左側開始。這樣,我們看到元素並無多大改變,而是對其自動定位屬性產生了影響。(IE除外)
這非常有趣,但一點也不影響我們的margin實驗。我只是讓你認識到這一點,因為有時候,它會在你毫不知情的情況下使你困惑。
Margins初探
我們想讓AP span彈出框的位置出現的第一點,更靠左一些,使其疊在父鏈接之上。這樣看起來更酷,而且他們重疊,確保用戶來回移動鼠標不會使彈出框消失。
這是同樣的demo,但是其top邊距向下移,right邊距左移,這樣就出現在父鏈接之前,增加以下代碼:
view sourceprint?1.
.first-offset-test span {
2.
margin-top
: .
8em
;
3.
margin-right
:
50px
;
4.
}
現在,鼠標經過鏈接文本時看到變化沒有?彈出層較以前下移了一些。不錯,但它並沒有向左移!Right邊距看來並未生效。讓我們從不同的方向試試--用負的left邊距代替正的right邊距。
view sourceprint?1.
.second-offset-test span {
2.
margin-top
: .
8em
;
3.
margin-left
:
-50px
;
4.
}
這是為什麼?負left邊距生效而正的right邊距屬性不生效?同樣為什麼top邊距也能生效?我們需要更好的demo去探討這個問題,下面是一個相對定位的盒子,四個絕對定位的子div借助其left、top、right、bottom屬性分別位於四個角落。
注意,由於存在四捨五入錯誤,在一些浏覽器中你會看到盒子的底部和右邊有1px的間隙,到目前為止,一切正常,現在讓我們添加一些邊距。
在下面的示例中四個不同的測試版本中,第一個box擁有left、top邊距,第二個擁有bottom、right邊距。剩下的兩個與前兩個相同但屬性值為負。
分析
你注意到這種模式沒有?只有在絕對定位元素的同一側應用margin和定位屬性值時margin才生效。實際上,在你定義了絕對定位元素的left屬性後,你可以定義margin-left屬性,這樣會生效,其它幾邊是一樣。
你或許會問,為什麼是這樣?一個有著嚴格尺寸的絕對定位box會通過兩個相鄰的屬性(left、top、right、bottom)與其他元素相毗鄰。余下的將被忽略或偏移你定義的尺寸大小。
既然只有絕對定位盒子的兩側與其他相聯系,當定義margin時,只有這兩側發生反應。其余的兩側被描述為“半拉子”,它們不觸及任何東西,在不干擾盒子聲明尺寸或已定義屬性值的一側的情況下,其margin屬性不產生任何推拉效果。很明顯,這種行為不是很好,這樣,那些無關的margin將被忽略。
當靜態位置是在從左到右的流中計算時,自動定位盒子看起來好像是由left和top屬性來決定的。這樣,在我們的演示頁中,right屬性不會生效,bottom也是一樣。
絕對定位盒子沒有尺寸時也沒什麼不同(僅僅用兩個相鄰的屬性來控制),因為在那種情況下,絕對定位盒子會在垂直和水平方向上收縮以適合內容,這樣是的盒子看起來好像被定義了尺寸,尺寸大小剛好與內容的大小相同。唯一的例外出現在絕對定位盒子由兩個相反屬性控制時。
試試半拉子
讓我們看看,你設置絕對定位盒子的left和right屬性為0,但不定義任何寬度。這樣盒子在其最近的定位的祖先元素中伸展直到填滿所有所有水平空間。現在,絕對定位盒子的兩側與另外一個元素相關,這樣,margin-left和margin-right將會生效,其值無論正負都有效,查看示例
正如你所看到的那樣,正值擠壓盒子的兩邊,而負值使盒子延伸出去。
需要牢記的是:IE6決不允許用兩個相反的屬性值來控制盒子的尺寸,這樣margin也不會生效,除非給絕對定位盒子定義尺寸。
總結
我希望討論能消除絕對定位盒子關於margin屬性的疑慮,一旦這些問題得到理解,它就不會很復雜。除了IE6的限制,希望bug越少越好。