# 常见的布局方法

  • table 表格布局
  • float 浮动 + margin
  • inline-block 布局
  • flexbox 布局

# 表格布局

    <style>
        .left{
            background:red;
        }
        .right{
            background:blue;
        }
        table{
            width:800px;
            height:200px;
            border-collapse: collapse;
        }
    </style>
    <table>
        <tr>
            <td class="left"></td>
            <td class="right"></td>
        </tr>
    </table>

可以使用css的特性来模拟表格布局:

    <style>
      .table {
        height: 200px;
        width: 800px;
        display: table;
      }
      .table-row {
        display: table-row;
      }
      .table-cell {
        display: table-cell;
        vertical-align: middle;
      }
    </style>
    <div class="table">
        <div class="table-row">
            <div class="left table-cell"></div>
            <div class="right table-cell"></div>
        </div>
    </div>

# 盒模型

我们一般给元素设置宽高是对里面的内容(content)进行设置宽高;

display: inline-block,对外是inline元素,可以设置宽高。

position: absolute是脱离了文档流的。而relative是没有脱离,他本来的位置还是在的,不会被其他正常文档流元素进行占据。 fixed是根据可视区域的布局,他也是脱离了文档流。absolute是相对于最近父级的absolute或者relative进行定位的。定位为fixed、absolute、relative的元素 可以设置z-index属性。

# flexbox 布局

  • 弹性盒子
  • 盒子本来就是并列的
  • 指定宽度即可

并列布局。如果设置子元素的flex为1,那么就是说所有的子元素的宽度都是一样的,如果其中一个设置为2,那么就说明这个元素是其他元素的二倍。如果想要设置元素固定宽度:flex:none, width:30px这样。下面是简单的一个布局:

    <style>
        .container{
            width:800px;
            height:200px;
            display: flex;
        }
        .left{
            background: red;
            display: flex;
            width:200px;
        }
        .right{
            background: blue;
            display: flex;
            flex:1;
        }     
    </style>
    <div class="container">
        <div class="left"></div>
        <div class="right"></div>
    </div>

# float

  • 元素浮动
  • 脱离文档流
  • 但不脱离文本流(会影响其他元素中的文本会围绕这个浮动的元素)

对自身的影响:

  • 形成块(BFC):就是float可以设置宽高
  • 位置尽量靠上
  • 位置尽量靠左(右)

对兄弟元素的影响

  • 上面贴非float元素
  • 旁边贴float元素
  • 不影响其他块级元素位置
  • 影响其他块级元素内部文本

对父级元素的影响

  • 从布局上消失
  • 高度塌陷,在父级元素使用overflow进行防止。

清除浮动的方式:使用伪元素after,设置clear以及display跟visibility、height。

    <style>
        .container{
            background:red;
            width:400px;
            margin:20px;
        }
        .p1{
            background:green;
            float:left;
            width:200px;
            height:50px;
        }
        .container2::after{
            content: 'aaa';
            clear:both;
            display: block;
            visibility: hidden;
            height:0;
        }
        
    </style>
    <div class="container container2">
        <span>写几个字</span>
        <span class="p1">
            float
        </span>
        <span class="p1">
            float
        </span>
    </div>
    <div class="container" style="height:200px;background:blue;">
    </div>

float实现两栏布局:

<style>
.container{
  width:800px;
  height:200px;
}
.left{
  float: left;
  height: 100%;
  width: 200px;
}
.right {
  background: blue;
  margin-left: 200px;
  height: 100%;
}
</style>
<div class="container">
  <div class="left"></div>
  <div class="right"></div>
</div>

三栏布局:注意中间的元素下载最下面

    <style>
        .container{
            width:800px;
            height:200px;
        }
        .left{
            background:red;
            float:left;
            height:100%;
            width:200px;
            /* position: absolute; 也可以指定位置,高度需要显示指定百分比无效*/ 
            /* height:200px; */
        }
        .right{
            background:blue;
            float:right;
            width:200px;
            height:100%;
        }
        .middle{
            margin-left:200px;
            margin-right:200px;
        }
        
    </style>
    <div class="container">
        <div class="left"></div>
        <div class="right"></div>
        <div class="middle">
            中间
        </div>
    </div>

