百度面试CSS问什么?文档流+定位?

166 阅读5分钟

你了解CSS吗?面试考文档流是怎么回答?

本文以小白视角讨论CSS里面几个重要概念,以百度的一道面试题为背景讲解,包括文档流中行内和块级元素在绘制的时候定位的位置,盒子模型中水平和垂直定位三种方法。收藏等于学会,点赞下次面试必过~

先考对文档流理解

CSS(层叠样式表),文档外观的样式表语言,起到页面“化妆”,提升用户体验的作用。文档流就是css里面重要部分。

文档流(document),通俗来说:页面元素按照HTML代码顺序,从上到下,从左到右进行顺序排列。一般,块级元素会占据新的一行,而行内元素在同一行依次排列,直到无法容纳更多行内元素才会换行,图片元素img特别明显

上图看看:

image.png

简单解释:两个div块级元素分别占据一行,span标签下的文字和img下的图片进行同一行依次排布。在这里图片按照像素点进行绘制,但是一行明显不够容纳,会自动换行进行多行绘制,直到全部绘制完成。这时候span标签因为在同一行没有排满(相当栅格里面列不够),于是跟着到图片最末尾那一行。

块级和行内在文档流绘制小结

  • 块级元素:从上至下排列,每个元素占据一行,宽度默认为父容器的100%,高度根据内容自动调整,根据内容高度进行调整。常见的块级元素有<div><p><h1><h6>等。
  • 行内元素:从左至右排列,高度和宽度由其内容决定。常见的行内元素包括<a><b><span><img><input><select><textarea><label><br>等。

第二是盒子模型

CSS盒子模型是理解页面布局的基础。每个HTML元素都可以当成一个矩形盒子,盒子有内容(content),内边距(padding),边框(border),外边距(margin)四个部分组成

image.png

有盒子得定位

每个元素可以相当一个矩形盒子,在考虑位置和大小后,进行精准控制元素位置,主要定位类型:静态定位(static)、相对定位(relative)、绝对定位(absolute)和固定定位(fixed)。fixed是固定位置,让部分元素不随着页面滚动,类似绝对定位;static默认定位,正常文档进行布局。下面重点讲relative,absolute。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文档流</title>
    <style>
         *{
            margin: 0;
            padding: 0;
            /* 清除默认的内外边距 */
        } 

        #box1 {
          margin: 20px;
          width: 200px;
          height: 200px;
          padding: 1px;
          border: 1px solid red;
          background-color: green;
          
        }
        #box2 {
          position: relative;
          margin: 10px;
          width: 300px;
          height: 300px;
          background-color: yellow;
        }

    </style>
</head>
<body>
    <!-- box1 在box2上面,正常文档流
     html 文档流和css结合 样式生效 盒模型
     -->
    <div id="box1"> 
    </div>
    <div id="box2">
        box3  
    </div>
</body>
</html>

下图为绘制结果,调box2相对box1进行定位,relative找最近的祖先元素进行定位 image.png

罒ω罒发现掘金图片也是居中处理,正好文末讨论一下文本水平和垂直居中对齐

增加box3框框,看看这时候absolute和relative的不一样

#box3 {
          position:absolute;
          width:60px;
          height: 60px;
          background-color: pink;
          left: 30px;
          top: 30px;
       }
// body里面
     <div id="box2">
        <div id="box3">box3</div>
    </div>
image.png

当我们将 box3 的定位方式设置为 absolute 时,box3 将相对于最近的已定位(即定位值不是 static 的)祖先元素进行定位。如果找不到这样的祖先元素,那么 box3 将相对于初始包含块(通常是 <body> 元素,坐标原点为 (0,0))进行定位。

另一方面,当一个元素的定位方式设置为 relative 时,它是相对于自己原本在文档流中的位置进行偏移的。这意味着该元素虽然从原始位置移动了,但它原先占据的空间仍然保留,不影响其他元素在文档流中的位置。通常情况下,我们会使用 lefttoprightbottom 属性来指定 relative 元素的具体偏移量。

加料:如何实现水平和垂直居中对齐

1.先上使用flexbox,grid代码

 #box2 {//使用flexbox
          display: flex;
          justify-content: center; /* 水平居中 */
          align-items: center; /* 垂直居中 */
        }
        //使用grid
        {
        display:grid;
        place-items:center;
        }

2.第三种使用绝对定位和负边距,呼应一下本次主题。可能疑问这个常不常见尼?

使用绝对定位和负边距的方法在实际项目中还是非常常见,特别是需要精确定位和布局时。具体步骤如下:

  1. 外层容器设置相对定位:将外层容器(如 #box2)设置为相对定位(position: relative;),使其成为内部绝对定位元素的参考点。
  2. 内部元素设置绝对定位:将内部元素(如 #box3)设置为绝对定位(position: absolute;),并使用 top: 50%; 和 left: 50%; 将其左上角移动到父元素的中心。
  3. 使用 transform 调整位置:通过 transform: translate(-50%, -50%); 将内部元素向左和向上移动自身宽度和高度的 50%,从而实现元素的中心点与父元素中心点对齐。

这种方法不仅简单易用,还能灵活处理嵌套盒子的对齐操作。代码演示:

        
        #box3 {
          position:absolute;
          width:60px;
          height: 60px;
          background-color: pink;
          left: 30px;
          top: 30px;


        }
        #box3{
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%); /*向上左移动自身的50% */
        } 
image.png