🦖欢迎观阅本本篇文章,我是Sam9029


上下左右居中方法总结手册

  • ⭐附源码以及演示效果⭐
    • 可以偷懒不放图片了,图片太多了
  • 其实我想去取名叫 上下左右居中--方法总结大全 的😁
  • 🐸其实就是水平垂直居中 的方法总结

这就是一篇页面 上下左右居中方法总结

旨在温习,和拓展

说到这,不妨说出你认为的 上下左右居中的方法有多少种🧐

(我之前,就会只常见的三种(flex定位+transformgird))

今天我将重新学习 上下左右居中方法


使用前注意

注意:每种方法的使用场景问题

在实现 上下左右(水平垂直)居中时,我们总需要考虑的两个主要对象

  • 🧔父元素👦子元素(即被实现-上下左右居中的元素)

所以我们在使用不同的方法时就必须考虑🧔父元素的某些问题

对,如下

  • ❗以及父元素是否为块元素(或者行内块元素
    • 因为行内元素是无法设置宽高的,你就无法实现其子元素上下左右的居中
    • 再说在行内元素身体内再次嵌套元素,也不太符合常规逻辑
  • ❗还有就是父元素的宽高
  • 结论:所以要实现子元素的上下左右居中,其父元素应该为块元素(或者行内块元素且有宽高

问题又来了,你想想,既然父元素必有宽高,那我们一定需要知道它的具体数值吗?

  • 这就像,老爸有多少私房钱(父元素宽高的具体数值)?,你想要(上下左右居中)相当于找老爸要零花钱,但你不需要知道老爸到底有多少私房钱(因为老妈也可能不知道)
  • 反过来,你也可以试图弄清楚老爸有多少零花,可能是你问他,可能是他主动告诉你
  • 你不知道或者知道老爸的私房钱数目都没关系,因为你唯一确定的是老爸他很宠你,一定会给你零花钱一样

所以我们在实现上下左右居中时,就会有两种情况

1. 已知 宽高 的父元素 的情形下

2. 未知 宽高 的父元素的情形下

🐉🐉🐉🐉每种实现方式都会给出使用场景🐉🐉🐉


此文将介绍6种 实现元素 上下左右居中方法

1.定位+transform

<body>
<!-- 父元素-->
<div class="fa">
  <!--子元素-->
  <div class="son"></div>
</div>

<!--CSS-->
<style>
    /* 注意消去默认的margin+padding影响 */
    body,div{
      box-sizing:border-box;
      margin:0;
      padding:0;
    }
    .fa{
      width:100vw;
      height: 100vh;
      border:5px solid tomato;
      position:relative;
    }
    .son{
      width:100px;
      height: 100px;
      border:5px solid black;
      position:absolute;
      top:50%;
      left:50%;
      transform:translate(-50%,-50%);
    }
</style>

🐸使用场景:

  • 未知宽高 父元素
  • 已知宽高 父元素

效果演示

上下左右居中–定位+transform-SAM9029-codepen

实现过程讲解,很详细,推荐:#HTML元素居中方法总结 - 暮冬有八 - 博客园 (cnblogs.com) (B友笔记)


2.flex布局实现

<body>
<div class="fa">
  <div class="son"></div>
</div>

<style>
  /* 注意消去默认的margin+padding影响 */
body,div{
  box-sizing:border-box;
  margin:0;
  padding:0;
}
.fa{
  width:100vw;
  height: 100vh;
  border:5px solid tomato;
  
  display:flex;
  justify-content:center;
  align-items:center;
  
}
.son{
  width:100px;
  height: 100px;
  border:5px solid black;
}
</style>
</body>

🐸使用场景:

  • 未知宽高 父元素
  • 已知宽高 父元素

效果演示

上下左右居中–Flex实现–SAM9029-codepen

实现过程讲解,很详细,推荐:#HTML元素居中方法总结 - 暮冬有八 - 博客园 (cnblogs.com) (B友笔记)


3.gird布局实现

CSS Grid布局可以说是现代Web布局中的银弹。它也是到目前为止布局系统中唯一一个二维布局系统。

<body>
<div class="fa">
  <div class="son"></div>
</div>

<style>
  /* 注意消去默认的margin+padding影响 */
body,div{
  box-sizing:border-box;
  margin:0;
  padding:0;
}
.fa{
  width:100vw;
  height: 100vh;
  border:5px solid tomato;
  
  display:grid;
  /*or*/
  /*display:inline-gird;*/
  /*对 没错 仅一句话 即可实现上下左右居中*/
  place-items: center  
}
.son{
  width:100px;
  height: 100px;
  border:5px solid black;
}
</style>
</body>

🐸使用场景:

  • 未知宽高 父元素
  • 已知宽高 父元素

效果演示

上下左右居中–Gird实现–SAM9029-codepen


4.display:table实现

  • ❗关于display:table实现,❗得多讲两句需要注意得地方
  • 此处使用得 dom 结构是三层(div.fa>div.son>img
    • 注意第三层,即在(son内部)display设置为table-cell 内部的 元素应该是 行内块元素或者行内元素
    • 这不难理解,table 内本身(div.fa此时已相当于一个table元素)就该写内容,内部应该在嵌套元素了
<body>  
  <div class="fa">
    <div class="son">    
      <img src="./dog.png" alt="">    
  <!--  此处必须注意:不能使用块元素,即在table-cell 中的 元素应该是 行内块元素或者行内元素    -->
  <!--  如你非要使用div,则需要使用display:inline-block;    -->
  <!--     <div class="item"></div> -->
    </div>
  </div>
  
  <style>
    body,div{
      box-sizing:border-box;
      margin:0;
      padding:0;
    }
    body{
      width:100vw;
      height:100vh;
    }
    .fa{
      width: 80%;
      height: 80%;
      display: table;
      border:5px solid skyblue;
    }
    .son{
      border:10px solid tomato;
      display: table-cell;
      vertical-align: middle;
      text-align: center;/*单元格是行内元素*/
    }
    img,.item{
      display:inline-block;
      width:100px;
      height:100px;
      border:1px solid black;
    }
  </style>
</body>

🐸使用场景:

  • 未知宽高 父元素
  • 已知宽高 父元素

效果演示

上下左右居中–display-table实现 sam9029-codepen.io


5.line-height实现

  • ❗line-height实现,❗也得多讲两句需要注意得地方
    • 这里案例使用的DOM结构是 div.fa > text(直接是内容)
    • 同时 .fa 内部的 元素也应该是 行内块元素或者行内元素
  • 这也不难理解,因为若使用line-height(控制上下居中),那就得使用text-align(控制左右居中)
    • 也这就是关键line-heighttext-align设置 仅对元素内的 行内块元素和行内元素生效,对块元素无效
    • 拓展:vertical-align同样仅对元素内的 行内块元素和行内元素生效,
<body>  
  <div class="fa">

    text
    <!-- fa 里面的内容 必须是行内块元素或行内元素 -->
    <!--/* 将son 设置为行内块元素*/-->
<!--     <div class="son"></div> -->
  </div>
  
  <style>
        body,div{
      box-sizing:border-box;
      margin:0;
      padding:0;
    }
    body{
      width:100vw;
      height:100vh;
    }
    .fa{
      width: 500px;
      height: 500px;
      border:5px solid skyblue;
      
	/*左右居中,text-align设置 仅对元素内的 行内块元素和行内元素生效*/
      text-align:center;
      line-height:500px;
    }
	/* 将son 设置为行内款元素*/
    .son{
      display:inline-block;
      width: 100px;
      height: 100px;
      border:2px solid black;

    }
  </style>
</body>

🐸使用场景:

  • 已知宽高 父元素

效果演示

上下左右居中–line-height实现 sam9029-codepen.io


6.未知名称法(使用纯定位)

  • 拓展-不建议使用
<body>  
  <div class="fa">
    <div class="son">    
    </div>
  </div>
  
  <style>
    body,div{
      box-sizing:border-box;
      margin:0;
      padding:0;
    }
    body{
      width:100vw;
      height:100vh;
    }
    .fa{
      width: 80%;
      height: 80%;
      border:5px solid skyblue;
      position:relative;
    }
    .son{
      width: 100px;
      height: 100px;
      border:2px solid black;
      
      margin:auto;
      position:absolute;
      top:0;
      left:0;
      right:0;
      bottom:0;
      
    }
  </style>
</body>

演示效果

上下左右居中–未知名称法(使用纯定位)SAM9029-codepen


注意事项

消去默认margin+padding影响
  • 注意所有案例中,都默认消去了margin+padding影响
/* 注意默认的margin+padding消去影响 */
body,div{
  box-sizing:border-box;
  margin:0;
  padding:0;
}
text-align/line-height/vertical-align 设置 仅对元素内的 行内块元素和行内元素生效

参考

🐱‍🐉🐱‍🐉文章若有错误,敬请指正🙏


🦖欢迎查阅Sam9029 的其他文章

🐸Sam9029-CSDN主页

**🐱‍🐉🐱‍🐉恭喜你,都看到这了,求赞,求收藏,求评论不过分吧**
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