盒子模型,你悟了吗?

盒子模型是css中很基础也是很核心的概念,然而你真的了解css的盒子模型吗?

能够游刃有余的在开发中合理运用盒子模型吗?

如果可以,请移步,嘿嘿.

没有就大家一起来探讨研究一下,共同进步.

盒子模型的作用

在开始研究前,先立个flag,我们要明白为什么说盒子模型很重要,因为css 的主要作用就是布局,布局在我看来说到底就是为了解决两个问题

  • 一个是把所有的元素都放在合理的位置上的方法,这里就要研究css 中的几种布局方式.
  • 另外一个就是研究如何给一个单独的html 元素设置更多的样式,这里就要探讨和研究盒子模型了.

盒子模型包含的内容

Html 中的 每一个元素 都可以看作是一个盒子,如下图所示,一个盒子具备这四个属性

  • 内容(content):

    元素的内容width/height

  • 内边距(padding):

    元素和内容之间的间距

  • 边框(border)

    元素自己的边框

  • 外边距(margin)

    元素和其他元素之间的间距

盒子模型的四边

因为 盒子有四边,所以margin/padding/border 都包含 top/right/bottom/left

内容-宽度和高度

内容宽度和高度的设置

  • 宽度设置:width

  • 高度设置:height

注意:对于行内级 非替换元素 来说,设置宽高是无效的(display属性为inline 的元素)

另外 我们还可以设置如下属性:

  • min-width:最小宽度 ,无论内容多少,宽度都大于或等于min-width

  • max-width:最大宽度 ,无论内容多少,宽度都小于等于max-width

移动端是配置时,可以设置最大宽度和最小宽度.

下面两个属性不常用:

  • min-height:最小高度,无论内容多少,高度都大于或等于min-height

  • max-height:最大高度,无论内容多少,高度都小于或等于max-height

内边距-padding

padding 属性 用于 设置盒子的内边距,通常用于设置边框和内容之间的间距

padding 包含四个方向,所以有如下的取值:

  • padding-top:上内边距
  • padding-right:右内边距
  • padding-bottom:下内边距
  • padding-left:左内边距

padding 单独编写是一个缩写属性:

padding-top,padding-right,padding-bottom,padding-left 的简写属性

pading 缩写属性是从零点钟方向开始 ,沿着顺时针方向转动 的,也就是上右下左

padding并非必须是四个值 ,也可以有其他值

padding值的个数 padding例子 代表的含义
4 padding: 10px 20px 30px 40px ; top:10px, right:20px,bottom:30xpx,left:40px;
3 padding:10px 20px 30px 缺少left,left 使用right的值;
2 padding:10px 20px; 缺少left,使用right的值;缺少bottom,使用top的值;
1 padding:10px; top/right/bottom/left 都使用 10;

边框-border

边框相对于content/padding/margin 来说特殊一些:

  • 边框具备宽度width;
  • 边框具备样式style;
  • 边框具备颜色color;

设置边框的方式

边框宽度

  • boder-top-width,border-right-width,border-bottom-width,border-left-width

  • border-width 是上面四个属性的简写属性

边框颜色

  • border-top-color,border-right-color,border-bottom-color,border-left-color

  • border-color 是上面4个属性的简写属性

边框样式

  • border-top-style,border-right-style,border-bottom-style,border-left-style

  • border-style 是上面4个属性的简写属性

边框的样式的设置值

边框的样式有很多,我们可以了解如下的几个:

  • groove:凹槽,沟槽,边框上看上去好像是雕刻在画布之内
  • ridge:山脊,和groove相反,边框看上去好像是从画布中凸出

边框的简写属性-border:同时设置边框的宽度,颜色和样式

如果我们相对某一边同时设置 宽度 样式 颜色,可以进行如下设置:

  • border-top
  • border-right
  • border-bottom
  • border-left
  • border: 统一设置4个方向的边框

边框颜色,宽度,样式的编写顺序任意

< line-width > .|.|. < line-style > .|.|. < color >

圆角 - border-radius

border-radius 用于设置盒子的圆角

border-radius 常见的值:

数值 :通常用来设置小的圆角,比如6px; 百分比:通常用来设置一定的弧度或者圆形