inline-block布局:

  • 像文本一样排block元素
  • 没有清除浮动等问题
  • 需要处理间隙

处理间隙,出现间隙就相当于两个文字之间是有空隙的。处理这个问题,只需要设置父元素的font-size为0,然后在各个子元素重新设置font-size

    <style>
        .container{
            width:800px;
            height:200px;
            font-size:0;
        }
        .left{
            font-size:14px;
            background:red;
            display: inline-block;
            width:200px;
            height:200px;
        }
        .right{
            font-size:14px;
            background:blue;
            display: inline-block;
            width:600px;
            height:200px;
        }
    </style>
    <div class="container">
        <div class="left"></div>
        <div class="right"></div>
    </div>

另外一种处理方式是:空隙产生的原因就是写html的时候的回车引起的

    <div class="container">
        <div class="left"></div><div class="right"></div>
    </div>
    <!-- 或者加一个注释 -->
    <div class="container">
        <div class="left"></div><!--  -->
        <div class="right"></div>
    </div>

# 响应式设计和布局

  • 在不同设备上正常使用
  • 一般主要处理屏幕大小问题

主要方法:

  • 隐藏 + 折行 + 自适应空间
  • rem、viewport、media query

下面的案例是通过判断屏幕的宽度进行隐藏元素:

    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        .container{
            margin:0 auto;
            max-width:800px;
            display: flex;
            border:1px solid black;
        }
        .left{
            display: flex;
            width: 200px;
            background:red;
            margin:5px;
        }
        /* max-width 宽度小于640px的时候起作用 */
        @media (max-width: 640px){
            .left{
                display: none;
            }
        }
        .right{
            display: flex;
            flex: 1;
            background:blue;
            margin:5px;
        }     
    </style>
    <div class="container">
        <div class="left">
            这里是一些不重要的内容,比如友情链接、广告
        </div>
        <div class="right">
            这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。这里是一些重要的内容,比如一篇文章,文章是整个页面的核心内容。
        </div>
    </div>

可以content="width=320"这种固定使用width的值,来达到等比例缩放的效果。 使用rem进行自适应,他根据最外层的字体大小,比如下面代码html为20px,那么就是代表 1个rem为20个像素。像素是固定大小的。写@media媒体查询的时候,范围大的放在上面

  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    html {
      font-size: 20px;
    }

    .container {
      margin: 0 auto;
      max-width: 800px;
      border: 1px solid black;
    }

    .intro {
      display: inline-block;
      width: 9rem;
      height: 9rem;
      line-height: 9rem;
      text-align: center;
      border-radius: 4.5rem;
      border: 1px solid red;
      margin: .3rem;
    }
    /* 在对应的屏幕宽度设置字体大小 */
    @media (max-width: 375px) {
      html {
        font-size: 24px;
      }
    }

    @media (max-width: 320px) {
      html {
        font-size: 20px;
      }
    }

    /* 如果是移动端设备的时候 每行只有一个就展示为block */
    @media (max-width: 640px) {
      .intro {
        margin: .3rem auto;
        display: block;
      }
    }
  </style>
  <div class="container">
    <div class="intro">
      介绍1
    </div>
    <div class="intro">
      介绍2
    </div>
    <div class="intro">
      介绍3
    </div>
    <div class="intro">
      介绍4
    </div>
  </div>

# CSS 面试真题

# 实现两栏(三栏)布局方法

  • 表格布局
  • float + margin 布局
  • inline-block 布局
  • flexbox 布局

# position的absolute、flex有什么不同

  • 前者相对最近的absolute或者relativ
  • 后者相对于屏幕(viewport)

# display:inline-block的间隙

  • 原因:字符间距
  • 解决:消灭字符或者消灭间距

# 如何清除浮动

  • 让盒子负责自己的布局。overflow:hidden(auto)
  • :: after{clear: both}

# 如何适配移动端页面

  • viewport
  • rem/viewport/media query
  • 设计上:隐藏 折行 自适应

评 论:

更新: 11/21/2020, 7:00:56 PM