如何左对齐 div 表中的文本以使行均匀分布?

平面设计 网站设计 页面布局 css
2022-02-14 13:17:04

我正在尝试安排一些名称。我在使用 generateata.com 发布之前更改了它们,但真实的按字母顺序从左到右每行。

我试图弄清楚如何使“列”均匀分布,因为您可以看到右列的右侧有多余的空间。在此示例中,我希望Tincidunt Nibh Phasellus Company与父容器边缘的距离与第一列左侧的距离相同(即:Ut Quam Vel Company)。

Codepen.io 上的相关代码

截屏:

在此处输入图像描述

HTML 标记:

<div class="inner body">
<section class="round-border">
    <div class="distributors-row">
        <div class="distributor-left">Egestas Nunc Sed Company</div>
        <div class="distributor-middle">Hendrerit A Arcu Institute</div>
        <div class="distributor-right">Molestie Sed Id Incorporated</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Ut Quam Vel Company</div>
        <div class="distributor-middle">Donec Egestas Duis LLC</div>
        <div class="distributor-right">Tincidunt Nibh Phasellus Company</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Praesent Luctus Company</div>
        <div class="distributor-middle">Curae; Donec Consulting</div>
        <div class="distributor-right">Magna A LLC</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Malesuada Ut Corporation</div>
        <div class="distributor-middle">Sit Amet Consectetuer Incorporated</div>
        <div class="distributor-right">Cum Sociis Foundation</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Rutrum Fusce Inc.</div>
        <div class="distributor-middle">Iaculis Odio Nam Limited</div>
        <div class="distributor-right">Interdum Libero Dui Institute</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Eget Laoreet LLC</div>
        <div class="distributor-middle">Elit Fermentum Risus Institute</div>
        <div class="distributor-right">Aliquet Proin Velit Company</div>
    </div>
    </section>

</div>    

CSS 格式:

body {
background-color: #eee;
background-image: url(../images/patterns/light_toast.png);
color: rgba(102, 102, 102, 1);
font-family: 'Open Sans', sans-serif;
font-size: 16px;
margin:0px;
padding:0px;
}
.inner {
margin: 0 auto;
max-width: 940px;
padding: 0 40px;
}
.distributor-left {
float: left;
width: 33%;
margin: none;
text-align: left;
}
.distributor-middle {
float: left;
width: 33%;
margin: none;
text-align: left;
}
.distributor-right {
float: left;
width: 33%;
margin-left: none;
text-align: left;
}
.round-border {
border: 1px solid #eee;
border: 1px solid rgba(0, 0, 0, 0.05);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
padding: 10px;
margin-bottom: 5px;
clear: both;
}
.round-border:after {
content: "";
display: block;
clear: both;
}
#wrap {
margin: 0 auto;
}

我尝试了一些不同的方法,但大多数都没有解决问题。它们更适用于此处不适用的水平导航菜单。我尝试margin-left.distributor-right班级调整,但一旦它变成margin-left: 10px下一行,而margin-left: 9px它仍然没有很好地分布。

最终结果应该有这个间距,其中那些红色区域与文本自动完全相同:

在此处输入图像描述

4个回答

首先,我将重构 HTML。为每一行文本设置一个 div 是多余的。您只需要 4 个 div,然后是文本段落。

包含 div
三列 div
文本段落

<div id="wrap">
    <?php include 'menu.php'; ?>

    <div class="inner body">
    <section class="round-border">

        <div class="distributors-row">
            <div class="distributor-left">
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
          </div>
            <div class="distributor-middle">
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p></div>
            <div class="distributor-right">
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p></div>
        </div>
        </section>

    </div>

最终,这将使编辑变得更加容易。

然后对 CSS 进行一些简单的调整,让它可以很好地发挥作用:

body {
    background-color: #eee;
    background-image: url(../images/patterns/light_toast.png);
    color: rgba(102, 102, 102, 1);
    font-family: 'Open Sans', sans-serif;
    font-size: 16px;
    margin:0px;
    padding:0px;
}

