面试官必问——水平垂直居中的11种解决方案

简介: 盒子水平垂直居中的N种方案1、定位+margin拉回

盒子水平垂直居中的N种方案

1、定位+margin拉回

复制代码<style>
    #box {
      width: 100px;
      height: 100px;
      position: relative;
      background-color: #ff0;
    }
    #block {
      width: 30px;
      height: 30px;
      background-color: aqua;
      position: absolute;
      top: 50%;
      left: 50%;
      margin-left: -15px;
      margin-top: -15px;
    }
  </style>
  <body>
    <div id="box">
      <span id="block">1</span>
    </div>
  </body>

2、定位+transform拉回

 <style>
    #box {
      width: 100px;
      height: 100px;
      position: relative;
      background-color: #ff0;
    }
    #block {
      width: 30px;
      height: 30px;
      background-color: aqua;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
    }
  </style>
  <body>
    <div id="box">
      <span id="block">1</span>
    </div>
  </body>

3、绝对定位各方向0+margin: auto

<style>
    #box {
      width: 100px;
      height: 100px;
      position: relative;
      background-color: #f00;
    }
    #block {
      width: 30px;
      height: 30px;
      background-color: #ff0;
      position: absolute;
      left: 0;
      bottom: 0;
      right: 0;
      top: 0;
      margin: auto;
    }
  </style>
  <body>
    <div id="box">
      <span id="block">1</span>
    </div>
  </body>

4、flex布局 + 设置水平垂直居中

  <style>
    #box {
      width: 100px;
      height: 100px;
      background-color: brown;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    #block {
      width: 30px;
      height: 30px;
      background-color: #f0f;
    }
  </style>
  <body>
    <div id="box">
      <span id="block">1</span>
    </div>
  </body>

5、flex布局 + margin: auto

<style>
    #box {
      width: 100px;
      height: 100px;
      background-color: brown;
      display: flex;
    }
    #block {
      width: 30px;
      height: 30px;
      background-color: #f0f;
      margin: auto;
    }
  </style>
  <body>
    <div id="box">
      <span id="block">1</span>
    </div>
  </body>

6、display: table-cell vertical-align text-align 组合使用

 <style>
    #box {
      width: 100px;
      height: 100px;
      background-color: #0ff;
      display: table-cell;
      text-align: center;  // 子元素需要设置行内属性
      vertical-align: middle;
    }
    #block {
      width: 30px;
      height: 30px;
      background-color: #00f;
      display: inline-block;
    }
  </style>
  <body>
    <div id="box">
      <div id="block">b</div>
    </div>
  </body>

注意子元素需要设置行内属性, text-align: center; 才会让元素居中 触发IFC


7、display: box; 设置box-align和box-pack center

 <style>
    #box {
      width: 100px;
      height: 100px;
      background-color: #0ff;
      display: -webkit-box;
      -webkit-box-pack: center;
      -webkit-box-align: center;
    }
    #block {
      width: 30px;
      height: 30px;
      background-color: orange;
    }
  </style>
  <body>
    <div id="box">
      <div id="block">1</div>
    </div>
  </body>

注意各浏览器的兼容问题,注意前缀



8、display: grid 布局 display: grid + place-items:center

 <style>
    #box {
      width: 100px;
      height: 100px;
      background-color: #0ff;
      display: grid;
      place-items: center;
    }
    #block {
      width: 30px;
      height: 30px;
      background-color: orange;
    }
  </style>
  <body>
    <div id="box">
      <span id="block"></span>
    </div>
  </body>

或者通过设置网格区域

 <style>
    #box {
      width: 100px;
      height: 100px;
      background-color: #0ff;
      display: grid;
      grid-template-rows: 1fr 30px 1fr;
      grid-template-columns: 1fr 30px 1fr;
    }
    #block {
      width: 30px;
      height: 30px;
      background-color: orange;
      grid-area: 2/2/3/3;
    }
  </style>
  <body>
    <div id="box">
      <span id="block"></span>
    </div>
  </body>
 <style>
    #box {
      width: 100px;
      height: 100px;
      background-color: #ff0;
      text-align: center;
    }
    #block { 
   /* 形成IFC, 父元素设置 text-align: center; 居中子元素,vertical-align: middle; 居中其他兄弟元素*/
      width: 0px;
      height: 100px;
      background-color: #f00;
      display: inline-block;
      vertical-align: middle;
      opacity: 0;
    }
    #block2 {
      background-color: #f0f;
      width: 60px;
      display: inline-block;
    }
  </style>
  <body>
    <div id="box">
      <span id="block">1</span>
      <span id="block2">2</span>
    </div>
  </body>
作者:重阳微噪
链接:https://juejin.cn/post/6875963221870805005
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

对文字内容不友好。 会造成文字不居中,不建议使用

9、display: inline-block; 利用IFC,行内元素撑开高度设置vertical-align

<style>
    #box {
      width: 100px;
      height: 100px;
      background-color: #ff0;
      text-align: center;
    }
    #block { 
   /* 形成IFC, 父元素设置 text-align: center; 居中子元素,vertical-align: middle; 居中其他兄弟元素*/
      width: 0px;
      height: 100px;
      background-color: #f00;
      display: inline-block;
      vertical-align: middle;
      opacity: 0;
    }
    #block2 {
      background-color: #f0f;
      width: 60px;
      display: inline-block;
    }
  </style>
  <body>
    <div id="box">
      <span id="block">1</span>
      <span id="block2">2</span>
    </div>
  </body>

10、利用calc函数动态计算实现

 <style>
    #box {
      width: 100px;
      height: 100px;
      background-color: #0ff;
      position: relative;
    }
    #block {
      position: absolute;
      width: 30px;
      height: 30px;
      left: -webkit-calc((100px - 30px)/2);
      top: -webkit-calc((100px - 30px)/2);
      left: -moz-calc((100px - 30px)/2);
      top: -moz-calc((100px - 30px)/2);
      left: calc((100px - 30px) / 2);
      top: calc((100px - 30px) / 2);
      background-color: orange;
    }
  </style>
  <body>
    <div id="box">
      <div id="block">b</div>
    </div>
  </body>

注意兼容性

11、单纯文字水平垂直居中 一般只需要设置text-align和line-height和高度相同

  <style>
    #box {
      width: 100px;
      height: 100px;
      background-color: #0ff;
      line-height: 100px;
      text-align: center;
    }
  </style>
  <body>
    <div id="box">居中文字</div>

相关文章
|
4月前
|
消息中间件 安全 NoSQL
2023春招面试专题:高并发解决方案(三)
2023春招面试专题:高并发解决方案
|
4月前
|
缓存 NoSQL 数据库
2023春招面试专题:高并发解决方案
2023春招面试专题:高并发解决方案
|
29天前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
1月前
|
数据库
面试准备 数据迁移解决方案
【8月更文挑战第8天】
34 7
|
2月前
|
消息中间件 Java 中间件
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
38 0
|
2月前
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
67 0
|
4月前
|
前端开发 容器
CSS面试考点:隐藏元素、BFC、垂直居中、CSS3新特性
【4月更文挑战第2天】 CSS面试考点:隐藏元素、BFC、垂直居中、CSS3新特性
41 10
|
4月前
|
NoSQL 安全 Java
面试官:分布式锁最终解决方案是RedLock吗?为什么?
面试官:分布式锁最终解决方案是RedLock吗?为什么?
80 1
|
4月前
|
SQL 缓存 NoSQL
2023春招面试专题:高并发解决方案(二)
2023春招面试专题:高并发解决方案
167 0