關於css實現右側固定寬度和左側寬度的自適應方法

來源:互聯網
上載者:User
這篇文章主要介紹了關於css實現右側固定寬度和左側寬度的自適應方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

這篇文章主要介紹了css實現右側固定寬度 左側寬度自適應,這種布局比較常見,部落格園很多預設主題就是這種。一般情況下,這種布局中寬度固定的地區是側邊欄,而自適應的地區是主體內容區——相信把側邊欄搞成自適應的人很少吧需要的朋友可以參考下

反過來也可以:左側寬度固定,右側自適應。不管是左是右,反正就是一邊寬度固定,一邊寬度自適應。

這種布局比較常見,部落格園很多預設主題就是這種。一般情況下,這種布局中寬度固定的地區是側邊欄,而自適應的地區是主體內容區——相信把側邊欄搞成自適應的人很少吧?

要實現這種布局,也算比較簡單。我們先給出html結構:

<p id="wrap">  <p id="sidebar" style="height:240px;">固定寬度區</p>  <p id="content" style="height:340px;">自適應區</p></p><p id="footer">後面的一個p,以確保前面的定位不會導致後面的變形</p>

代碼中的#wrap的p,是用來包裹我們要定位的這兩個區的;他後面還有個#footer,用來測試在前面的定位搞定後會不會導致後面的p錯位——如果錯位了,那證明我們的定位方法必須改進。

下面列舉幾個常見的方法:

1,固定寬度區浮動,自適應區不設寬度而設定 margin

我們拿右邊定寬左邊自適應來做示範,CSS代碼如下:

#wrap {    overflow: hidden; *zoom: 1;  }  #content ,#sidebar {    background-color: #eee;   }  #sidebar {    float: right; width: 300px;  }  #content {    margin-right: 310px;  }  #footer {background-color: #f00;color:#fff; margin-top: 1em}

其中,sidebar讓他浮動,並設定了一個寬度;而content沒有設定寬度。

大家要注意html中必須使用p標籤,不要妄圖使用什麼p標籤來達到目的。因為p有個預設屬性,即如果不設定寬度,那他會自動填滿他的父標籤的寬度。這裡的content就是例子。

當然我們不能讓他填滿了,填滿了他就不能和sidebar保持同一行了。我們給他設定一個margin。由於sidebar在右邊,所以我們設定content的margin-right值,值比sidebar的寬度大一點點——以便區分他們的範圍。例子中是310.

假設content的預設寬度是100%,那麼他設定了margin後,他的寬度就變成了100%-310,此時content發現自己的寬度可以與sidebar擠在同一行了,於是他就上來了。

而寬度100%是相對於他的父標籤來的,如果我們改變了他父標籤的寬度,那content的寬度也就會變——比如我們把瀏覽器視窗縮小,那wrap的寬度就會變小,而content的寬度也就變小——但,他的實際寬度100%-310始終是不會變的。

這個方法看起來很完美,只要我們記得清除浮動(這裡我用了最簡單的方法),那footer也不會錯位。而且無論content和sidebar誰更長,都不會對布局造成影響.

但實際上這個方法有個很老火的限制——html中sidebar必須在content之前!

但我需要sidebar在content之後!因為我的content裡面才是網頁的主要內容,我不想主要內容反而排在次要內容後面。

但如果sidebar在content之後,那上面的一切都會化為泡影。

可能有的人不理解,說你幹嘛非要sidebar在後面呢?這個問題說來話長,反正問題就是——content必須在sidebar之前,但content寬度要自適應,怎麼辦?

下面有兩個辦法,不過我們先把html結構改成我們想要的樣子:

<p id="wrap">  <p id="content" style="height:340px;">自適應區,在前面</p>  <p id="sidebar" style="height:240px;">固定寬度區</p></p>

2,固定寬度區使用絕對位置,自適應區照例設定margin

我們把sidebar扔掉,只對content設定margin,那麼我們會發現content的寬度就已經變成自適應了——於是content對sidebar說,我的寬度,與你無關。

content很容易就搞定了,此時來看看sidebar,他迫不得已拋棄了float。我們來看看sidebar的特點:在右邊,寬度300,他的定位對content不影響——很明顯,一個絕對主義分子誕生了。

於是我們的css如下:

#wrap {    *zoom: 1; position: relative;  }  #sidebar {    width: 300px; position: absolute; right: 0; top: 0;  }  #content {    margin-right: 310px;  }

這段css中要注意給wrap加上了相對定位,以免sidebar太絕對了跑到整個網頁的右上方而不是wrap的右上方。

好像完成了?在沒有看footer的表現時,我很欣慰。我們來把sidebar加長——增長100px!不要一年,只要一條內褲!哦,,,只要一句代碼。

但是,footer怎麼還是在那兒呢?怎麼沒有自動往下走呢?footer說——我不給絕對主義者讓位!

其實這與footer無關,而是因為wrap對sidebar的無視造成的——你再長,我還是沒感覺。

看來這種定位方式只能滿足sidebar自己,但對他的兄弟們卻毫無益處。

3,float與margin齊上陣

經過前面的教訓,我們重新確立了這個自適應寬度布局必須要達成的條件:

  • sidebar寬度固定,content寬度自適應

  • content要在sidebar之前

  • 後面的元素要能正常定位,不能受影響

由於絕對位置會讓其他元素無視他的存在,所以絕對位置的方式必須拋棄。

如果content和sidebar一樣,都用float,那content的自適應寬度就沒戲了;如果不給content加float,那sidebar又會跑到下一行去。

所以,最終我決定:float與margin都用。

我打算把content的寬度設為100%,然後設定float:left,最後把他向左移動310,以便於sidebar能擠上來。

但這麼一來content裡面的內容也會跟著左移310,導致被遮住了,所以我們要把他重新擠出來。為了好擠,我用了一個額外的p包裹住內容,所以html結構變成了這種樣子:

<p id="wrap">  <p id="content" style="height:140px;">    <p id="contentb">      content自適應區,在前面    </p>  </p>  <p id="sidebar" style="height:240px;">sidebar固定寬度區</p></p>

css則變成這樣:

#sidebar {    width: 300px; float: right;  }  #content {    margin-left: -310px; float: left; width: 100%;  }  #contentb {    margin-left: 310px;  }

這樣一改,真正的“content”就變成了contentb,他的寬度跟以前的content一樣,是100%-310.

大家可能注意到了代碼中的兩個margin-left,一個-310px一個310px,最後結合起來相當於什麼都沒幹,著實蛋疼。但他確實解決了content與sidebar的順序問題。

這個方法的缺點就是:太怪異,以及額外多了一層p。

4,標準瀏覽器的方法

當然,以不折騰人為標準的w3c標準早就為我們提供了製作這種自適應寬度的標準方法。那就簡單了:把wrap設為display:table並指定寬度100%,然後把content+sidebar設為display:table-cell;然後只給sidebar指定一個寬度,那麼content的寬度就變成自適應了。

代碼很少,而且不會有額外標籤。不過這是IE7都無效的方法。

———————割尾巴————————-

如果不考慮ie7及以下版本,則使用標準方法;如果不在意sidebar與content的順序,則用第一種方法;否則用第3種方法。

以上代碼都沒在IE6測試,有問題不負責解釋。個人覺得,讓IE6壽終正寢的辦法就是——從此不再理他。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.