jjzjj

居中布局:水平居中和垂直居中

欲速则不达 2023-03-28 原文

居中布局在实际场景中很常见,在面试当中也经常会被考察。

以下分别是水平居中和垂直居中常用的样式。

水平居中

margin: 0 auto; + width 应用于块级元素居于容器中间

  • 若节点不是块级元素,需声明display: block
  • 若节点宽度已隐式声明则无需显式声明width
<div class="h-c1">
    <p>谈笑有鸿儒,往来无白丁。谈笑有鸿儒,往来无白丁。</p>
</div>
.h-c1 {
  margin: 0 auto;
  width: fit-content; // 300px;
  background-color: #fcc;
}

text-align: center; 应用于行内元素居中

  • 父节点声明text-align
  • 若节点不是行内元素需声明display: inline/inline-block

使行内元素居于父级容器中间,可用于使文本内容水平居中。

<div class="h-c3">
    <span>谈笑有鸿儒,往来无白丁。谈笑有鸿儒,往来无白丁。</span>
</div>
.h-c3 {
  text-align: center;
  background-color: #fc0;
}

position + left/right + margin-left/right + width:应用于全部元素

  • 适用于父子元素的宽度都确定的情况
  • 子绝父相。父:position: relative,子:position: absolute
<div class="h-c4">
    <div class="h-c4-child">
        <span>谈笑有鸿儒,往来无白丁。谈笑有鸿儒,往来无白丁。</span>
    </div>
</div>
.h-c4 {
    position: relative;
    width: 500px; /*或者宽度隐式声明*/
    height: 30px;

    .h-c4-child {
      position: absolute;
      width: 300px;
      left: 50%; /* 相对于父元素的宽度 */
      margin-left: -150px; /* 子元素宽度的一半的负数 */
      background-color: #fbf;
    }
}

position + left/right + transform: translateX(-50%):应用于全部元素

  • 适用于父元素宽度确定的情况
  • 子元素未设置宽度时,默认为父元素宽度的一半
  • 子绝父相。父:position: relative,子:position: absolute
<div class="h-c5">
    <p class="h-c5-child">谈笑有鸿儒,往来无白丁。谈笑有鸿儒,往来无白丁。</p>
</div>
.h-c5 {
    position: relative;
    width: 600px; /*或者宽度隐式声明*/
    height: 50px;
    background-color: #fbe;

    .h-c5-child {
      position: absolute;
      left: 50%; /* 相对于父元素的宽度 */
      transform: translateX(-50%); /* 相对于自己的宽度 */
      background-color: #fbf;
    }
}

display: flex + justify-content: center:应用于全部元素的子节点(弹性布局)

<div class="h-c6">
    <p>谈笑有鸿儒,往来无白丁。谈笑有鸿儒,往来无白丁。</p>
</div>
.h-c6 {
    display: flex;
    justify-content: center;
    background-color: yellowgreen;
}

垂直居中

padding-top/bottom:应用于块级元素

  • 父元素高度由子元素高度撑开(自适应)
  • 子元素设置padding-toppadding-bottom相等
  • 若节点不是块级元素需声明display: block
<div class="v-c1">
  <div class="v-c1-child">
    <span>谈笑有鸿儒,往来无白丁。谈笑有鸿儒,往来无白丁。</span>
  </div>
</div>
.v-c1 {
    background-color: #ffcc00;
    .v-c1-child {
      padding: 20px 0;
      background-color: #fff;
      background-clip: content-box;
    }
}

line-height:应用于行内元素

  • 父节点声明line-heightline-heightheight相等
  • 若节点不是行内元素需声明display: inline/inline-block

使行内元素居于父级容器中间,可用于使文本内容垂直居中。

<div class="v-c2">
    <span>谈笑有鸿儒,往来无白丁。谈笑有鸿儒,往来无白丁。</span>
</div>
.v-c2 {
  height: 100px;
  line-height: 100px;
  background-color: #6666ff;

  span {
    display: inline-block; /* 或inline */
    height: 30px;
    line-height: 30px;
    vertical-align: middle; /* 行内块级元素与匿名行内盒的基线对齐存在很大差异,所以需声明vertical-align:middle将其调整到垂直居中的位置 */
    background-color: red;
  }
}

