【问题标题】:How to center inline-block element with margin如何将内联块元素与边距居中
【发布时间】:2018-06-09 10:51:34
【问题描述】:

HTML:

<div id="wrap">
    <div id="block1"></div>
    <div id="block2"></div>
</div>

CSS:

div#wrap{
    margin-top: 3em;
    border: solid 1px black;
    text-align: center;
}

div#wrap *{
    display: inline-block;
    width: 12.5em;
    margin-top: 1em;
    height: 8em;
}

div#wrap *:not(:last-child){
    margin-right: 8em;
}

#block1{
    background: orange;
}

div#wrap #block2{
    background: magenta;
}

这两个块应该在响应式设计模式中居中。当屏幕足够宽以连续有 2 个块时,代码就可以工作。但是当我缩小屏幕时,由于边距,顶部块向左移动:

fiddle

是否可以在不使用媒体查询的情况下解决此问题?

编辑

我试过 flex-box:

div#wrap{
    margin-top: 3em;
    border: solid 1px black;
    display: flex;
    flex-flow: row wrap;
    justify-content: center;
}

fiddle2

【问题讨论】:

  • 您需要从第一个嵌套元素中删除 margin-right 属性。
  • @UncaughtTypeError 是的。但是当屏幕足够宽以连续包含 2 个元素时,我需要边距。媒体查询检查屏幕宽度是唯一的解决方案吗?
  • 这可能是当前 inline-block 配置中最安全的选择。如果您愿意探索flex-box 解决方案,您可能会有更多选择。
  • 正如@UncaughtTypeError 所说,最简单的解决方案是使用媒体查询删除边距,但前提是框的宽度已知并已固定
  • @UncaughtTypeError 我尝试了 flex,但无法使其工作。编辑了问题以显示我尝试过的内容。

标签: html css centering


【解决方案1】:

一种解决方案是使用 flex 和 justify-content:space-around 并删除边距:

div#wrap {
  margin-top: 3em;
  border: solid 1px black;
  justify-content:space-around;
  display: flex;
  flex-wrap: wrap;
}

div#wrap * {
  display: inline-block;
  width: 12.5em;
  margin-top: 1em;
  height: 8em;
}

#block1 {
  background: orange;
}

#block2 {
  background: magenta;
}
<div id="wrap">
  <div id="block1"></div>
  <div id="block2"></div>
</div>

【讨论】:

    【解决方案2】:

    如果您使用具有负边距的容器,则无需在不同断点处更改行端点的边距,您可以使用 inline-block。我在容器中将 font-size 设置为零,这样我就可以使用百分比来计算我的宽度,而不必担心空白。

    div#wrap {
      margin-top: 3em;
      border: solid 1px black;
      padding: 20px;
      text-align: center;
    }
    
    .block {
      display: inline-block;
      width: 12.5em;
      margin: 20px;
      height: 8em;
      font-size: 16px;
    }
    
    .block-container {
      margin: -20px;
      font-size: 0;
    }
    
    #block1 {
      background: orange;
    }
    
    #block2 {
      background: magenta;
    }
    <div id="wrap">
      <div class="block-container">
        <div class="block" id="block1"></div>
        <div class="block" id="block2"></div>
      </div>
    </div>

    【讨论】:

    • @user4035 所以你可以在两边都使用边距吗? :) 顺便说一句,我不明白这里需要负边距..您也可以删除它们和填充,它的行为会一样,不是吗?因为主要问题是居中,这是通过在两侧添加边距来解决的
    • @TemaniAfif 负边距对我来说是一种习惯,我不认为它在这里有什么好处,但它是多少像引导程序这样的网格布局无需管理边距即可实现全宽网格换行时的行尾。 helloerik.com/…
    • @TemaniAfif 我玩过这个解决方案。是的,诀窍是使用 margin-left 和 margin-right 来划分元素之间的边距。负边距用于消耗容器收缩后的空间。但它会创建水平滚动条,所以我删除了它。 Fiddle
    • @user4035 但我认为这个解决方案是你所拥有的替代方案,并不是真正解决你的问题(我当然没有反对它!)......但你的问题是通过仅在一侧有边距来居中元素对吗?或者你可以在两者中使用保证金?因为在这种情况下,还有很多其他的;)我会说我们不会有任何问题,因为一切都是对称的
    • @TemaniAfif “您的问题是通过仅在一侧设置边距来居中元素,对吧?” - 我的任务是在响应式设计模式下创建 2 个块,它们之间有一个空间。因此,当屏幕较窄时,它们可以在居中的列中移动。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2021-01-23
    • 2012-05-06
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多