.inner {
    margin: 0 auto;
    max-width: 940px;
    padding: 0 40px;
}


.distributors-row > div { 
    float: left;
    width: 33.3%;
    margin-left: none;
    padding: 5px 0;
    text-align: left; } */ one CSS definition for all 3 columns */
p { margin:0; text-indent: 10px; } */ added to move text off left edge slightly */

.round-border {
    border: 1px solid #eee;
    border: 1px solid rgba(0, 0, 0, 0.05);
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    border-radius: 4px;
    padding: 10px;
    margin-bottom: 5px;
    clear: both;
}

.round-border:after {
    content: "";
    display: block;
    clear: both;
}

#wrap {
    margin: 0 auto;
}

示例链接

在没有背景颜色的左对齐文本列中实现,文本的行长将改变您对列宽的感知。除非你想证明每一行文本的合理性(我不建议这样做),否则右边缘参差不齐,不应该是一个大问题。

我将假设因为这个列表是从左到右按字母顺序排列的,所以您的 html 结构是这样的,当设计堆叠在较小的视口上时,它将按字母顺序排列,因为这就是 html 中的顺序。但是,为了实现您想要的设计,我会使用媒体查询来隐藏和显示两个不同的列表。然后我会使用一个无序列表,而不是在 html 中按字母顺序排列,而是在视觉上。

演示:http: //jsbin.com/kiyora/

在此处输入图像描述

.distributors {
    display: none
}
.distributors-list {
    display: block
}
@media (min-width:870px) { 
    .distributors-list {
        display: none
    }
    .distributors {
        width: 100%;
        padding: 10px;
        display: block;
        overflow:hidden;
        margin:0 auto;
        max-width:980px;
        box-sizing: border-box;
        border-radius: 10px;
        border: 1px solid red;
    }
    .distributors .distributor {
        width: 36%;
        padding: 0;
        margin: 0;
        list-style: none;
        float: left;
        box-sizing: border-box;
    }
    .distributors .distributor:nth-child(even) {
        width: 33%
    }
    .distributors .distributor:last-child {
        width: auto;
        float: right;
    }
}

HTML:

<section class="distributors-list">My alpha list for small viewport widths</section>

<section class="distributors">
   <ul class="distributor">
      <li>Egestas Nunc Sed Company</li>
      <li>Hendrerit A Arcu Institute</li>
      <li>Molestie Sed Id Incorporated</li>
      <li>Ut Quam Vel Company</li>
      <li>Donec Egestas Duis LLC</li>
      <li>Tincidunt Nibh Phasellus Company</li>
   </ul>
   <ul class="distributor">
      <li>Egestas Nunc Sed Company</li>
      <li>Hendrerit A Arcu Institute</li>
      <li>Molestie Sed Id Incorporated</li>
      <li>Ut Quam Vel Company</li>
      <li>Donec Egestas Duis LLC</li>
      <li>Tincidunt Nibh Phasellus Company</li>
   </ul>
   <ul class="distributor">
      <li>Egestas Nunc Sed Company</li>
      <li>Hendrerit A Arcu Institute</li>
      <li>Molestie Sed Id Incorporated</li>
      <li>Ut Quam Vel Company</li>
      <li>Donec Egestas Duis LLC</li>
      <li>Tincidunt Nibh Phasellus Company</li>
   </ul>
</section>

你不必重写你的代码

.distributor-middle {
    text-align: center;
}

.distributor-right {
    text-align: right;
}

这将在中间为您提供居中的文本。您还可以将单个项目包装在另一个 div 中,并给中间一个margin: 0 autoand text-align: justifyor something 和最后一个float: right;

如果你想保持文本左对齐并且你只希望右边缘被触摸,那么只需将每个东西包装在内容之间的另一个 div 中.distributor-middle并将其设置为,display: inline-block;以便 div 成为内容的维度,然后将中间一个设置为margin: 0 auto;.distributor-righttext-align: right;

我同意 Scott 的观点,“衣衫褴褛的右边缘是意料之中的,不应该是一个大问题。” 当您使用长度可以完全可变的单词列表以及尝试进行响应式设计(我认为您的代码表明)时,您无能为力。

