美文网首页
CSS布局:float、position、flex、grid

CSS布局:float、position、flex、grid

作者: getElementsByMK | 来源:发表于2018-02-23 14:51 被阅读0次

CSS是前端基础技能之一,而CSS最重要的功能就是网站布局。
CSS布局方式有很多,从远古时代的table(表格)布局-->float(浮动)布局-->position(定位)布局-->flex(弹性)布局-->grid(网格)布局(还未正式推出),下面咱们简单谈一谈各种布局的用法及其优缺点。
table布局就是将网站当做一个表单来做,这里不做展开,因为现在基本不这么用了。

1.float

float:浮动。float刚开始并不是为了用来网页布局,而是用来解决图文信息中图片与文本冲突的问题的。
如下图:


image.png

这种常见的图文效果,没有float之前是很难达到的。有了float之后只需要加一个float:left,轻松搞定。

<style>
    .content{
        margin: 100px auto;
        width: 300px;
    }
    .box{
        float: left;
    }
</style>
<body>
    <div class="content">
        <div class="box"><img src="./imgs/authority-employee.png" alt=""></div>
        <div class="text">CSS(层叠样式表)是一种用来表现HTML或XML等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。有三种方法可以在站点网页上使用样式表:外部样式表、内部样式表和内联样式。</div>
    </div>
</body>

‘咦,如果float可以处理图文的问题,那用来布局不也可以吗?’,后来有人用float试着用于网页布局,还真的可以。
网页中最常见的布局如下:

网页常见布局.png

用float做

<style>
    body,ul,li{
        padding: 0;
        margin: 0;
        list-style: none;
    }
   .header{
       height: 100px;
       background-color: hotpink;
   }
   .nav{
        height: 100px;
        line-height: 100px;
        text-align: center;
   }
   .nav li{
       float: left;
       width: 100px;
       height: 100px;
       margin-left: 20px;
       background-color: yellowgreen;
   }
   .main{
       width: 1000px;
       height: 500px;
       margin: 0 auto;
   }
   .article{
       width: 800px;
       height: 500px;
       background-color:yellow; 
       float: left;
   }
   .aside{
       width: 200px;
       height: 500px;
       background-color:skyblue; 
       float: left;
   }
   .footer{
       height: 100px;
       background-color: greenyellow;
   }
</style>

<body>
    <!--头部start-->
    <div class="header">
        <!--导航start-->
        <ul class="nav">
            <li><a href="#">导航1</a></li>
            <li><a href="#">导航2</a></li>
            <li><a href="#">导航3</a></li>
        </ul>
        <!--导航end-->
    </div>
    <!--头部end-->

    <!--主体start-->
    <div class="main">
        <!--文章start-->
        <div class="article"></div>
        <!--文章end-->

        <!--侧边栏start-->
        <div class="aside"></div>
        <!--侧边栏end-->

    </div>
    <!--主体end-->

    <!--底部start-->
    <div class="footer"></div>
    <!--底部end-->
</body>

比table布局要方便不少,不过float随之而来的带来了 “浮动高度塌陷”的问题:
如果浮动元素的父元素没有设定高度,当其子元素浮动后,父元素就因为内部没有子元素撑起从而高度变为0;
引申:网页元素一般分为 普通流,浮动流,定位流。其中普通流和浮动流在一个层级上,定位流>浮动流>普通流。
之后为了解决这个问题搞出来一系列清除“浮动高度塌陷”的策略方法,非常麻烦。

2.position

position:定位;顾名思义,就是确定位置。position同样可以用做网页布局。

<style>
    body,ul,li{
        padding: 0;
        margin: 0;
        list-style: none;
    }
   .header{
       height: 100px;
       background-color: hotpink;
   }
   .nav{
        height: 100px;
        line-height: 100px;
        text-align: center;
        /*父元素用相对定位*/
        position: relative;
   }
   .nav li{
       /*子元素用绝对定位*/
       position: absolute;
       width: 100px;
       height: 100px;
       background-color: yellowgreen;
   }
   .nav li:nth-child(1){
       left: 20px;
   }
   .nav li:nth-child(2){
       left: 140px;
   }
   .nav li:nth-child(3){
       left: 260px;
   }
   .main{
       width: 1000px;
       height: 500px;
       margin: 0 auto;
       position: relative;
   }
   .article{
       width: 800px;
       height: 500px;
       background-color:yellow; 
   }
   .aside{
       width: 200px;
       height: 500px;
       background-color:skyblue; 
       position: absolute;
       top: 0;
       right: 0;
   }
   .footer{
       height: 100px;
       background-color: greenyellow;
   }
</style>

