zoukankan      html  css  js  c++  java
  • 几种高级布局的方式-前端

    一、文档流(normal flow)

    1、概念

    本质为normal flow(普通流、常规流)将窗体自上而下分成一行一行,块级元素从上至下、行内元素在每行中从左至右的顺序依次排放元素。
    v_hint:本质不存在文档流概念,当一个错误的概念被绝大数人认为是对的,那么它就是对的

    2、BFC(Block formatting context)

    块级格式化上下文,它是一个独立的渲染区域,只有Block-level box参与,它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

    3、BFC规则

    ① 内部的Box会在垂直方向,一个接一个地放置;
    ② Box自身垂直方向的位置由margin-top决定,属于同一个BFC的两个相邻Box的margin会发生重叠;
    ③ Box自身水平方向的位置由margin左或右决定(具体已经参照BFC方位),属于同一个BFC的两个相邻Box的margin会发生叠加。

    二、浮动布局

    float: 浮动布局, 改变BFC的参照方位
    为什么要使用: 使用它, 块级盒子就会同行显示

    1、解决的经典案例

    <style type="text/css">
        .box {
            width: 300px;
            border: 1px solid black;
        }
        .box img {
            width: 150px;
            float: left;
        }
    </style>
    <div class="box">
        <img src="bg.gif" alt="">
        浮动布局解决的经典案例。
    </div>

    2、基本语法

    float: left | right;  左 | 右 浮动
    left: BFC参照方向从左向右
    right: BFC参照方向从右向左

    3、浮动布局问题

     浮动的区域由父级的width决定

    浮动问题: 子级浮动了,不再撑开父级的高度, 那么父级如果拥有兄弟标签,可能就会出现布局重叠问题
    
    清浮动: 解决上面的问题, 通过使父级获取一个合适的高度, 这样子级就不会和父级的兄弟布局发生重叠
    
    clear: left | right | both

    4、清浮动

    • 目的:对父级所在容器中的Block-level Box布局不产生影响

    • 原理:在浮动布局情况下,让父级获得合适的高度

    ① 浮动的父级设置高度
    super {
        height: npx;
    }
    ② 浮动的父级设置overflow
    super {
        overflow: hidden;
    }
    ③ 浮动的父级兄弟设置clear
    brother {
        clear: left | right | both;
    }
    ④ 浮动的父级伪类清浮动
    super:after {
        content: "";
        display: block;
        clear: left | right | both;
    }

    conclusion:

    1.同一结构下, 如果采用浮动布局,所有的同级别兄弟标签都要采用浮动布局
    2.浮动布局的盒子宽度在没有设定时会自适应内容宽度

    三、流式布局

    1、解决的经典案例

    <style type="text/css">
        .wrap {
            max-width: 1200px;
            min-width: 800px;
            width: 90%;
            height: 600px;
            margin: 0 auto;
            background-color: orange;
        }
    </style>
    <div class="wrap"></div>

    2、流式布局相关操作

    1. 百分比 % | auto 自适应 | inherit(相关盒子的一些文本属性默认值为inherit(继承))
    2. vw | vh => max-width(height) | min-width(height)
    3. em(16像素) | rem

    四、定位布局

    可以通过上下左右四个方位完成自身布局的布局方式

    1、解决的经典案例

    <style type="text/css">
        .ad {
            width: 150px;
            height: 320px;
            background-color: orange;
            position: fixed;
            top: calc(50vh - 160px);
            left: 0;
        }
    </style>
    <div class="ad"></div>
    br*100

    2、定位的语法

    position: static | relative | absolute | fixed
    布局方位:left | right | top | bottom

    3、相对定位(relative)

    参考系: 自身原有位置
    position: relative;  => 打开了四个定位方位
    1.top|bottom|left|right都可以完成自身布局, 上下取上,左右取左
    2.left = -right | top = -bottom
    3.布局后不影响自身原有位置
    4.不脱离文档流

    4、绝对定位(absolute)

    参考系: 最近的定位父级
    position: absolute;  => 打开了四个定位方位
    1.top|bottom|left|right都可以完成自身布局, 上下取上,左右取左
    2.父级必须自己设置宽高
    3.完全脱离文档流

    5、固定定位(fixed)

    参考系: 页面窗口 公告,相对页面静止的导航栏 工具栏等等
    position: fixed;  => 打开了四个定位方位
    1.top|bottom|left|right都可以完成自身布局, 上下取上,左右取左
    2.相对于页面窗口是静止的
    3.完全脱离文档流
    4.z-index通常设置得很大

    6、z-index

    修改显示层级(在发生重叠时使用), 值取正整数, 值不需要排序随意规定, 值大的显示层级高

    五、Flex布局

    1、解决的经典案例

    <style type="text/css">
        .container {
            width: 600px;
            height: 600px;
            display: flex;
            flex-direction: column;
            border: 1px solid #333;
        }
        .it1, .it3 {
            flex-grow: 1;
            background-color: orange;
        }
        .it2 {
            flex-grow: 2;
            background-color: red;
        }
    </style>
    <div class="container">
        <div class="item it1"></div>
        <div class="item it2"></div>
        <div class="item it3"></div>
    </div>
    View Code

    2、目的

    • Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。

    设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。

    3、基本概念

    • 采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称”项目”。

    • 水平为轴(main axis),主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end。

    • 垂直为交叉轴(cross axis),交叉轴的开始位置叫做cross start,结束位置叫做cross end。

    • 项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

    4、容器属性

    ① flex-direction 属性 决定主轴的方向(即项目的排列方向)
    flex-direction: row | row-reverse | column | column-reverse;
    -- row(默认值):主轴为水平方向,起点在左端。
    -- row-reverse:主轴为水平方向,起点在右端。
    -- column:主轴为垂直方向,起点在上沿。
    -- column-reverse:主轴为垂直方向,起点在下沿。
    ​
    ② flex-wrap 属性 定义,如果一条轴线排不下,如何换行。
    flex-wrap: nowrap | wrap | wrap-reverse;
    -- nowrap(默认):不换行。
    -- wrap:换行,第一行在上方。
    -- wrap-reverse:换行,第一行在下方。
    ​
    ③ flex-flow 属性 是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。
    flex-flow: <flex-direction> <flex-wrap>;
    ​
    ④ justify-content 属性 定义了项目在主轴上的对齐方式。
    justify-content: flex-start | flex-end | center | space-between | space-around;
    ​
    ⑤ align-items 属性 定义项目在交叉轴上如何对齐。
    align-items: flex-start | flex-end | center | baseline | stretch;
    ​
    ⑥ align-content 属性 定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
    align-content: flex-start | flex-end | center | space-between | space-around | stretch;
    View Code

    5、项目属性

    ① order 属性 定义项目的排列顺序。数值越小,排列越靠前,默认为0。
    order: <integer>;
    ​
    ② flex-grow 属性 定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
    flex-grow: <number>; /* default 0 */
    ​
    ③ flex-shrink 属性 定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
    flex-shrink: <number>; /* default 1 */
    ​
    ④ flex-basis 属性 定义了在分配多余空间之前,项目占据的主轴空间(main size)。
    flex-basis: <length> | auto; /* default auto */
    ​
    ⑤ flex 属性 是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
    flex: <flex-grow> <flex-shrink> <flex-basis>
    ​
    ⑥ align-self 属性 允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
    align-self: auto | flex-start | flex-end | center | baseline | stretch;
    View Code
  • 相关阅读:
    【转】CUDA5/CentOS6.4
    【转】centos 6.4 samba 安装配置
    【转】Install MATLAB 2013a on CentOS 6.4 x64 with mode silent
    【转】Getting xrdp to work on CentOS 6.4
    【VLFeat】使用matlab版本计算HOG
    Unofficial Windows Binaries for Python Extension Packages
    March 06th, 2018 Week 10th Tuesday
    March 05th, 2018 Week 10th Monday
    March 04th, 2018 Week 10th Sunday
    March 03rd, 2018 Week 9th Saturday
  • 原文地址:https://www.cnblogs.com/wanlei/p/10104446.html
Copyright © 2011-2022 走看看