盒子模型

标准盒模型、IE盒模型的区别

  • 标准盒子模型中,盒子的width 和 height 指的是内容区域的宽度和高度。增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸。
  • IE盒子模型中,盒子的width 和 height 指的是内容区域+border+padding的宽度和高度。

通过设置可以改变这两种盒子模式

  1. // 标准盒模型
  2. box-sizing: content-box;
  3. // IE盒模型
  4. box-sizing: border-box;

默认为标准盒模型
image.png

计算出box盒子的offsetWidth的值

offsetWidth = content + border + padding

  1. <style>
  2. .box{
  3. width:100px;
  4. height:100px;
  5. border:1px;
  6. padding:10px;
  7. margin:10px;
  8. }
  9. </style>
  10. <div class="box">
  11. </div>

计算offsetWidth为100+20+2 = 122;
如果要让offsetWidth的值为100,怎么解决?

  1. <style>
  2. .box{
  3. width:100px;
  4. height:100px;
  5. border:1px;
  6. padding:10px;
  7. margin:10px;
  8. + border-sizing:border-box;
  9. }
  10. </style>
  11. <div class="box">
  12. </div>

设置border-sizing:border-box;

盒子(BFC)边距重叠解决方案

BFC(Block Formatting Context):块级格式化上下文。解决边距重叠的问题。是一块独立的渲染区域,内部内容和外部互不影响

如何触发BFC

  • 根元素
  • float属性不为none
  • position为absolute或fixed
  • display为inline-block, table-cell, table-caption, flex, inline-flex
  • overflow不为visible(常用)

    自适应两栏布局

    1. <style>
    2. body {
    3. width: 300px;
    4. position: relative;
    5. }
    6. .aside {
    7. width: 100px;
    8. height: 150px;
    9. float: left;
    10. background: #f66;
    11. }
    12. .main {
    13. height: 200px;
    14. background: #fcc;
    15. }
    16. </style>
    17. <body>
    18. <div class="aside"></div>
    19. <div class="main"></div>
    20. </body>

    会产生main左边和aside左边重叠,让main的宽度变化,解决办法,给main块设置为BFC

    1. .main{
    2. overflow:hidden;
    3. }

    清除内部浮动

    1. <style>
    2. .par {
    3. border: 5px solid #fcc;
    4. width: 300px;
    5. }
    6. .child {
    7. border: 5px solid #f66;
    8. width:100px;
    9. height: 100px;
    10. float: left;
    11. }
    12. </style>
    13. <body>
    14. <div class="par">
    15. <div class="child"></div>
    16. <div class="child"></div>
    17. </div>
    18. </body>

    内部child的浮动会让par块的高度失效,高度塌陷。解决办法是将par元素设置为BFC

    1. .par{
    2. overflow:hidden;
    3. }

    防止margin重叠

    1. <style>
    2. p {
    3. color: #f55;
    4. background: #fcc;
    5. width: 200px;
    6. line-height: 100px;
    7. text-align:center;
    8. margin: 100px;
    9. }
    10. </style>
    11. <body>
    12. <p>Haha</p>
    13. <p>Hehe</p>
    14. </body>

    两个p之间的距离为100px,发生了margin重叠。
    解决办法:

    1. .wrap {
    2. overflow: hidden;
    3. }

    js获取dom高度

  • clientHeight: height + padding

  • offsetHeight: height + padding + border
  • scrollHeight: clientHeight + scrollTop,但是scrollHeight会包含隐藏内容的高度。
  • innerHeight: 浏览器window可视内容的高度
  • outerHeight: 浏览器整个高度window,包括书签等

    clientHeight

    image.png

    offsetHeight

    image.png

    scrollHeight: 元素内容的总高度,包含了隐藏内容的高度。

    image.png
    image.png

