布局轉換 考驗CSS功底的時刻到來

2022-01-29 00:00:01 字數 4040 閱讀 5621

前幾天的時候在qq

群裡有一位朋友遇到了這樣乙個問題,是關於布局轉換的,在說這個問題之前,我希望給大家介紹一下什麼叫布局轉換。

首先我們經常會遇到這種布局:

我想大家一看就會想到外面乙個父級,裡面6

個子元素,一浮動,

ok了,只有腦子稍稍不正常的人才會用

position:absolute

定位乙個乙個定。我和大家想的也一樣,因此這樣乙個布局自然就出來了

1

<

ul id

="ul1"

class

="clear"

>

2<

li>1

li>

3<

li>2

li>

4<

li>3

li>

5<

li>4

li>

6<

li>5

li>

7<

li>6

li>8ul

>

對應的樣式為

1

.clear:after

2#ul1

3#ul1 li

這個時候,一切看起來都很好,但是如果來了這樣乙個需求:需要給這6個li

加乙個動畫,希望移入每個

li的時候從中間放大,類似這種效果

首先我們可以考慮一下做這個效果的思路:假如 li 

的寬和高都變成了原來的兩倍,但同時 

left 

和 top 

也變化了,

left 

在原來的基礎上減小的值是原來矩形寬度的一半,

top 

減小的值也是原來矩形高度的一半,這個時候,大家感覺到什麼問題了嗎?

我所有的 li 

都是浮動的,**來的

left

和top

啊?這時,一定馬上有人會有反應說:這還不簡單,改成定位唄。

但是大家想一想,這種布局適合定位嗎?如果定位的話,給每乙個li

設定left

和top

值,那將會是一件極其噁心的事情,因此答案一定是否定的。

既然想用浮動,又想獲取left

和top

的值,這怎麼辦呢?這個時候就需要用布局轉換,顧名思義,就是把浮動的布局轉換為定位的布局,從而方便我們拿到它們的

left

和top

值,很容易的能夠想到:

1     window.onload=function

()10 };

這時在瀏覽器當中預覽,我們就可以看到:

如果效果和我的一樣,那麼恭喜你,這種做法是錯誤的,很明顯,效果不是咱們想要的,那麼問題到底出在哪兒呢?

我們在這裡打乙個斷點(第7

行):

1     window.onload=function

()11 };

預覽之後發現乙個很詭異的介面:

1之後居然是

3,2跑到**去了?

我們在第7

行打了斷點之後,當迴圈進行第一遍時,

i的值為

0,也就是說此時我們為第1個

li設定了絕對定位,此時要注意,設定了絕對定位的元素是要脫離文件流的,何為脫離文件流?就是指元素會漂起來,因此,1

就會漂在

2 3 4 5 6

的上方,此時

1將會把

2遮住,所以我們就看不見

2了,此時你再獲取1的

offsetleft

和offsettop

,必然是

10(如果給

ul加了相對定位的話

),那麼為什麼他們最後都會擠到一塊兒呢?不要著急,按下

f8,放開現在的斷點,進入下次迴圈。

當進入第二次斷點之後,如下圖所示:

這時,根據我們上次的分析,相信大家對這次的結果心裡必然有底,因為給第2個li

加了absolute

,所以第二個

li飄起來,在

3 4 5 6

的上方,將

3遮住了,所以我們就看不見

3了,但是有人一定著急了,你那

2形狀怎麼那麼奇怪啊,好像錯出來一部分一樣,事實上不是這樣的,錯出來的那部分實際上不是別人,就是

1,不要忘了,我們在第一次斷點之後給

1設定了

left

和top

值,因此1就被定位定在那裡了,但是可能大家又會想,設定了

left

和top

值又怎樣呢,那不應該是相對於父級,也就是圖上黑色的邊框

left

和top

各10px

嗎?但是大家不要忘了,我們的li

可是有10px

的margin

啊,如果說到這裡還不明吧的話,可以看看下面這張圖:

我們的2和3實際上是在粉色的框那個位置,所以看起來就錯位了,這一塊可能稍微有些費解,請大家認真揣摩一下。

這樣一來,每次加完定位之後剩下的li都會往前面擠,然後當前li(正在脫離文件流的li)再被定到left:10px;top:10px的位置,就得到了最開始那幅6個li擠到了一起的圖。

說了這麼多了,那到底該如何解決這個問題呢?這時,我那位qq裡面的朋友就想出這樣一種辦法:

window.onload=function

() };

從上面的**中我們可以看出,他把position:absolute;放在了設定left和top後面,我們分析一下這樣做可以嗎?

很顯然還是不可以,為什麼呢?我們還是從for迴圈的第一次開始分析,第1個li我們為它設定了left和top值,很好,沒什麼問題,但是,馬上又給第1個li加了絕對定位,那第1個li馬上脫離文件流,2 3 4 5 6照樣還會擠過去,還會出現上面說的問題,因此,這樣做是不對的。

分析到這裡,相信大家已經有感覺了,都是定位惹的禍,也就是說這句話

ali[i].style.position="absolute";
放置的位置,成了關鍵。

那麼這句到底應該放在**呢?

我們應該有感覺了,只要在獲取到offsetleft和offsettop並賦值給left和top之後設定,這樣就很好了,所以出現了下面的解決方案:

for(var i=0;i)

for(var i=0;i)

從**中,我們可以看出來,我們將設定left和top與設定定位分開來放到兩個不同的塊級作用域當中了,這樣就將它們徹底分開了。

到現在為止,不要高興的太早,之前我們遺留下來乙個問題就是在第二次斷點的時候我們發現1和原來的位置相比錯位了,那這個錯位怎麼解決呢?

仔細想想這個錯位是怎麼來的呢?

是這樣的,left和top定位的時候定的是我們整體盒模型(在這裡就是指的margin),而不單單是從元素width height開始的那部分,但是offsetleft和offsettop在計算的時候,是將margin算上之後賦給left和top的,所以margin就相當於多算了一次,因此,我們還需要把多算的這次margin去掉,來讓li回到原來的位置。所以,最終的**應該是這樣:

for(var i=0;i)

for(var i=0;i)

CSS 常見的css布局

1 單列布局 主要使用max width屬性樣式實現,使用max width是為了當螢幕小於2000px時不出現滾動條 2 兩列自適應布局 兩列自適應布局是指一列由內容撐開,另一列撐滿剩餘寬度的布局方式,為了觸發ie瀏覽器的haslayout屬性,需設定zoom 1 2.1 使用float over...

簡單的css布局

對於初學者來說css的布局是至關重要的,這關係到整個網頁的外觀。乙個網頁的好壞其基礎就起源於此。以下是本人的隨文練習,較為粗糙,大神莫拍。html 左邊定寬200px 右邊自適應 著是乙個很簡單的兩列布局,左側定值,右側自適應。雖然看起來很簡單,但是其中涉及到margin的空間位移,譬如左側是將其先...

css布局的漂浮

css布局的漂浮 不怎麼用,了解一下,也寫不到 用到float屬性 有兩個屬性值 none 預設值。物件不漂浮。left 文字流向物件的右邊。right 文字流向物件的左邊。例1 漂浮.html aaaaaaaaaaaaa bbbbbbbbbbbbbb cccccccccccccc 效果 解釋 di...