display: table + display: table-cell + vertical-align: middle:应用于全部元素

<div class="v-c3">
    <div class="v-c3-child">display:table + display:table-cell + vertical-align:middle</div>
</div>
.v-c3 {
  display: table;
  height: 100px;
  background-color: #6666ff;

  .v-c3-child {
    display: table-cell;
    height: 50px; /* 设置高度无用,会与父节点高度一样 */
    vertical-align: middle;
    background-color: red;
  }
}

display: table-cell + vertical-align: middle:应用于全部元素的子节点

  • 父节点声明display: table-cell模拟表格布局的垂直居中
<div class="v-c4">
    <div>display:table-cell + vertical-align:middle</div>
</div>
.v-c4 {
  height: 100px;
  display: table-cell;
  vertical-align: middle;
  background-color: bisque;
}

position + top/bottom + margin-top/bottom + height:应用于全部元素

  • 适用于父子元素的高度都确定的情况
  • 子绝父相。父:position: relative,子:position: absolute
<div class="v-c5">
    <div class="v-c5-child">position + top/bottom + margin-top/bottom + height</div>
</div>
.v-c5 {
  position: relative;
  height: 100px;
  background-color: coral;

  .v-c5-child {
    position: absolute;
    top: 50%; /* 相对于父元素的高度 */
    height: 70px;
    margin-top: -35px; /* 子元素高度的一半的负数 */
    background-color: #6666ff;
  }
}

position + top/bottom + transform: translateY(-50%):应用于全部元素

  • 适用于父元素高度确定的情况
  • 子绝父相。父:position: relative,子:position: absolute
<div class="v-c6">
    <div class="v-c6-child">position + top/bottom + transform:translateY(-50%)</div>
</div>
.v-c6 {
  position: relative;
  height: 100px;
  background-color: #ffcc00;

  .v-c6-child {
    position: absolute;
    top: 50%; /* 相对于父元素的高度 */
    transform: translateY(-50%); /* 相对于自己的高度 */
    background-color: #6666ff;
  }
}

display: flex + align-item: center:应用于全部元素的子节点(弹性布局)

<div class="v-c7">
    <div>display: flex;</div>
    <span>display: flex;</span>
</div>
.v-c7 {
  display: flex;
  align-items: center;
  height: 100px;
  background-color: #ffbb00;
}

display: flex + margin: auto 0:应用于全部元素

  • 父节点声明display: flex;
  • 子节点声明margin: auto 0;
<div class="v-c8">
    <span class="v-c8-child">display: flex; margin: auto 0;</span>
</div>
.v-c8 {
  display: flex;
  height: 100px;
  background-color: #ffbbff;

  .v-c8-child {
    margin: auto 0; /* 只设置auto 可以让水平和垂直都居中 */
  }
}

父节点声明display: flex生成FFC容器,子节点声明margin: auto让浏览器自动计算子节点到父节点边上的距离。