<body>
    <!--头部start-->
    <div class="header">
        <!--导航start-->
        <ul class="nav">
            <li><a href="#">导航1</a></li>
            <li><a href="#">导航2</a></li>
            <li><a href="#">导航3</a></li>
        </ul>
        <!--导航end-->
    </div>
    <!--头部end-->

    <!--主体start-->
    <div class="main">
        <!--文章start-->
        <div class="article"></div>
        <!--文章end-->

        <!--侧边栏start-->
        <div class="aside"></div>
        <!--侧边栏end-->

    </div>
    <!--主体end-->

    <!--底部start-->
    <div class="footer"></div>
    <!--底部end-->
</body>

同样的效果


image.png

不过position需要计算每一个元素的位置,而且这个位置是定死的,略显繁琐和笨重。实际上position我平常只用来定位一些小的标签之类的东西。position优点在于不像float那样会影响其他元素。
关键点:子绝父相。需要定位的元素用absolute绝对定位,其父元素用 relative相对定位。还有fixed固定定位,他是以html为父元素的定位。

3.flex(推荐)

flex:弹性;弹性布局很好的解决了float和position的问题,非常好用。
使用方法:
在父元素使用 display:flex;确定弹性作用的范围。
然后
justify-content:center(space-around,space-between等);水平方向布局;
align-items:center(flex-start,flex-end等);垂直方向布局;

<style>
    body,ul,li{
        padding: 0;
        margin: 0;
        list-style: none;
    }
   .header{
       height: 100px;
       background-color: hotpink;
   }
   .nav{
        height: 100px;
        line-height: 100px;
        text-align: center;
        display: flex;
   }
   .nav li{
       /*子元素用绝对定位*/
       width: 100px;
       height: 100px;
       margin-left: 20px;
       background-color: yellowgreen;
   }
   .main{
       width: 1000px;
       height: 500px;
       margin: 0 auto;
       display: flex;
   }
   .article{
       width: 800px;
       height: 500px;
       background-color:yellow; 
   }
   .aside{
       width: 200px;
       height: 500px;
       background-color:skyblue; 
   }
   .footer{
       height: 100px;
       background-color: greenyellow;
   }
</style>

<body>
    <!--头部start-->
    <div class="header">
        <!--导航start-->
        <ul class="nav">
            <li><a href="#">导航1</a></li>
            <li><a href="#">导航2</a></li>
            <li><a href="#">导航3</a></li>
        </ul>
        <!--导航end-->
    </div>
    <!--头部end-->

    <!--主体start-->
    <div class="main">
        <!--文章start-->
        <div class="article"></div>
        <!--文章end-->

        <!--侧边栏start-->
        <div class="aside"></div>
        <!--侧边栏end-->

    </div>
    <!--主体end-->

    <!--底部start-->
    <div class="footer"></div>
    <!--底部end-->
</body>

不过flex不兼容IE8及以下的浏览器。

4.grid(未正式推出)

大部分情况下flex布局已经能满足需要,不过flex只能用作一维布局,也就是说,flex一次只能作用于一条线。如果想要进行二维布局,必须翻转坐标二次弹性,这样会显得不够优雅,这时候grid(网格)布局就发展起来了。
grid布局用法和flex相似,但是作用于二维布局。
先在父元素使用 display:grid;确定网格作用范围;
然后
grid-template-columns: 40px 50px auto 50px 40px;(行)
grid-template-rows: 25% 100px auto;(列)
等等属性,这里只简单介绍,大家了解有这个东西就行。

在现实工作用,以flex为主,position辅助已经足够应对所有问题。

相关文章

  • css Grid布局

    Grid布局 css的布局方式主要有三种:float&position布局、flex布局、grid布局。 floa...

  • CSS布局:float、position、flex、grid

    CSS是前端基础技能之一,而CSS最重要的功能就是网站布局。CSS布局方式有很多,从远古时代的table(表格)布...

  • CSS布局属性

    CSS布局属性记录 display + float + position flex布局 总模块

  • CSS布局的那些事

    位置 移动 宽度和高度 即大小 css的"图层" BFC position float flex grid 容器的...

  • updating...

    CSS 1、三栏布局问题(左右固定宽度 中间自适应) flex grid float + margin 2、CSS...

  • CSS实现三栏布局

    CSS实现三栏布局(5种) 常见的布局方式: float布局、Position定位、table布局、弹性(flex...

  • 小程序CSS知识点

    一、flex布局Flex 布局教程:语法篇Flex 布局教程:实例篇 二、CSS position 属性总结CSS...

  • Flex 布局

    Flex布局 1 . 传统布局 display属性+position属性+float属性 --------垂直居中...

  • 前端开发-常见CSS布局

    常见的两列布局 float浮动布局 flex布局 常见的三列布局 float浮动布局 position定位 fle...

  • CSS-布局(float flex grid)

    布局前言 我们前面已经学过了文档流和盒模型,今天就要开始学新的知识CSS布局,希望对大家有所帮助。 不同的布局什么...

网友评论

      本文标题:CSS布局:float、position、flex、grid

      本文链接:https://www.haomeiwen.com/subject/hygtxftx.html