我没有采取一种方法来做到这一点,而是冒昧地改进了 Scott 建议的优化方法,并使用了我自己的一些方法。对于这个列表的设计,我也有一些简单的建议。为了便于使用,我将以项目符号格式进行介绍。

  • 按字母顺序排列的列表应该水平排列而不是垂直排列,因为列表元素之间的视觉联系和接近度水平流动比垂直流动多得多。(您可能已经计划好了,但我不知道生成的示例内容)。

  • Scott 建议的三列五列对我来说比五行三列更有意义,因为它在页面上的外观。更重要的是,如果在某些古老的浏览器上渲染不正确,那么 5 行 3 的损坏可能比 3 列 5 的损坏要严重得多。

  • 应不惜一切代价避免浮动!由于某些 IE 中的可怕错误和所需的烦人解决方法,我花了很长时间使用浮点数并寻找替代方案。替代品确实存在,而且效果更好!我个人选择通过 CSS 将表格属性应用于元素。

  • 强调我的观点,CSS 表格属性甚至退化得非常好,并且支持回 IE5。如果内容被挤压或者发生了一些奇怪的事情,无论如何浏览器仍然会显示带有 CSS 标记的表格内容。它会溢出并做任何必要的事情,将最高优先级放在在表格元素中显示内容 - 尤其是文本内容(有时会牺牲图像来显示文本)。

  • 列表项之间的更多空白似乎使注意力从参差不齐的右边缘上移开,至少在我的脑海中是这样。我使用了 1.5 的行高

  • 在元素上放置圆角边框<section>是个坏主意,因为圆角边框比 HTML5 得到更广泛的支持(我认为),所以我将它移到了的直接子元素上,<section>结果相同。

这是我的优化

的HTML:

<div id="wrap">
  <?php include 'menu.php'; ?>
  <div class="inner">
    <section>
      <div class="container round-border">
        <ol class="column">
          <li>Egestas Nunc Sed Company</li>
          <li>Ut Quam Vel Company</li>
          <li>Praesent Luctus Company</li>
          <li>Malesuada Ut Corporation</li>
          <li>Rutrum Fusce Inc.</li>
          <li>Eget Laoreet LLC</li>
        </ol>
        <ol class="column">
          <li>Hendrerit A Arcu Institute</li>
          <li>Donec Egestas Duis LLC</li>
          <li>Curae; Donec Consulting</li>
          <li>Sit Amet Consectetuer Incorporated</li>
          <li>Iaculis Odio Nam Limited</li>
          <li>Elit Fermentum Risus Institute</li>
        </ol>
        <ol class="column">
          <li>Molestie Sed Id Incorporated</li>
          <li>Tincidunt Nibh Phasellus Company</li>
          <li>Magna A LLC</li>
          <li>Cum Sociis Foundation</li>
          <li>Interdum Libero Dui Institute</li>
          <li>Aliquet Proin Velit Company</li>
        </ol>
      </div>
    </section>
  </div>
</div>

CSS:

*, ol, li {
  margin: 0;
  padding: 0;
  list-style-type: none;
  vertical-align: middle;
  text-align: left;
}

body {
  background-color: #eee;
  background-image: url(../images/patterns/light_toast.png);
  color: rgba(102, 102, 102, 1);
  font-family: 'Open Sans', sans-serif;
  font-size: medium;
}

#wrap, .inner {
  margin: 0 auto;
}

.inner {
  display: block;
  width: auto;
  max-width: 940px;
}

.container {
  display: table;
}

.round-border {
  border: 0.100em solid #eee;
  border: 0.100em solid rgba(0, 0, 0, 0.05);
  -webkit-border-radius: 0.400em;
  -moz-border-radius: 0.400em;
  border-radius: 0.400em;
  padding: 0.600em;
  margin-bottom: 0.500em;
}

.column {
  display: table-cell;
  width: 33.333333333333333%;
  width: calc(100/3);
}

.column li {
  display: inline-block;
  width: 100%;
  line-height: 1.5;
}