border-radius 事实上 是一个 缩写属性:

将这四个属性:border-top-radius,border-top-right-radius,border-bottom-radius,border-left-radius 简写为一个属性. 开发中比较少见一个个圆角设置.

如果一个元素是正方形,设置border-radius 大于等于50%时,就会变成一个圆.

外边距 -margin

margin 属性 用于设置盒子的外边距,通常用于设置元素和元素之间的间距.

margin 包括四个方向,所以有如下的取值:

  • margin-top:上内边距
  • margin-right:右内边距
  • margin-bottom:下内边距
  • margin-left:左内边距

margin 单独编写是一个缩写属性

margin-top,margin-right,margin-bottom,margin-left的简写属性.

margin缩写属性时从零点钟方向开始 ,沿着顺时针转动的,也就是上右下左.

margin值的个数 margin例子 代表的含义
4 margin: 10px 20px 30px 40px ; top:10px, right:20px,bottom:30xpx,left:40px;
3 margin:10px 20px 30px 缺少left,left 使用right的值;
2 margin:10px 20px; 缺少left,使用right的值;缺少bottom,使用top的值;
1 margin:10px; top/right/bottom/left 都使用 10;

上下margin的传递

margin-top传递

如果块级元素的顶部线和父元素的顶部线重叠 ,那么这个块级元素的margin-top值会传递给父元素

margin-bottom 传递 如果块级元素的底部线和父元素的底部线重叠,并且父元素的高度是auto ,那么这个块级元素的margin-bottom会传递给父元素

如何防止出现传递问题?

  • 给父元素设置padding-top\padding-bottom
  • 给父元素设置border
  • 触发BFC:设置voerflow 为 auto

最佳实践:

margin 一般是用来设置兄弟元素之间 的间距 padding 一般是用来设置父子元素之间的间距

上下margin 的折叠 - 高度塌陷

  • 垂直方向上相邻的2个 margin(margin-top,margin-bottom)有可能会合并为1个margin,这种现象叫做collapse(折叠)

  • 水平方向上的margin(margin-left,margin-right)永远不会collapse

  • 折叠后最终值的计算规则

    两个值进行比较,取最大的值

  • 如何防止magin collapse?

    只设置其中一个元素的margin

上下margin 折叠的情况

  • 两个兄弟块级元素 之间 上下margin的折叠
  • 父子块级元素 之间margin的折叠

外轮廓 - outline

外轮廓的特点

outline 表示元素的 外轮廓

  • 不占用空间

  • 默认显示在border的外边

outline 的相关属性

  • outline-wdith: 外轮廓的宽度
  • outline-style:取值跟border 的样式一样,比如solid,dotted
  • outline-color:外轮廓的颜色
  • outline:outline-width,outline-style,outline-color的简写属性,跟border用法类似

outline 的实际应用

去除a元素,input元素的focus轮廓效果

盒子阴影 - box-shadow

box-shadow 属性的特点

box-shadow 属性 可以设置一个或多个阴影

  • 每个阴影 用 < shadow >表示
  • 多个阴影之间用逗号,隔开,从前到后叠加

< shadow >的常见格式 如下

**none .|. < shadow > # **

< shadow > = inset? && < length >{2,4}. && < color >?

第1个 < length >:offset-x , 水平方向的偏移,正数向右偏移 第2个 < length >:offset-y ,垂直方向的偏移,正数往下偏移 第3个 < length >:blur-radius ,模糊半径 第4个 < length >:spread-radius ,延伸半径 < color >:阴影的颜色 ,如果没有设置,就跟随color 属性的颜色 inset: 外框阴影变成内框阴影

盒子阴影 - 在线查看

我们可以通过一个网站测试盒子的阴影:

html-css-js.com/css/generat...

盒子阴影 实践

html 复制代码
<div class="container"></div>
css 复制代码
.container {
    width: 100px;
    height: 100px;
    margin-left: 20px;
    margin-top: 20px;
    background-color: aqua;
    box-shadow: 5px -5px 5px 0px #ff0000, 10px -10px 5px 0px #ff7f00,
      15px -15px 5px 0px #ffff00, 20px -20px 5px 0px #00ff00;
  }

文字阴影 - text-shadow

