美文网首页前端
前端学习-布局

前端学习-布局

作者: 亲爱的大倩倩 | 来源:发表于2019-11-25 21:41 被阅读0次
    首先要知道盒子模型

    所有的HTML标签都是一个盒子,盒子会布置出不同的页面,但不同盒子的表现是不一样的,主要有两种盒子

    1. block块级盒子,块级元素使用了盒子模型的所有特性
    p,div,h1
    1. 尽可能扩大可利用的空间 - 宽度会填满父元素
    2. 独占一行
    3. 有width和height属性
    4. 使用 padding、margin 和 border 会影响其它元素的位置 -当改变元素自己的 padding 的时候,其它元素的位置也会发生变化
    
    2. inline box行内盒子,行内元素只使用了盒模型的部分特性
    span
    1. 不会单行显示,除非一行没有足够多的空间,它会一个接一个地排列
    2. width 和 height 属性不起作用
    3. padding、margin 和 border 会起作用,但不会影响其它元素
    
    3. 每种标签都有自己默认的显示方式,但可以通过 display 来修改标签的显示方式,例如把块级元素变成行内元素
    display: inline;
    display: block;
    
    块级元素使用了盒子模型的所有特性,而行内元素只使用了部分特性。一个完整的盒子模型如下:
    盒模型
    margin(外边距):它表示盒子之间的距离,可以通过 margin-top、margin-bottom、margin-left、margin-right 来控制各个方向的边距,它们可以为负值;
    border(边框):表示盒子的边框;
    padding(内边距):表示与内容之间的距离;
    content(内容):表示内容的大小;
    
    盒子模型有两种模式(标准模式和诡异模式),不同模式对于最终盒子的大小有所不同,默认情况下是标准模式,若设置了box-sizing: border-box则会变成诡异模式
    标准模式:设置的 width 和 height 是 content 的宽高
    盒子最终的宽 = 100+20+20+10+10 = 160px
    .std-box {
        width: 100px;
        padding: 20px;
        margin: 30px;
    }
    
    诡异模式:设置的 width 和 height 是盒子全部的宽高,也就是说内容 content 的宽需要减去 border 和 padding 的宽。
    .std-box {
        width: 100px;
        padding: 20px;
        border: 10px solid red;
        margin: 30px;
        box-sizing: border-box; 
    }
    
    前端七大布局

    默认布局是流式布局,只要不修改CSS的布局属性(display, float, position),那么HTML元素(每个元素都是一个盒子)就会按照默认的流式布局方式来摆放这些盒子
    可以通过 float、position 和 diplay 来控制 HTML 元素该如何显示
    同一个页面会有多种布局方式,衡量是不是一种好的布局是看它能不能在不同浏览器中正常显示,不同设备有没有错乱。目前网页设计遵循的规则是移动优先。

    '一句总结'
    
    '1. 流式布局'
    默认布局,每个元素的布局顺序与代码的顺序一致
    
    '2. position布局 -- position: relative;'
    可以使元素脱离流式布局,放到指定位置,类似与iOS通过坐标来控制元素的显示位置
    
    '3. float布局 -- float: right;'
    适合做左右布局的样式,可以设置是从左边或从右边开始布局,是一个挨一个的布局
    
    '4. flexbox布局 -- display: flex;'
    通过行或者列来布局子元素
    
    '5. grid布局 -- display: grid;'
    可以同时布局行和列
    
    '6. table布局 -- display: table;'
    可以做表格样式。但现在几乎不用,做布局时它有很多缺点,比如调试难。
    
    '7. muti-column布局'
    多列布局,布局的时候需要告诉浏览器有多少列,或者列的宽度,几乎不用
    

    HTML标签控制页面,CSS控制布局.一般只设置宽度(涉及到居中等), 高度是靠数据撑起来的

    *是设置页面默认样式,默认间距为0,每个组件的间距以各自设置为主
    *{
       padding: 0;
       margin:  0;
    }
    
    display:定义元素类型,none则不会显示,block块级元素前后带有换行符,inline内联元素,前后没有换行符
    position:规定元素的定位类型.设置布局类型
    border: 边框
    padding:元素内边距,元素内部展示内容距离元素边缘的上下左右距离
    margin:元素外边距,距离上下左右其他元素的距离
    id: 只能用于一个元素
    class:可以用于多个元素
    div:块
    span:行间样式
    
    流式布局

    默认的布局方式,一个个的盒子堆叠在一起
    适合于「文档类型」的 UI,它类似于写一个 word 文档,从上到下,一行一行进行排列。可以修改行内某个文字的样式,修改行与行之间的间距。
    主要有block和inline两种盒子

    1. 行内标签可以嵌套在块级标签中,反之则不可;
    2. 可以通过 display 修改标签属于块级标签还是行内标签;
    3. 块级类型的标签布局是每一个标签独占一行,而1行内标签会一个挨着一个进行布局;
    position布局
    1. 使用 css 中的 position 属性,可以让元素脱离流式布局,比如让某个文字固定在网页中的某个位置
    2. 为了更方便地把某个元素放到指定的位置.,使其按照自己特有的方式进行布局. 它提供了多个值 relative、absolute、fixed、sticky
    3. 设置position的时候,自身层级已经提高了0.5,这时也可以设置z-index属性,设置层级。

    position可以设置下面几个值

    1. static: 默认值,它遵循流水布局
    2. relative: 相对布局, position: relative 的作用就是在不打破流失布局的前提下,让元素移动到某一个位置。
    「不会破坏」默认的流式布局, 原来的流式布局仍会空出它的位置
    相对的基准是元素在流式布局的位置,会在原来位置的基础上,向你设置的方向偏移
    1. 关键点是「相对谁」,首先要确定元素的起点坐标是什么(起始位置就是元素在流式布局的位置)
    2. 然后通过 top、left、right、bottom 诉元素它距离起点坐标的位置,来修改元素的偏移位置
    3. 属性 top 和 bottom 、left 和 right 不能同时使用
    3. absolute: 绝对布局, position:absolute 的作用是控制某个元素在「布局区域」的位置,通常对某个元素使用 position 属性(值不为 static)来限制子元素的活动范围。
    「会破坏」默认的流式布局,原来的流式布局中没有它的位置
    相对的基准是最近一个使用 position 不为 static 的父元素,会在祖先元素内按照设置布局的从新布局,absolute 会找一个参照物来作为一个起点,参照物是祖先元素的 postion 属性,如果祖先元素没有设置postion 属性,会依据 html 标签为参考

    布局的关键点选择哪一个元素作为布局区域,如果元素的所有父元素均未设置 position 属性(值为 static),布局区域会选择可视区域。如果某个父元素使用了 position 属性(值不为 static),布局区域会选择这个父元素作为布局区域。这种效果有一种约束的感觉,会把子元素限制在父元素内部,不让其“乱跑”
    1.如果未设置top、bottom、left、right ,他还在原来的位置,但其他元素的位置已经变成流式布局中没有他的位置的样子
    2.top、bottom、left、right 可以同时使用,如果都设置为 0,此元素所有的父元素没有设置 position 属性时,它会填充满可视区域。如果它的父元素设置了 position 属性,它会填满父元素;

    4. fixed: 会把元素固定在某个位置上,比如把标题始终固定到顶部,无论如何滑动都不会改变其位置。
    5. sticky: 当滑动到某个位置时,让元素悬停在某个位置上
    flexbox布局

    display: flex;

    弹性布局,它可以通过父元素来控制子元素如何布局
    column的话,需要容器的高度大于所有 item 的高度才能看出效果



    开发中常见的场景是,一个div中有两个元素a和b,a要固定宽度,b要自适应,这时会用flex属性,对a元素设置flex:0 0 固定宽度;即可

    flex-container:布局容器,使用 display:flex 的标签;
    flex-item: 容器中的直接子元素;
    main-axis:主轴,布局方向为 row 或者 row-reverse 时它是水平方向。布局方向为 column 或者 column-reverse 时它是垂直方向。
    cross-axis: 纵轴,与主轴垂直的轴;
    main-start: 主轴的起点,布局方向为 row 时它的起点在左侧,row-reverse 为右侧。布局方向为 column 时起点在顶部,column-reverse 时起点为底部。
    main-end: 主轴结束的点,与 main-start 相反;
    cross-start: 纵轴的起点;
    cross-end:纵轴的结束点,与 cross-start 相反;
    
    会按照 row(行)或者 column(列)对容器中的子元素进行布局
    如果想让某些元素使用 flexbox 布局,首先需要指定它的父元素为一个 flexbox 容器,容器具有一些属性决定子元素如何摆放。每个子元素也具有自己的属性来决定自己如何展示。它具有「弹性」,子元素会根据父元素的尺寸来决定自己该占用多大的空间
    
    '1. 首先指定display: flex;'
    一旦指定这个 CSS 属性,它将变成 Flex 容器(flex container),它的「直接子元素」即可通过 flex 布局属性来控制其显示方式,这些「直接子元素」被称为 flex-item
    
    '2. 设置flex-container父元素属性 - 以「组」的形式来控制 item 的排列方式'
    影响主轴方向的flex-direction 
    决定主轴items对齐方式的justify-content
    决定纵轴items对齐方式的align-items
    决定超出容器后items的显示方式的flex-wrap
    direction和wrap合称的flex-flow
    多行时,纵轴方向的对齐方式的align-content
    
    flex-direction: 布局方向,它决定 flex-item 是从左到右、从右到左、从上到下、还是从下到上进行布局,它会影响主轴的方向,以及items 的布局起点位置。
                    row(默认):从水平方向的左侧开始布局;
                    row-reverse:从水平方向的右侧开始布局;
                    column:从垂直方向的顶部开始布局;
                    column-reverse: 从垂直方向的底部开始布局;
    
    justify-content: 决定「主轴」上items 的对齐方式
                     flex-start(默认):与主轴的起始位置(main start)对齐;
                     flex-end:与主轴的结束位置(main end)对齐;
                     center:居中于主轴;
                     space-around: 左右边距是中间的 1/2;
                     space-evenly: 每个 item 的间距相等;
                     space-between: 左右无边距;
    
    align-items:     决定「交叉轴」items 的对齐方式,flex-direction 会影响纵轴的方向,这一点需要注意,纵轴不一定是垂直方向,不能把 align-items 看做是控制垂直方向的对齐方式。它主要有以下几个值
                     flex-start(默认):与纵轴的起始位置(cross start)对齐;
                     flex-end:与纵轴的结束位置(cross end)对齐;
                     center:居中与纵轴;
                     baseline:与基线对齐;
                     stretch:扩展满纵轴;
                     align-content: 如果存在多行,将对多行进行对齐,如果只有一行将不起作用,它会影响 
    
    flex-wrap:       决定 items 超出容器后该如何显示,是否要多行显示。如果为多行显示,可以把每行看做是一个容器,图中主轴对齐方式为 space-around,则每行对齐方式都为 space-around
                     nowrap(默认):单行显示;
                     wrap:多行显示;
                     wrap-reverse:多行显示;
    
    align-content:   如果为「多行」时,它表示在「纵轴」方向的对齐方式。它的值与 justify-content 值相同。
    
    flex-flow:       它是 flex-direction 和 flex-wrap 的简写
    
    
    
    
    '3. 设置flex-item子元素中属性 - 「单独」控制自己该如何显示'
    
    order :           设置 item 的值可以改变它在 FlexBox 容器中的位置,控制显示顺序,默认值为 0,可以设置负数和整数。
    align-self:       对齐方式,它默认继承自父元素的 align-items 值,可通过这个属性来修改这个值
    
    '以下三个属性决定了 item 在「主轴」上的尺寸'
    
    flex-basis :     伸缩基准, 它表示 item 未扩展或收缩之前的宽度,可以理解为 item 未放入容器时该有的尺寸,默认值是 auto,它会影响剩余空间和不足空间的计算,它对 flex-grow 和 flex-shrink 有很大的影响
    
    flex-grow:        扩展比例,占剩余空间的比例,当所有的 item 未占满容器的宽度时,item 该如何扩充自己以填满容器的剩余空间,但是item 增长会受 max-width 的影响,增长后的最大长度只能是 max-width。
    
    flex-shrink :     收缩比例,当容器空间不足时该如何缩小子元素,当所有的 item 的宽度和大于容器的宽度,就会出现容器空间不足的情况,这时可以通过缩放比例来缩放每个 item 的宽度,但会受 min-content 的影响,也会受 min-width 的影响,缩到一定尺寸后它就不再进行缩放了。计算公式是flex-shrink * item基本尺寸(参见公众号)
    
    flex:             它是 flex-grow、flex-shrink 和 flex-basis 的缩写。
    flex:            initial(默认值),等同于 flex:0 1 auto;
    flex:            auto,等同于 flex: 1 1 auto;
    flex:            none,等同于 flex: 0 0 auto;
    flex:            1,等同于 flex: 1 1 0;
    
    flex-item 的默认属性。
    flex-grow:0,表示即使有剩余空间也不会扩展;
    flex-shink:1,如果空间不足将会缩小;
    flex-basis:auto,自动计算 item 的初始宽度,浏览器首先会看是否给 item 设置了宽度,代码中未设置则使用的是内容的宽度;
    
    flex-basis 最终的值会以 flex-basis -> width->content size 的属性依次确定它的值。
    
    🌰
    span:nth-child(3) {
        background-color: #FFC988;
        order: -1;
    }
    
    grid布局 -- display: grid;

    grid通常布局整个页面框架,框架内部使用 Flexbox 布局。
    FlexBox 布局只能同时控制所有的行,但如果我们想第一行主轴对齐方式为 space-around,第 2 行元素的对齐方式为 flex-start,FlexBox 布局做不到,grid 布局可以轻松实现
    grid 可以同时布局行和列,也就是说你可以指定一个容器是几行几列的

    grid-template-rows: 设置行尺寸
    grid-template-columns: 设置列尺寸
    row-gap:设置行间隔
    column-gap:设置列间隔
    上面用到的
    fr:是一个占比单位,占容器的比例;
    repeat(n, size) : 重复多少次,大小是多大;
    minmax(min, max) : 取值范围 >= min, <= max;
    auto:根据浏览器决定大小;

    
    
    '3. float布局 -- float: right;'
    
    
    

    相关文章

      网友评论

        本文标题:前端学习-布局

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