CSS 页面布局总结

243 阅读3分钟

两栏布局(左右布局)

左列定宽,右列自适应 image.png

  • 方法1:利用float+margin实现
.left{
    float:left;
    width:100px;
    height:xxxpx;
}
.right{
    margin-left:100px;
    height:xxxpx;
}

<div>
   <div class="left">左列定宽</div>
   <div class="right">右列自适应</div>
 </div>
  • 方法2:flex布局
.parent{
    display:flex
}
.left{
    width:100px
}
.right{
    flex:1
}

<div class="parent">
    <div class="left">左列定宽</div>
    <div class="right">右列自适应</div>
</div>

实现最左最右布局

  • 第一种:父元素设置justify-content:flex-start ; 子元素设置 margin-left:auto

.box { 
   display: flex; 
   justify-content: flex-start; 
}
.block2 {
 margin-left:auto
}
  • 第二种:父元素设置justify-content:flex-end ;子元素设置 margin-left:auto

.box { 
   display: flex; 
   justify-content: flex-end; 
}
.block1 {
 margin-right:auto
}
<div class="box">
    <div class="block1">块1</div>
    <div class="block2">块1</div>
</div>

image.png

三栏布局 (左右固定宽度,中间自适应)

image.png

  • 方法1:flex布局

设置一个父div,添加样式display:flex。中间div设置flex:1, (flex是grow、shrink、basis的简写)通过项目属性flex-basis 设置left和right的固定宽度。

.main{
    width:100%;
    display:flex;
    flex-direction:row;
    justify-content:flex-start;
}
.left{
    width:200px;
    height:100%
}
.right{
    width:200px;
    height:100%
}
.middle{
    flex: 1;
    height:100%
}
<div class="main">
  <div class="left">1111</div>
  <div class="middle">2222</div>
  <div class="right">33333</div>
</div>
  • 方法2: 自身浮动法

自身浮动法的原理就是对左右分别使用float:left和float:right,float使左右两个元素脱离文档流,中间元素正常在正常文档流中。对中间文档流使用margin指定左右外边距进行定位。

该布局法的不足是三个元素的顺序,middle一定要放在最后,middle占据文档流位置,所以一定要放在最后。

.main{
    width:100%;
    height:200px;
}
.left{
    float:left;
    width:200px;
    height:100%;   
}
.right{
    width:200px;
    height:100%;
    float:right;
}
.middle{
    margin:0 200px;
    height:100%
}
<div class="main">
  <div class="left"></div>
  <div class="right"></div>
  <div class="middle"></div>
</div>
  • 方法3: 使用绝对定位

绝对定位法原理是将左右两边使用absolute定位,因为绝对定位使其脱离文档流,后面的middle会自然流动到他们上面,然后使用margin属性,留出左右元素的宽度,既可以使中间元素自适应屏幕宽度。 该法布局的好处,三个div顺序可以任意改变。

.main{
    position:relative;
    width:100%;
    height:200px;
}
.left{
    position:absolute;
    width:200px;
    height:100%;
}
.right{
    position:absolute;
    width:120px;
    height:100%;
}
.middle{
    margin:0 120px 0 200px;
    height:100%
}

<div class="main">
  <div class="left"></div>
  <div class="right"></div>
  <div class="middle"></div>
</div>

头尾固定高度中间高度自适应布局

要求:

1 头部固定高度,宽度100%自适应父容器;

2 底部固定高度,宽度100%自适应父容器;

3 中间是主体部分,自动填满,浏览器可视区域剩余部分,内容超出则中间部分出现流动条;

4 整个内容填满浏览器可视区域,并且不超出此区域!

  • 绝对定位(position:absolute)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<style>
   html, body {
        height:100%;
        margin:0;
        padding:0
    }
    header {
            width:100%;
            height:4rem;
            line-height:4rem;
            background:red;
            position:absolute;
            z-index:5;
            top:0;
            text-align:center;
     }
     #main {
            background:pink;
            width:100%;
            overflow:auto;
            top:4rem;
            position:absolute;
            z-index:10;
            bottom:4rem;
      }
     footer {
            height:4rem;
            line-height:4rem;
            background:yellow;
            width:100%;
            position:absolute;
            z-index:200;
            bottom:0;
            text-align:center;
      }
    </style>
</head>

<body>

<header>固定头部4rem</header>
<div id="main">
    <div class="mycontent">
        中间自适应部分<br>
        中间自适应部分<br>
        中间自适应部分<br>
        中间自适应部分<br> 
	</div>
</div>
<footer>固定尾部4rem</footer>
</body>
</html>
  • flex布局
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>flex布局实现</title>
    <style type="text/css">
        html,
        body {
            padding: 0;
            margin: 0;
            height: 100%;
            /*定义页面整体高度为100%,重要*/
        }
        
        .container {
            display: flex;
            /*父元素的定义为flex布局*/
            height: 100%;
            /*这里也要定义,重要*/
            width: 100%;
            flex-direction: column;
            /*定义排列方向为竖排*/
        }
        
        .header {
            height: 100px;
            /*头部固定高度*/
            text-align: center;
            background: red;
        }
        
        .footer {
            height: 100px;
            /*尾部固定高度*/
            text-align: center;
            background: yellow;
        }
        
        .main {
            background: #ccc;
            flex: 1;
            /*中间分配剩下的所有空间*/
            overflow: auto;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="header">我是头部</div>
        <div class="main">
            我是flex布局实现的中间自适应<br>
            我是flex布局实现的中间自适应<br>
            我是flex布局实现的中间自适应<br>
            我是flex布局实现的中间自适应<br> // 无数个
        </div>
        <div class="footer">我是尾部</div>
    </div>
</body>

</html>