有关居中布局:水平居中和垂直居中的更多相关文章

  1. ruby - nanoc 和多种布局 - 2

    是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'

  2. ruby - 在 Ruby 中,垂直线是什么? - 2

    1.upto(9){|x|printx}为什么这行不通?{printx|x}}y呢? 最佳答案 它用于传递给您的block的参数。即在您的示例中,upto将使用1到9中的每个数字调用您的block,当前值可作为x获得。block参数可以有任何名称,就像方法参数一样。例如1.upto(9){|num|putsnum是有效的。就像一个方法的参数一样,一个block也可以有多个参数。例如hash.each_pair{|key,value|puts"#{key}is#{value}"} 关于ru

  3. ruby-on-rails - Ruby on Rails 中的水平数据库扩展 - 2

    我有一个RubyonRails应用程序和一个具有以下结构的PostgreSQL数据库:classA只有几个A,而且增长缓慢(比如一个月5个)。每个A有数千个B,每个B有数万个C(因此每个A有数百万个C)。A是独立的,并且永远不会同时需要来自不同A的B和C(即在同一查询中)。我的问题是现在我只有几个A,ActiveRecord查询需要很长时间。当C的表有数千万行时,查询将永远无法进行。我正在考虑水平扩展数据库(即A的一张表,B的一张表和每个A的一张C的表)。但我不知道该怎么做。我猜这是一种分片,但我无法弄清楚如何动态创建数据库表并使用ActiveRecord访问数据(如果该表取决于我正在

  4. ruby-on-rails - 我可以在没有 Controller 的情况下直接从 routes.rb 渲染布局吗? - 2

    我想为网站的管理和公共(public)部分设置一对样式指南。每个都需要自己的布局,其中包含静态html和调用erbpartials的混合(因此静态页面不会削减它)。我不需要Controller来为这些页面提供服务,而且我不希望有效的仅开发内容使其余代码困惑。这让我想知道是否有一种方法可以直接呈现布局。免责声明:我明白这不是我应该经常/永远做的事情,而且我知道有很多争论可以解释为什么这是一个坏主意。我对这是否可能感兴趣。有没有办法让我直接从routes.rb渲染布局而不通过Controller? 最佳答案 出于某种奇怪的原因,我想暂时

  5. ruby-on-rails - 设计 Controller 如何改变布局? - 2

    这个问题在这里已经有了答案:differentlayoutforsign_inactionindevise(8个答案)关闭7年前。如何更改设计Controller中的布局?

  6. ruby-on-rails - Ruby on Rails 平均水平? - 2

    有没有一种简单的方法可以获取集合中某个属性的平均值?例如,每个用户都有一个分数。给定一组用户(@users),您如何获得该组的平均分?有没有类似@users.average(:score)的东西?我想我在数据库字段中遇到过类似的东西,但我需要它来处理集合...... 最佳答案 对于你的问题,实际上可以这样做:@users.collect(&:score).sum.to_f/@users.lengthif@users.length>0早些时候我认为,@users.collect(&:score).average会起作用。对于数据库字段

  7. ruby-on-rails - Rails - 如何在布局中查找域 url - 2

    我有request.env['http_host']在本地主机上工作,但在heroku的布局页面中引用时会导致错误。此请求在View中工作并显示正确的基本url,但是当我将代码移动到布局时它会导致错误。注意-我正在使用它来为html电子邮件中的图像构建绝对url。收到错误:ActionView::Template::Error(undefinedmethod`env'fornil:NilClass): 最佳答案 如果你想要没有端口的主机,只需使用:request.host编辑:糟糕,我刚刚注意到您正在使用View中的代码。我不知道它

  8. Ruby GUI(非复杂布局) - 2

    我对RubyGUI设计做了很多研究,这似乎是Ruby倾向于落后的领域。我探索了MonkeyBars、wxRuby、fxRuby、Shoes等选项,只是想从Ruby社区获得一些意见。虽然它们绝对可用,但每一个的开发似乎都在下降。我在任何(减去fxRuby书)上都找不到大量有用的文档或用户基础。我只是想制作一个简单的GUI,所以我真的不想花费数百小时来学习更复杂的工具的复杂性或尝试使用甚至不再开发的东西(鞋子是应用程序的类型我正在寻找,但它有很多问题并且没有得到积极开发。)在所有选项中,你们会推荐哪个选项是最快的,并且仍然具有某种开发基础?谢谢! 最佳答案

  9. ruby - Prawn :有没有办法让一个盒子里的所有内容垂直对齐? - 2

    我正在尝试将一些内容垂直居中放置在bounding_box中。对于单个文本,这没问题:bounding_box([0,bounds.top],:width=>pdf.bounds.right,:height=>pdf.bounds.top)dotext"verticallyalignedinthesurroundingbox",:valign=>:centerend但是如果我的边界框中有多个元素,我该怎么办:bounding_box([0,bounds.top],:width=>pdf.bounds.right,:height=>pdf.bounds.top)dotext"vertic

  10. ruby - Rails 渲染 Controller 中的部分和布局 - 2

    我正在覆盖设计注册Controller的创建操作。我有两种注册表格,个人或公司,公司有一个名为company_form的字段设置为true以区分这两种表格。在表单验证后,我希望呈现正确的表单(以前无论我使用什么表单,它都会返回默认表单)。我遇到了一个问题,即只渲染了部分(很明显,因为我只渲染了部分),但我还需要渲染布局/应用程序文件。classRegistrationsControllerifresource.company_formrenderpartial:'shared/company_signup_form'elserenderpartial:'/shared/individu

随机推荐