text-shadow用法类似box-shadow,用于给文字添加阴影效果

< shadow > 的常见格式如下

none .|. < shadow-t >#

< shadow-t > = [< length >{2,3}, && < color >? ]

相当于box-shadow,他没有 spread-radius的值

文字阴影- text-shadow, 在线查看

html-css-js.com/css/generat...

行内非替换元素的注意事项 (display属性为inline 的元素)

以下属性 对 行内级非替换元素不起作用

width,height,margin-top,margin-bottom

以下属性对行内级非替换元素的效果比较特殊

padding-top,padding-bottom,上下方向的border

padding-top,padding-bottom 会使行内级非替换元素上下撑大,但是并不会占据空间

border 会使行内级非替换元素撑大,但是也不会占据空间

html 复制代码
 <span class="span"> 行内级非替换元素</span>aaaa
 <div>dddd</div>
css 复制代码
.span {
    color: white;
    background-color: red;
    /* 生效 */
    margin-left: 20px;
    margin-right: 20px;
    padding-left: 20px;
    padding-right: 20px;
    /* 不生效 */
    width: 200px;
    height: 200px;
    margin-top: 50px;
    margin-bottom: 50px;
    /* 会撑大,但不占据空间 */
    padding-bottom: 50px;
    padding-top: 50px;
    border: 80px solid aqua;
  }

盒子模型的类型

上面细数了盒子模型的很多css 属性,貌似了解了这些,我们已经熟悉了盒子模型的方方面面,能够轻松拿捏它,其实不然,我们还有一个很重要的css属性没有掌握

由于历史原因, 盒子模型的概念在历史中也是有歧义的,最终形成了两种类型的盒子模型,我们可以通过css 属性 box-sizing来设置我们使用的盒子模型,一起来了解一下吧.

css 属性 - box-sizing

box-sizing 用来设置盒子模型中 宽高的行为

content-box

padding,border都布置在width,height外边

border-box

padding,border都布置在width,height 里面

box-sizing:content-box

元素实际占用的宽度 = border + padding + width

元素实际占用的高度 = border + padding + height

box-sizing:border-box

元素实际占用的宽度 = width

元素实际占用的高度 = height

盒子模型的应用

元素的水平居中方案

在一些需求中,需要元素在父元素中居中显示(父元素一般都是块级元素(dispaly 属性值为),行内级替换元素)

行内级元素(包括inline-block 元素)

水平居中: 在父元素中设置:text-align:center

块级元素

水平居中: margin:0 auto

关于块级元素的 水平居中,可能没基础的看不出来原因,这里再总结下 css值:auto

auto 值

在这里,将margin 设置为auto时,表示,这个margin 值我们不决定,交由浏览器决定. 浏览器在这里选择的处理方式是,将父元素剩余的宽度,均分为两份,分别赋值给margin-left 和 margin-right.

html 复制代码
<div class="container">
  <div class="item"></div>
</div>
css 复制代码
.container {
    width: 100px;
    height: 100px;
    background-color: yellowgreen;
  }
  .item {
    width: 50px;
    height: 50px;
    background-color: red;
    margin: 0 auto;
  }
相关推荐
前端Hardy2 小时前
探索 HTML 和 CSS 实现的 3D 开关按钮
css·3d·html
pink大呲花4 小时前
关于番外篇-CSS3新增特性
前端·css·css3
少年维持着烦恼.4 小时前
第八章习题
前端·css·html
我是哈哈hh4 小时前
HTML5和CSS3的进阶_HTML5和CSS3的新增特性
开发语言·前端·css·html·css3·html5·web
袋鼠云数栈前端7 小时前
如何手写实现 JSON Parser
css·sandbox
亿牛云爬虫专家8 小时前
Puppeteer教程:使用CSS选择器点击和爬取动态数据
javascript·css·爬虫·爬虫代理·puppeteer·代理ip
毋若成16 小时前
前端三大组件之CSS,三大选择器,游戏网页仿写
前端·css
榴莲千丞19 小时前
第8章利用CSS制作导航菜单
前端·css
guokanglun20 小时前
CSS样式实现3D效果
前端·css·3d
NiNg_1_2341 天前
前端CSS3 渐变详解
前端·css·html