当前位置: 首页 > article >正文

CSS如何让一个盒子或内容在指定区域中上下左右居中

        要使用CSS让盒子或内容在其父元素中上下左右居中,可以使用多种方法。例如:flexbox布局、使用grid布局、box布局、使用position定位和transform结合、以及表格属性等等,相关属性来实现内容的上下左右的居中。

        接下来我们使用以上的方法,将下图中的发电率和发电量内容进行上下左右居中。

一、创建页面

        首先创建一个demo目录,新建html页面和存放图标的image目录。

        html页面代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <style type="text/css">
    * {
      margin: 0;
      padding: 0;
    }

    html,
    body {
      font-size: 14px;
      padding: 20px;
    }

    .item-list-box {
      display: inline-block;
      width: 500px;
      border: 2px solid rgba(0, 0, 0, .5);
      background-color:
        rgba(0, 0, 255, .6);
    }

    .item-list-box .title,
    .item-list-box .content {
      width: 100%;
      box-sizing: border-box;
      padding: 12px 15px;
    }

    .item-list-box .title {
      border-bottom: 1px solid rgba(0, 0, 0, .5);
    }

    .item-list-box .title h3 {
      font-size: 18px;
      color: #fff;
      position: relative;
      line-height: 1;
      padding-left: 15px;
    }

    .item-list-box .title h3::before {
      display: block;
      content: '';
      width: 4px;
      height: 100%;
      background-color: #fff;
      position: absolute;
      left: 0;
    }

    .item-list-box .content {
      height: 200px;
      position: relative;
    }

    .item-list-box .content ul.list li {
      list-style: none;
      font-size: 16px;
      color: #fff;
      display: inline-block;
      vertical-align: middle;
      padding: 5px 10px;
      text-align: center;
    }

    .item-list-box .content ul.list li img {
      width: 50px;
      margin-bottom: 10px;
    }
  </style>
</head>

<body>
  <div class="item-list-box">
    <div class="title">
      <h3>电量统计</h3>
    </div>
    <div class="content">
        <ul class="list">
          <li>
            <img src="image/icon_white_01.png" alt="">
            <p>发电率:95%</p>
          </li>
          <li>
            <img src="image/icon_white_02.png" alt="">
            <p>发电量:25329338</p>
          </li>
        </ul>
    </div>
  </div>

</body>
</html>

        效果如下图:

二、实现水平和垂直方向居中

        以下方法都可以实现盒子在父元素中上下左右居中的效果,选择哪种方法取决于您的布局需求和个人偏好。

2.1 使用flex布局

        ‌Flex布局(Flexible Box Layout)‌,也称为弹性盒布局,是一种CSS布局方式,旨在提供一种更有效的方式来对容器中的子元素进行排列、对齐和分配空间,尤其适用于响应式设计,能够自动适应不同尺寸的屏幕。‌

Flex布局本次主要使用的属性:

  1. ‌flex-direction‌:决定主轴的方向,可以是行(水平)或列(垂直)。
  2. ‌justify-content‌:定义项目在主轴(水平)上的对齐方式。
  3. ‌align-items‌:定义项目在交叉轴(垂直)上的对齐方式。
IEFirefoxChromeSafariOperaiOS SafariAndroid BrowserAndroid Chrome
支持版本11.0+22.0+21.0+-webkit-6.1+-webkit-17.0+7.0+-webkit-4.4+20.0+-webkit-
29.0+9.0+9.0+28.0+

        代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <style type="text/css">
    /* 略... */
  </style>
</head>

<body>
  <div class="item-list-box">
    <div class="title">
      <h3>电量统计</h3>
    </div>
    <div class="content">
        <ul class="list">
          <li>
            <img src="image/icon_white_01.png" alt="">
            <p>发电率:95%</p>
          </li>
          <li>
            <img src="image/icon_white_02.png" alt="">
            <p>发电量:25329338</p>
          </li>
        </ul>
    </div>
  </div>

  <style type="text/css">
    .item-list-box .content ul.list{
      height: 100%;
      display: flex;
      justify-content: center;    /* 水平方向居中 */
      align-items: center;        /* 垂直方向居中 */
    }
  </style>

</body>
</html>

        效果如下图:

2.2 position与transform

        在CSS中,可以利用position和transform结合使用,使内容在水平和垂直方向居中显示。       

