【问题标题】:How to force inline-block element to correctly wrap it's multiline child element?如何强制 inline-block 元素正确包装它的多行子元素?
【发布时间】:2015-08-17 12:25:14
【问题描述】:

我需要显示从居中文本的左右边缘填充 10 像素的左右边框。当所有文本都放入一行时没有问题,但是当文本占据多行时,环绕的 inline-block 元素会拉伸到其容器宽度的 100%。

我需要一个纯 CSS 解决方案。

这是 JSFiddle 与问题的工作演示:https://jsfiddle.net/k8wrbctr/

这是 HTML:

<div class="container">
<div class="borders-wrapper"><span>The title</span></div>
<div class="borders-wrapper"><span>The title that takes up multiple lines</span></div>
</div>

这是 CSS:

.container {

    width: 200px;
    text-align: center;
    background-color: #ddd;
}

.borders-wrapper {

    display: inline-block;
    border-left: 2px solid black;
    border-right: 2px solid black;
    padding-left: 10px;
    padding-right: 10px;
    margin-bottom: 20px;
}

结果如下:

            | The title |

|      The title that takes up      |
|           multiple lines          |

这就是我想要实现的目标:

            | The title |

     | The title that takes up |
     |      multiple lines     |

【问题讨论】:

  • 我还没有解决方案,我只是注意到在“向上”一词之后添加&lt;br&gt; 会导致边框按照您想要的方式放置。
  • 这个stackoverflow.com/questions/26459929/… 似乎是同样的问题。我希望其中一种解决方案对您有用!
  • 您可以添加类似“max-width: 80%;”的内容第二块
  • 感谢@icke,但您提供的链接没有任何纯 CSS 的有效解决方案。有一种使用 JS 的解决方案,但我真的不想诉诸于此,因为我正在制作的页面是响应式的,所以我必须绑定一个侦听器来调整事件大小并在每次用户调整窗口大小时重新计算宽度。我真的很想避免这种情况。
  • @icke:关于
    修复问题的有趣观察,不幸的是我也不能使用它,因为页面是响应式的,并且单词需要在不同的分辨率下以不同的方式中断。

标签: html css


【解决方案1】:

我需要显示从左边填充 10px 的左右边框 和右边缘

您需要为此提供margins 而不是padding

当文本占据多行时,换行 inline-block 元素 延伸到其容器宽度的 100%

这是因为内容很长,div 将尽可能地拉伸(直到父宽度)以容纳内容,然后再换行到下一行。

您的divinline-block 还有另一个问题 - 如果内容较少,则下一个div 将在第一个之后开始,而不是在自己的行上。

解决方案div 保留为inline-block):

使用伪元素换行。

* { box-sizing: border-box; }
.container {
    width: 200px;
    text-align: center;
    background-color: #ddd;
}
.borders-wrapper {
    display: inline-block;
    border-left: 2px solid black;
    border-right: 2px solid black;
    padding: 0px 10px; margin: 10px;
}
.borders-wrapper::after {
    content:"\A"; white-space:pre;
}
<div class="container">
    <div class="borders-wrapper"><span>The title</span></div>
    <div class="borders-wrapper"><span>The title that</span></div>
    <div class="borders-wrapper"><span>The title that takes up multiple lines</span></div>
</div>

注意

感谢@Kaiido 指出。伪元素技巧不适用于其元素为inline-block。为了让它工作,你在跨度上做你的填充/边距,并浮动divs。然后使用transform 技巧将其居中。稍微复杂一点。

示例

* { box-sizing: border-box; }
.container {
    width: 200px; 
    text-align: center;
    background-color: #ddd;
}
.borders-wrapper {
    float: left; clear: left;
    position: relative; left: 50%;
    transform: translateX(-50%);
    margin: 0px auto;
}
.borders-wrapper > span {
    display: inline-block; 
    padding: 0px 10px; margin: 10px;
    border-left: 2px solid black;
    border-right: 2px solid black;
}
.container:after { content:''; display:block; clear: both; }
.div2 { width: 400px; }
<div class="container">
    <div class="borders-wrapper"><span>The title</span></div>
    <div class="borders-wrapper"><span>The title that</span></div>
    <div class="borders-wrapper"><span>The title that takes up multiple lines</span></div>
</div>
<br />
<div class="container div2">
    <div class="borders-wrapper"><span>The title</span></div>
    <div class="borders-wrapper"><span>The title that</span></div>
    <div class="borders-wrapper"><span>The really long title that takes up multiple lines in a large width</span></div>
</div>

【讨论】:

  • 糟糕! @Kaiido:伪元素不破!感谢您指出...我需要再次检查。
  • 非常感谢@Kaiido。这真的很有帮助。我现在已经更新了答案,添加了一个应该跨宽度可靠工作的修复程序。
  • 我尝试了这两种解决方案,但它们似乎都不适合我。边框仍然粘在父元素的边缘,唯一的区别是您在 .borders-wrapper 元素上放置了边距,所以现在边框距离其父元素的边缘 10px。但是单行和多行元素的边框和文本之间的距离仍然不一样。
  • 如果内容太短,不要担心下一个元素会在第一个元素之后开始。容器中总是只有一个元素。
  • @GiedriusT:在多行的情况下,文本和边框之间不会发生精确的填充。这是因为自动换行。由被换行的单词引起的额外空格将添加到填充中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多