字节跳动前端面试题:行内元素设置 margin 有什么效果?
5577
2020.11.28
2020.12.04
发布于 吉林

bytedance.jpg

对于一个行内元素,设置它的 margin 会有什么表现,为什么它是可行的

答:设置 margin-leftmargin-right 有影响,而 margin-topmargin-bottom 无影响。

行内元素设置 margin 会有位置的改变吗

答:左右 margin 会变,上下 margin 不会变。

解读

以上两个问题均涉及到了 margin 的一些细节,先来看以下结论:

🚩 行内元素中,padding-left / padding-right / margin-left / margin-right 有影响结果;

🚩 行内元素中,padding-top / padding-bottom / margin-top / margin-bottom 不影响结果;

🚩 padding-top / padding-bottom 虽然不影响结果,但实际上生效了。

啥意思呢,我们来看一个例子:

code_1.html
code_2.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        /* span {
            padding: 10px;
            margin: 50px;
            background-color: red;
        } */
        div {
            background-color: yellow;
        }
    </style>
</head>
<body>
    <div>外层上 div</div>
        <!-- <span>我是内联元素</span> -->
    <div>外层下 div</div>
</body>
</html>

code_1.html 中,我们设置了两个 div,背景为黄色,运行结果如下图所示。

image.png

这时,在 code_2.html 中,我们在两个 div 之间,加一个内联元素 span,并设置 paddingmargin,运行结果为下面这样:

image.png

仔细看这个图,先尝试自己理解一下为什么会变成这样。

我们分两步来进行理解:

第一步,当没有 background-color: red 时,结果是 span 向右移动了 的距离,即:

  • padding-left / padding-right / margin-left / margin-right 影响了结果
  • padding-top / padding-bottom / margin-top / margin-bottom 不影响结果

1.png

第二步,加上 background-color: red 后,我们发现其实 padding-top / padding-bottom 生效了,不过还是没影响到结果;而 margin-top / margin-bottom 没有生效。

2.png

为什么会出现上述情况

答:<span>不可替换元素 (non-replaced element),而 行内不可替换元素的外边距不会改变该元素的行高。

解读

答案中有三个关键词,我们将对其分别解释:

  • 行内
  • 非替换元素
  • 行高

1. 块级元素(block-level)和行内元素(inline-level)

HTML(超文本标记语言,Hypertext Markup Language)元素大多数都是块级元素或行内元素。

它们的区别在于:默认情况下,块级元素会新起一行。

所有的块级元素:

元素解释元素解释元素解释
联系方式信息
图文信息组标题表单输出
文章内容
图文信息组

伴随内容区段尾或页尾
预格式化文本
音频播放表单一个页面区段
块引用

~

标题级别 1-6
表格
绘制图形区段头或页头
表脚注
定义列表中定义条目描述标题组
    无序列表
    文档分区
    水平分割线视频
    定义列表不支持或禁用脚本的内容
    表单元素分组
      有序列表

      所有行内元素:

      • , , , ,
      • , , , , , , , , ,
      • , , <br>, , , , ,
      • <button>, <input>, <label>, <select>, <textarea>
      • (以上数据来源于 MDN

        2. 可替换元素(replaced element)和不可替换元素(non-replaced element)

        可替换元素和不可替换元素可以看作 HTML 元素的另一种分类方式,可替换元素的内容不受当前文档的样式的影响,比如 <img> 是一个可替换元素,其他的可替换元素有:

        典型的可替换元素有:

        • <video>

        有些元素仅在特定情况下被作为可替换元素处理,例如:

        • (以上数据来源于 MDN

          它们和块级元素的之间的关系可以这样理解:

          3.png

          行高

          像小时候学英语时的四线格,从上到下四条线分别是顶线、中线、基线、底线,分别对应 verticle-align 属性中的 top / middle / baseline / bottom 四个值。如图,上下文本中两条红色基线之间的垂直距离就是行高。

          4.png

          理解了上面三个概念之后,我们就明白了:因为 <span> 既是行内元素,又是不可替换元素。而行内元素中,不可替换元素的外边距不会改变该元素的行高,所以在 <span> 中当我们试图使用 marginpadding 改变元素的外边距时,行高是不变的,只是宽度变大了。

          你可能会问:假如把 换成可替换元素,改变外边距就会影响行高了?

          是的。

          如下图,当我们把 <span> 换成可替换元素 <textarea> 后, marginpadding 均会影响上下左右的距离。

          image.png


          更多面试题:字节跳动前端提前批面经总结(二)

          文章源代码 下载

      评论 (0)