position支持浏览器版本:IE8.0+, Firefox40.0+, Chrome40.0+, iOS8.0+, Android4.4+, Opera40.0+

transform支持浏览器版本:IE8.0+, Firefox40.0+, Chrome40.0+, iOS8.0+, Android4.4+, Opera40.0+

        先使用position定准,将内容往右和往下各移50%距离,再使用transform将内容部分盒子往左和往上移50%,则内容就可以显示在content位置了。

        CSS transform中的translate功能主要用于元素的位移操作‌。translate可以通过不同的参数来实现元素在X轴、Y轴或Z轴上的平移。

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <style type="text/css">
    /* 略... */
  </style>
</head>

<body>
  <div class="item-list-box">
    <div class="title">
      <h3>电量统计</h3>
    </div>
    <div class="content">
        <ul class="list">
          <li>
            <img src="image/icon_white_01.png" alt="">
            <p>发电率:95%</p>
          </li>
          <li>
            <img src="image/icon_white_02.png" alt="">
            <p>发电量:25329338</p>
          </li>
        </ul>
    </div>
  </div>

  <style type="text/css">
    .item-list-box .content ul.list{
      display: inline-block;
      position: relative;
      left: 50%;      /* 水平方向向右移50%距离(content盒子宽度的50%距离) */
      top: 50%;       /* 垂直方向向右移50%距离 (content盒子调度的50%距离)*/
      transform: translate(-50%, -50%); /* 以内容宽和高的50%, 往左和往上移动50%距离 */
    }
  </style>

</body>
</html>

        页面效果如下图:

2.3 table-cell布局

        ‌CSS中的table-cell属性‌用于将一个元素设置为表格单元格布局,类似于HTML中的<td>或<th>元素。通过设置元素的display属性为table-cell,可以实现类似表格单元格的布局效果。

        本次主要使用的属性:

  1. vertical-align:垂直方向内容居中
  2. text-align:水平方向内容的居中

        代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <style type="text/css">
    /* 略... */
  </style>
</head>

<body>
  <div class="item-list-box">
    <div class="title">
      <h3>电量统计</h3>
    </div>
    <div class="content">
        <ul class="list">
          <li>
            <img src="image/icon_white_01.png" alt="">
            <p>发电率:95%</p>
          </li>
          <li>
            <img src="image/icon_white_02.png" alt="">
            <p>发电量:25329338</p>
          </li>
        </ul>
    </div>
  </div>

  <style type="text/css">
    .item-list-box .content{
      display: table;
    }
    .item-list-box .content ul.list{
      display: table-cell;
      text-align: center;       /* 水平方向内容居中 */
      vertical-align: middle;   /* 垂直方向内容居中 */
    }
  </style>

</body>
</html>

        页面效果如下图:

        注意:必须先将属性为table-cell的父元素设置为display: table,table-cell中vertical-align和text-align方可生效。

兼容性和浏览器支持
        CSS的table-cell属性在所有现代浏览器中都得到了良好的支持,包括Chrome、Firefox、Safari和Edge等。它不会影响页面的语义化,但在某些情况下可能会影响SEO。使用table-cell布局的代码相对简洁,且不需要等待所有内容加载完毕即可显示,提高了页面的响应速度‌

2.4 Grid布局

        ‌CSS Grid布局‌是一种强大的二维布局系统,允许开发者通过定义行和列来创建网格结构,并控制网格项在网格中的位置和大小。与Flex布局相比,Grid布局更适合复杂的网格结构,因为它可以同时控制行和列的布局。‌

        将一个元素设置为display: grid,该元素就变成了网格容器,定义了一个包含子元素的网格布局上下文。

容器属性

  1. ‌display‌:指定一个容器采用网格布局,例如display: grid;或display: inline-grid;。
  2. ‌grid-template-columns‌和‌grid-template-rows‌:分别定义网格的列宽和行高。可以使用百分比或fr关键字来定义宽度和高度,或者使用repeat()函数来简化重复的定义。
  3. ‌grid-gap‌:设置网格项之间的间距。
  4. ‌grid-template-areas‌:定义命名区域,方便通过名称放置网格项。‌


项目属性

  1. ‌grid-column-start‌、‌grid-column-end‌、‌grid-row-start‌、‌grid-row-end‌:控制网格项的起始和结束位置。
  2. ‌grid-area‌:通过名称指定网格项的位置。
  3. ‌justify-self‌、‌align-self‌:控制网格项的水平和对齐方式。

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <style type="text/css">
    /* 略... */
  </style>