magin负值

  • margin-top和margin-left设置负值,元素会向上或向左移动
  • margin-right设置负值,右侧元素会左移,自身不受影响
  • margin-bottom设置负值,下方元素会上移,自身不受影响

    浮动float

    圣杯布局

    通过给父容器设置padding移动两侧的内容
    1. <body>
    2. <div id="header">#header</div>
    3. <div id="container">
    4. <div id="center"class="column">#center</div>
    5. <div id="left"class="column">#left</div>
    6. <div id="right"class="column">#right</div>
    7. </div>
    8. <div id="footer" class="clearfix">#footer</div>
    9. </body>
    ```css

    header,

    footer {

    background: rgba(29, 27, 27, 0.726); text-align: center; height: 60px; line-height: 60px; } / 设置两侧padding值 /

    container{

    padding: 0 200px; } .column { height: 200px; float: left; position: relative; }

left {

  1. width: 200px;
  2. background-color: aqua;
  3. margin-left: -100%;
  4. right: 200px;

}

right {

  1. width: 200px;
  2. background-color: wheat;
  3. margin-left: -200px;
  4. left: 200px;

}

center {

  1. width: 100%;
  2. background-color: tomato;

} .clearfix{ clear: both; }

  1. <a name="1Yy2v"></a>
  2. ### 双飞翼布局
  3. 通过margin设置两侧的内容位置<br />双飞翼是在center元素内部又**设置了一层inner-center的**元素并设置它的左右margin,而非圣杯布局的padding,来排除两边元素的覆盖
  4. ```html
  5. <body>
  6. <div class="col" id="center">
  7. <div id="inner-center">center</div>
  8. </div>
  9. <div id="left" class="col">left left left</div>
  10. <div id="right" class="col">right right right</div>
  11. </body>
  1. body{
  2. min-width: 500px;
  3. }
  4. .col{
  5. float: left;
  6. }
  7. #center{
  8. width: 100%;
  9. height: 200px;
  10. background: #ccc;
  11. }
  12. #inner-center{
  13. margin:0 190px;
  14. }
  15. #left{
  16. width: 190px;
  17. height: 200px;
  18. background-color: #00f;
  19. margin-left: -100%;
  20. }
  21. #right{
  22. width: 190px;
  23. height: 200px;
  24. background-color: #f0f;
  25. margin-left: -190px;
  26. }

清除浮动clearfix

  1. .clearfix:after{
  2. content:'';
  3. display:table;
  4. clear:both;
  5. }

定位position

absolute和relative依据什么定位

  • relative依据自身定位
  • absolute依据最近一层的定位元素定位(absolute、fixed、relative)

居中对齐的方式

水平居中

  • inline元素:text-align:center;
  • block元素:margin:auto;
  • absolute:left:50%+ margin-left:负值

    垂直居中

  • inline元素:line-height的高度等于height的值

  • absolute: top:50%+ margin-top:负值
  • absolute: transform(-50%, -50%)
  • absolute: (top/left/right/bottom)=0 + magin:auto

多行文字垂直居中

  1. <div class="box">
  2. <span>执行async函数,返回的是Promise对象执行async函数,返回的是Promise对象执行async函数,返回的是Promise对象</span>
  3. </div>

line-height与vertical-align

  1. .box{
  2. width: 200px;
  3. height: 200px;
  4. border: 1px solid #ccc;
  5. line-height: 200px;
  6. text-align: center;
  7. }
  8. .box span{
  9. line-height: 22px;
  10. display: inline-block;
  11. vertical-align: middle;
  12. }

transform: translateY

  1. .box{
  2. width: 200px;
  3. height: 200px;
  4. border: 1px solid #ccc;
  5. line-height: 200px;
  6. text-align: center;
  7. }
  8. .box span{
  9. line-height: 22px;
  10. display: inline-block;
  11. position: relative;
  12. top:50%;
  13. transform: translateY(-50%);
  14. }

display:flex;

  1. .box{
  2. width: 200px;
  3. height: 200px;
  4. border: 1px solid #ccc;
  5. text-align: center;
  6. display: flex;
  7. align-items: center;
  8. }

响应式布局

各种单位

  • px:绝对长度单位
  • em:相对长度单位,相对于父元素
  • rem:相对长度单位,相对于根元素,常用于响应式布局

    vh和vw视口的尺寸1%

  • window.screen.height:屏幕大小的高度

  • window.innerHeigth:网页视口的高度
  • document.body.height:DOM结构body的高度

Snipaste_2020-10-11_11-35-40.png
window.screen.height = 667
window.innerHeight = 553 (网页视口高度,去除掉浏览器的头和尾)

media-query媒体查询

移动端使用js设置html的font-size

  1. // 计算移动端rem
  2. ;(function (doc, win, undefined) {
  3. var docEl = doc.documentElement,
  4. resizeEvt = 'orientationchange' in win? 'orientationchange' : 'resize',
  5. recalc = function () {
  6. var clientWidth = docEl.clientWidth;
  7. if (clientWidth === undefined) return;
  8. docEl.style.fontSize = 10 * (clientWidth / 750) + 'px';
  9. };
  10. if (doc.addEventListener === undefined) return;
  11. win.addEventListener(resizeEvt, recalc, false);
  12. doc.addEventListener('DOMContentLoaded', recalc, false)
  13. })(document, window);

