浮动元素的块级化

行内元素设置 float 后的 display 变化

问题

行内元素设置 float: left 后是否变为块级元素?

解答

是的,行内元素设置 float 后会被块级化,其 display 计算值会变成 block

验证代码

<!DOCTYPE html>
<html>
<head>
  <style>
    .normal-span {
      background: lightblue;
    }
    
    .float-span {
      float: left;
      background: lightcoral;
      /* 设置 float 后,可以设置宽高了 */
      width: 100px;
      height: 50px;
    }
  </style>
</head>
<body>
  <span class="normal-span">普通 span</span>
  <span class="float-span">浮动 span</span>

  <script>
    const normalSpan = document.querySelector('.normal-span');
    const floatSpan = document.querySelector('.float-span');

    // 获取计算后的 display 值
    console.log('普通 span 的 display:', getComputedStyle(normalSpan).display); 
    // 输出: inline
    
    console.log('浮动 span 的 display:', getComputedStyle(floatSpan).display);  
    // 输出: block
  </script>
</body>
</html>

CSS 规范中的转换规则

根据 CSS 规范,当元素设置 float(非 none)时,display 会按以下规则转换:

设置值计算值
inlineblock
inline-blockblock
inline-tabletable
table-*block
flexflex
gridgrid
其他不变

块级化后的特性

span {
  float: left;
  
  /* 以下属性现在都生效了 */
  width: 200px;      /* 可以设置宽度 */
  height: 100px;     /* 可以设置高度 */
  margin: 10px;      /* 四个方向的 margin 都生效 */
  padding: 20px;     /* padding 正常生效 */
}

关键点

  • 行内元素设置 float 后,display 计算值变为 block
  • 块级化后可以设置 widthheightmarginpadding
  • 同样的规则适用于 position: absoluteposition: fixed
  • 虽然 display 变成 block,但浮动元素脱离文档流,不会独占一行
  • 使用 getComputedStyle() 可以获取元素的计算样式值