</head>

<body>
  <div class="item-list-box">
    <div class="title">
      <h3>电量统计</h3>
    </div>
    <div class="content">
        <ul class="list">
          <li>
            <img src="image/icon_white_01.png" alt="">
            <p>发电率:95%</p>
          </li>
          <li>
            <img src="image/icon_white_02.png" alt="">
            <p>发电量:25329338</p>
          </li>
        </ul>
    </div>
  </div>

  <style type="text/css">
    .item-list-box .content{
      display: grid;
    }
    .item-list-box .content ul.list{
      justify-self: center;   /* 左右居中 */
      align-self: center;     /* 上下居中 */
    }
  </style>

</body>
</html>

        页面效果如下:

2.5 Grid布局中的place-items

        place-items是同时设置 align-items 和 justify-items的快速方法。将其设置为center等同于align-items: center和justify-items: center组合。

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <style type="text/css">
    /* 略... */
  </style>
</head>

<body>
  <div class="item-list-box">
    <div class="title">
      <h3>电量统计</h3>
    </div>
    <div class="content">
        <ul class="list">
          <li>
            <img src="image/icon_white_01.png" alt="">
            <p>发电率:95%</p>
          </li>
          <li>
            <img src="image/icon_white_02.png" alt="">
            <p>发电量:25329338</p>
          </li>
        </ul>
    </div>
  </div>

  <style type="text/css">
    .item-list-box .content{
      display: grid;
      /* 等同于同时设置了 align-items: center和justify-items: center */
      place-items: center;  
    }
    
  </style>
 

</body>
</html>

        页面效果如下图:

2.6 旧的Box布局

        将对象作为弹性伸缩盒显示,它是弹性伸缩盒的一部分,也称为伸缩盒最老版本。虽然现在推荐使用display: flex,但了解display:box仍然有助于理解弹性盒子布局的演进和兼容性处理。

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <style type="text/css">
    /* 略... */
  </style>
</head>

<body>
  <div class="item-list-box">
    <div class="title">
      <h3>电量统计</h3>
    </div>
    <div class="content">
        <ul class="list">
          <li>
            <img src="image/icon_white_01.png" alt="">
            <p>发电率:95%</p>
          </li>
          <li>
            <img src="image/icon_white_02.png" alt="">
            <p>发电量:25329338</p>
          </li>
        </ul>
    </div>
  </div>

  <style type="text/css">
    .item-list-box .content{
      display: -webkit-box;
      -webkit-box-align: center;  /* 上下居中 */
      -webkit-box-pack: center;   /* 左右居中 */
    }
    
  </style>

</body>
</html>

        页面效果如下图:

        此篇就先讲到这,希望对大家有所帮助。


http://www.kler.cn/a/504534.html

相关文章:

  • React:构建用户界面的JavaScript库
  • R语言的数据库编程
  • 浅谈云计算01 | 云计算服务的特点
  • 【算法】将单链表按值划分
  • 图解Git——分支的新建与合并《Pro Git》
  • vue2修改表单只提交被修改的数据的字段传给后端接口
  • MySQL(高级特性篇) 04 章——逻辑架构
  • Django自带admin管理系统使用
  • K8S--配置存活、就绪和启动探针
  • ruoyi-cloud docker启动微服务无法连接nacos,Client not connected, current status:STARTING
  • 力扣 最大子数组和
  • Jupyter notebook入门教程
  • 2 XDMA IP中断
  • 小白:react antd 搭建框架关于 RangePicker DatePicker 时间组件使用记录 2
  • 《CPython Internals》阅读笔记:p151-p151
  • Swift UI开发指南:修饰器特性(modifiers)
  • SparrowRTOS系列:链表版本内核
  • 蓝桥杯备赛:顺序表和单链表相关算法题详解(上)
  • MongoDB实践
  • 【多模态LLM】LLaVA系列算法架构演进:LLaVA(1.0->1.5->Next(1.6)->NeXT(Video))
  • 7 分布式定时任务调度框架
  • 网络安全学习81天(记录)
  • Golang笔记——协程同步
  • 朴素贝叶斯分类器
  • <C++学习>C++ Boost 输入与输出教程
  • Java学习,集合遍历