flex弹性布局

https://juejin.cn/post/6938292463605907492
flex布局要设置父/子盒子。

父级盒子设置

如果要设置flex布局,首先要把父级盒子设置为display:flex;这样位于该盒子下的元素才能应用弹性flex布局。

属性包含:

  • flex-direction:用来定义item子元素排列方向
  • flex-wrap:定义item排列时,是否换行
  • flex-flow:是flex-direction和flex-wrap的缩写,默认为row nowrap
  • justify-content:定义item在主轴上的对齐方式
    • flex-start(默认值):左对齐
    • flex-end:右对齐
    • center: 居中
    • space-between:两端对齐,项目之间的间隔都相等。
    • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
  • align-items:定义item在交叉轴上对齐方式
    • flex-start:交叉轴的起点对齐。
    • flex-end:交叉轴的终点对齐。
    • center:交叉轴的中点对齐。
    • baseline: 项目的第一行文字的基线对齐。
    • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
  • align-content:定义多个轴线的对齐方式,item要换行。如果是单个轴线,该属性不起作用。

    • flex-start:与交叉轴的起点对齐。
    • flex-end:与交叉轴的终点对齐。
    • center:与交叉轴的中点对齐。
    • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
    • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
    • stretch(默认值):轴线占满整个交叉轴

      子层级设置

      item子盒子的属性设置

  • order:定义排列的顺序,越小越靠前。默认为0

  • flex-grow:定义item的放大比例。默认为0,表示默认不放大。
  • flex-shrink:定义item的缩小比例,默认1,表示剩余空间不足时,该项目将缩小
  • flex-basis:定义item在分配剩余空间之前,item占主轴空间大小。默认值auto,表示原来的大小(width/height),如果该项目未指定大小,则大小有内容决定。
    • auto 表示项目的本来大小,当设置为 auto 时会根据主轴方向检索该 flex-item**width****height** 值作为 **flex-basis** 的值。如果 widthheight 值为 auto,则 flex-basis 设置为 content,也就是基于 flex 的元素的内容自动调整大小。
    • 0 相当于指定了宽度或高度(宽度或高度由主轴方向决定)为 0。
  • flex:是flex-grow,flex-shrink,flex-basis的组合形式。默认inital为0 1 auto,只会缩小不会放大。设置auto时为1 1 auto,可以自动放大缩小。
  • align-self:允许单个项目可与其他item有不同的对齐方式。默认为auto,表示继承了父级的align-items。
    • auto
    • flex-start
    • flex-end
    • center
    • baseline
    • stretch

flex简写的三个属性【应用在子级】

flex-grow/flex-shrink/flex-basis三个属性的作用:定义了父级不同宽度下,子元素是如何布局空间的。

1. flex-basis:basis<主要,基础>

当子元素设置了width或者height,遇到basis后,要以basis为主。basis的权重级别最高。

2.flex-grow:扩展,放大

当父元素的宽度大于所有子元素宽度和,并且父元素宽度有剩余,可以定于子元素伸长,放大。

3.flex-shrink:缩小,收缩

当父元素的宽度小于所有子元素宽度和,并且大于父元素。那么可以设置子元素进行缩小。

Flex项目中使用 flex 属性可以根据Flex容器的可用空间对自身做伸缩计算,其包含三个子属性: flex-basis 、 flex-shrink 和 flex-grow 。这几个属性都有其初始值:

  • flex-grow 的初始值为 0
  • flex-shrink 的初始值为 1
  • flex-basis 的初始值为 auto

即 flex 的三个子属性: flex-grow (扩展比率)、 flex-shrink (收缩比率)和 flex-basis (伸缩基准)。这三个属性可以控制Flex项目,具体的表现如下:

  • flex-grow :设置Flex项目的扩展比率,让Flex项目得到(扩展)多少Flex容器剩余空间(Positive Free Space),即Flex项目可能会变大
  • flex-shrink :设置Flex项目收缩比率,让Flex项目减去Flex容器不足的空间(Negative Free Space),即Flex项目可能会变小
  • flex-basis :Flex项目未扩展或收缩之前,它的大小,即指定了Flex项目在主轴方向的初始大小

