CSS特殊布局

BFC两栏布局

  • 页面实现两栏布局,左边区域设置为左浮动,右边区域不设置浮动效果
  • 当右边区域高度超过左边区域高度时,会出现右边区域来到左边区域的下方
  • 原因是右边区域不是BFC(块格式化上下文),把右边区域设置为BFC之后,即使右边区域高度高于左边区域,右边区域也不会到左边去
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>BFC两栏布局</title>
  <style>
    .left {
      width: 300px;
      height: 400px;
      float: left;
      background-color: red;
    }

    .main {
      height: 600px;
      background: yellow;
      /*将main设置为BFC格式*/
      overflow: auto;
    }
  </style>
</head>
<body>
<div class="left"></div>
<div class="main"></div>
</body>
</html>

三栏表格布局

  • 对父元素设置宽度为100%,设置display: table。子元素有三个元素,每个元素都设置display: tabel-cell
  • 设置左右两个元素固定的宽度,则中间的会自动适应宽度,自动的缩小或者扩大,始终保持与其他两个元素相邻
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>三栏表格布局</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    .wrapper {
      display: table;
      width: 100%;

    }

    .left, .main, .right {
      display: table-cell;
    }

    .left {
      width: 250px;
      background-color: aquamarine;
    }

    .right {
      width: 300px;
      background-color: bisque;
    }

    .main {
      background-color: orange;
    }
  </style>
</head>
<body>
<div class="wrapper">
  <aside class="left">
    <p>1</p>
    <p>2</p>
    <p>3</p>
  </aside>
  <aside class="main"></aside>
  <aside class="right"></aside>
</div>
</body>
</html>

三栏浮动布局

  • 对左右两个元素分别设置左浮动与右浮动,中间元素宽度设置为100%,则中间的元素会自动适应宽度置于中间
  • 但是,中间元素宽度高于左右两边的浮动元素,则中间元素的内容会向两边溢出
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>三栏浮动布局</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    .left, .main, .right {
      min-height: 200px;
    }

    .left {
      width: 250px;
      float: left;
      background-color: aquamarine;
    }

    .right {
      width: 300px;
      float: right;
      background-color: bisque;
    }

    .main {
      width: 100%;
      background-color: orange;
    }
  </style>
</head>
<body>
  <aside class="left"></aside>
  <aside class="right"></aside>
  <aside class="main"></aside>
</body>
</html>

三栏绝对定位布局

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>三栏绝对定位布局</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    aside {
      min-height: 100px;
      position: absolute;
    }

    aside.left {
      width: 250px;
      left: 0;
      background-color: aquamarine;
    }

    aside.right {
      width: 300px;
      right: 0;
      background-color: bisque;
    }

    .main {
      min-width: 50px;
      position: absolute;
      left: 250px;
      right: 300px;
      background-color: orange;
    }
  </style>
</head>
<body>
<aside class="left"></aside>
<aside class="right"></aside>
<main class="main">
  <h2>标题111</h2>
  <h2>标题111</h2>
  <h2>标题111</h2>
  <h2>标题111</h2>
</main>
</body>
</html>

三栏网格布局

  • 父元素使用grid布局,并且对列的宽度进行设置。页面共三栏,左右两栏固定宽度,中间的宽度根据两端的宽度自动调整
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>三栏网格布局</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    .wrapper {
      width: 100%;
      display: grid;
      grid-template-columns: 300px 1fr 300px;
    }

    .left {
      background-color: orange;
    }

    .right {
      background-color: aquamarine;
    }

    .main {
      background-color: antiquewhite;
    }
  </style>
</head>
<body>
<div class="wrapper">
  <aside class="left"></aside>
  <main class="main">
    <h1>表格布局</h1>
    <h1>表格布局</h1>
    <h1>表格布局</h1>
    <h1>表格布局</h1>
  </main>
  <aside class="right"></aside>
</div>
</body>
</html>

三栏flex布局

  • 父元素使用flex布局,对于三个子元素来说,左右两端的子元素固定宽度,中间的元素使用flex: 1属性,来进行弹性布局,根据左右宽度调整自身宽度
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>三栏flex布局</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    .wrapper {
      width: 100%;
      display: flex;
    }

    .left, .main, .right {
      min-height: 250px;
    }

    .left {
      background-color: orange;
      width: 300px;
    }

    .right {
      background-color: aquamarine;
      width: 300px;
    }

    .main {
      background-color: antiquewhite;
      flex: 1;
    }
  </style>
</head>
<body>
<div class="wrapper">
  <aside class="left"></aside>
  <main class="main">
    <h1>表格布局</h1>
    <h1>表格布局</h1>
    <h1>表格布局</h1>
    <h1>表格布局</h1>
  </main>
  <aside class="right"></aside>
</div>
</body>
</html>

圣杯布局

  • 圣杯布局首先有三个div元素,分别是main,left,right,这三个元素依次放在wrapper中
  • 首先对三个子元素设置相对定位于左浮动,对left与right设置宽度,main宽度为100%,这样的话main元素会占满整个wrapper元素,而left与right会被挤到下一行
  • 为了让left与right能与main显示在同一行,对wrapper设置左右内边距,分别为left与right的宽度
  • 但是设置内边距之后,wrapper整个宽度变小,left与right仍然在下一行。对left进行设置,设置left的左外边距为100%,这样left移动到与main的起点对齐,但是这样盖住了main的部分内容,于是需要将left向左移动,移动距离为之前设置的左内边距,使用left属性向左移动相对应的距离
  • right也是同样的道理,设置左外边距为right本身的宽度,再向右移动相应的距离,使用属性right
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>圣杯布局</title>
  <style>
    .left, .main, .right {
      min-height: 300px;
      /*圣杯布局代码*/
      float: left;
      position: relative;
    }

    .left {
      width: 200px;
      background-color: antiquewhite;
      /*圣杯布局代码*/
      margin-left: -100%;
      left: -200px;
    }

    .main {
      background-color: aquamarine;
      /*圣杯布局代码*/
      width: 100%;
    }

    .right {
      width: 300px;
      background-color: aqua;
      /*圣杯布局代码*/
      margin-left: -300px;
      right: -300px;
    }

    .wrapper {
      padding-left: 200px;
      padding-right: 300px;
    }

  </style>
</head>
<body>
<div class="wrapper">
  <div class="main">main</div>
  <div class="left">left</div>
  <div class="right">right</div>
</div>
</body>
</html>

双飞翼布局

  • 双飞翼布局与圣杯布局很相似,都是三个元素main,left,right。不同的是不使用相对布局,并且main元素中多了一个子元素main_inner元素用来存放中心的内容
  • 其余不变,只需要增加对main_inner添加左右外边距,分别为left与right的宽度
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>双飞翼布局</title>
  <style>
    .left, .main, .right {
      min-height: 300px;
      /*双飞翼布局代码*/
      float: left;
    }

    .left {
      width: 200px;
      background-color: antiquewhite;
      /*双飞翼布局代码*/
      margin-left: -100%;
    }

    .main {
      background-color: aquamarine;
      /*双飞翼布局代码*/
      width: 100%;
    }

    .right {
      width: 300px;
      background-color: aqua;
      /*双飞翼布局代码*/
      margin-left: -300px;
    }

    .main_inner {
      /*双飞翼布局代码*/
      margin-left: 200px;
      margin-right: 300px;
    }

  </style>
</head>
<body>
<div class="main">
  <div class="main_inner">main</div>
</div>
<div class="left">left</div>
<div class="right">right</div>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值