厚積薄發 前端學習筆記 CSS基礎篇-左側固定,右側自適應(或右側固定,左側自適應)布局方法

這是我們經常可能會遇到到一種布局方法,或者是右側固定,左側自適應,下面列出我歸納總結的幾種方法,是實際開發中比較常用和實用的幾種方法

GitHub項目鏈接

寫在前面

歸納總結了幾種比較ok的方法,左右布局是基本功之一,雖然現在我們基本在開發中都會使用類似antd,element,iview這些前端ui框架,這些框架已經把傳統的布局樣式給封裝的很完美了,但是作為前端的css基礎,我認為這些也是必須掌握的,而且很有可能在實際開發過程中就遇到了呢

  • 方法一:左側div浮動 右側元素設置margin-left自適應
  • 方法二:左側div浮動,右側元素創建BFC
  • 方法三:左側div采用絕對布局,右側元素設置margin-left自適應
  • 方法四:外層父級元素使用table布局,子元素使用table-cell
  • 方法五:雙float + calc計算寬度
  • 方法六:flex布局

首先列出通用的css樣式
通用css樣式

.mainContent {
  /* 基本最外層父級元素,不需要做任何特殊處理,這里寫著,只是在實際開發中,外層肯定會有一個嵌套的父級元素 */
}

.main-1::after {
  /*通用css 用于清除浮動,使用浮動布局必然會涉及到清除浮動,這里我只用了最常用的方法,其余方法請讀者自行搜索*/
  content: "";
  clear: both;
  display: block;
  height: 0;
}

.leftDivCommon {
  /*左側布局通用樣式*/
  background: gray;
  width: 200px;
  height: 400px;
}

.rightDivCommon {
  /*右側布局通用樣式*/
  background: #feee;
  height: 300px;
}

方法一:左側div浮動 右側元素設置margin-left自適應

html

        <div>
          <h1>方法一:左側div浮動 右側元素設置margin-left自適應</h1>
          <div className="mainContent main-1">
            <div className="left-1 leftDivCommon">This is left</div>
            <div className="right-1 rightDivCommon">This is right</div>
          </div>
        </div>

css

.left-1 {
  float: left;
}

.right-1 {
  /* 第一種方法,右側元素必須寫margin-left,距離等于左側元素的寬度,
     因為左側元素已經浮動了,浮動元素是脫離文檔流的,如果不加這個margin,右側寬度和左側如果 
     一樣,就沒什么區別,如果右側寬度和
     左側不一樣的話,那么加上背景顏色后,會出現右側包裹左側的情況出現,
     就是因為左側元素脫離文檔流后,右側未浮動的元素會覆蓋文檔流當前的全部塊級
  */
  margin-left: 200px;
}

方法二:左側div浮動,右側元素創建BFC(關于BFC的詳細介紹,請讀者自行搜索,很多文章已經介紹的很清楚了)

html

        <div>
          <h1>方法二:左側div浮動,右側元素創建BFC</h1>
          <div className="mainContent main-1">
            <div className="left-2 leftDivCommon">This is left</div>
            <div className="right-2 rightDivCommon">This is right</div>
          </div>
        </div>

css

.left-2 {
  float: left;
}

.right-2 {
  /* 
    創建BFC的方法,BFC是一個上下文環境,創建方法如下
    float的值不為none
    position的值不為static或者relative
    display的值為 table-cell, table-caption, inline-block, flex, 或者 inline-flex中的其中一個
    overflow的值不為visible
  */
  overflow: auto;
}

方法三:左側div采用絕對布局,右側元素設置margin-left自適應

html

        <div>
          <h1>方法三:左側div采用絕對布局,右側元素設置margin-left自適應</h1>
          <div className="mainContent-3 main-1">
            <div className="left-3 leftDivCommon">This is left</div>
            <div className="right-3 rightDivCommon">This is right</div>
          </div>
        </div>

css

.mainContent-3 {
  position: relative;
  min-height: 400px;
}

.left-3 {
  /* 
    這個方法有兩個弊端,不建議采用這種方法
    - 必須規定外層父級元素的position是relative或者absolute
    - 采用絕對布局的方法的問題在于無法使用清除浮動讓最外層的父級元素把全部內容給包住,如果是浮動元素,可以在外層包裹標簽上寫清除浮動,
    這種方法要解決這個問題,只能在外層寫height來強制規定高度包含左側的高度,這種方法很不好,因為里面有可能還會包含一些其他的元素,需要精確計算好高度
  */
  position: absolute;
}

.right-3 {
  margin-left: 200px;
}

方法四:外層父級元素使用table布局,子元素使用table-cell

html

        <div>
          <h1>方法四:外層父級元素使用table布局,子元素使用table-cell</h1>
          <div className="mainContent-4">
            <div className="left-4 leftDivCommon">This is left</div>
            <div className="right-4 rightDivCommon">This is right</div>
          </div>
        </div>

css

.mainContent-4 {
  /*
  對table-cell元素設置百分比(如100%)的寬高值時無效的,但是可以將父元素設置display:table,
  再將父元素設置百分比寬高,子元素table-cell會自動撐滿父元素。這就可以做相對于整個頁面的水平垂直居中
  注意:
  (1)display: table時padding無效
  (2)display: table-row時margin、padding無效
  (3)display: table-cell時margin無效
  */
  display: table;
  width: 100%;
}

.left-4 {
  display: table-cell;
}

.right-4 {
  display: table-cell;
}

方法五:雙float + calc計算寬度

html

        <div>
          <h1>方法五:雙float + calc計算寬度</h1>
          <div className="mainContent main-1">
            <div className="left-5 leftDivCommon">This is left</div>
            <div className="right-5 rightDivCommon">This is right</div>
          </div>
        </div>

css

.left-5 {
  float: left;
}

.right-5 {
  float: left;
  width: calc(100% - 200px);
}

方法六:flex布局

html

        <div>
          <h1>方法六:flex布局</h1>
          <div className="mainContent-6 main-1">
            <div className="left-6 leftDivCommon">This is left</div>
            <div className="right-6 rightDivCommon">This is right</div>
          </div>
        </div>

css

.mainContent-6 {
  display: flex;
}

.left-6 {
  flex: 0 0 200px;
}

.right-6 {
  flex: 1;
}

寫在后面

網上關于左右基本布局的css樣式歸納也不在少數了,這里作為我個人學習記錄的一個總結,給大家分享,如果覺得對你有幫助,可以給我點個贊

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容