flex 属性可以指定 1个值(单值语法)2个值(双值语法)3个值(三值语法)
单值语法:值必须为以下其中之一:

  • 一个无单位的数( ),比如 flex: 1 ,这个时候它会被当作 的值
  • 一个有效的宽度( width )值,比如 flex: 30vw ,这个时候它会被当作 的值
  • 关键词 none 、 auto 或 initial (即初始值)

双值语法:第一个值必须为一个无单位数值,并且它会被当作 的值;第二个值必须为以下之一:

  • 一个无单位的数( ),它会被当作 的值
  • 一个有效的宽度( width )值,它会被当作 的值

三值语法:

  • 第一个值必须是一个无单位数( ),并且它会被当作 的值
  • 第二个值必须是一个无单位数( ),并且它会被当作 的值
  • 第三个值必须为一个有效的宽度( width )值,并且它会被当作 的值

flex 属性的取值可以是:

  • auto :Flex项目会根据自身的 width 和 height 来确定尺寸,但Flex项目根据Flex容器剩余空间进行伸缩。其相当于 flex: 1 1 auto
  • initial :Flex项目会根据自身的 width 和 height 来设置尺寸。它会缩短自身以适应Flex容器,但不会伸长并吸收Flex容器中的额外剩余空间来适应Flex容器。其相当于 flex: 0 1 auto
  • none :Flex项目会根据自身的 width 和 height 来设置尺寸。它是完全非弹性的(既不会缩短,也不会伸长来适应Flex容器)。其相当于 flex: 0 0 auto
  • :定义Flex项目的 flex-grow 属性,取值为
  • :定义Flex项目的 flex-shrink 属性,取值为
  • :定义Flex项目的 flex-basis 属性。若值为0 ,则必须加上单位,以免被视作伸缩性

多层滚动条问题

业务开发中,由于列表元素很多,往往会出现滚动条。
image.png
box高度固定,a区域的高度值不定,b区域的高度要子适应填满box剩余的高度,并且只有b可以显示滚动条,box不可以显示滚动条。
此时非常适合使用弹性盒子布局。让b区域自动适应剩余高度值。
注意⚠️区别flex: 1 1 auto和flex: 1 1 0; 上文flex-basis详解。
给b设置flex: 1 1 auto时,表示高度值会依赖b区域内容的实际高度。
给b设置flex: 1 1 0时,表示高度值会自动适应box剩余的高度。
示例:https://codepen.io/shenshuai/pen/VwmgEJj

实现骰子的五点布局

微信截图_20200906092332.png

  1. <div class="box">
  2. <div class="column">
  3. <span class="pip"></span>
  4. <span class="pip"></span>
  5. </div>
  6. <div class="column">
  7. <span class="pip"></span>
  8. </div>
  9. <div class="column">
  10. <span class="pip"></span>
  11. <span class="pip"></span>
  12. </div>
  13. </div>
  1. /* 重要内容
  2. 实现步骤:
  3. 1:让三个column竖向排列
  4. 2:让column的内容是flex布局,并且默认的横向排列,内部的原点为两端分布
  5. 3:让第二个column原点居中对齐
  6. */
  7. .box{
  8. display: flex;
  9. flex-direction: column;
  10. }
  11. .box .column {
  12. display: flex;
  13. justify-content: space-between;
  14. }
  15. .box .column:nth-of-type(2) {
  16. justify-content: center;
  17. }
  18. body {
  19. display: flex;
  20. align-items: center;
  21. justify-content: center;
  22. vertical-align: center;
  23. flex-wrap: wrap;
  24. align-content: center;
  25. font-family: 'Open Sans', sans-serif;
  26. background: linear-gradient(top, #222, #333);
  27. }
  28. .box {
  29. margin: 16px;
  30. padding: 4px;
  31. background-color: #e7e7e7;
  32. width: 104px;
  33. height: 104px;
  34. object-fit: contain;
  35. box-shadow:
  36. inset 0 5px white,
  37. inset 0 -5px #bbb,
  38. inset 5px 0 #d7d7d7,
  39. inset -5px 0 #d7d7d7;
  40. border-radius: 10%;
  41. }
  42. .pip {
  43. display: block;
  44. width: 24px;
  45. height: 24px;
  46. border-radius: 50%;
  47. margin: 4px;
  48. background-color: #333;
  49. box-shadow: inset 0 3px #111, inset 0 -3px #555;
  50. }

https://codepen.io/shenshuai/pen/RwaxGKv