【问题标题】:how to justify text in multiple links vertically如何垂直对齐多个链接中的文本
【发布时间】:2020-06-07 15:08:43
【问题描述】:

我需要垂直对齐下面的所有链接,即在左侧和右侧。
font-size 应该保持原样。
显然,唯一的方法是调整letter-spacing,但是否可以对.wrap 内的所有链接自动执行此操作。

a{display:block; text-decoration:none;}
.a1{font-size:0.7rem;}
.a2{font-size:1rem;}
.a3{font-size:1rem;}
.a4{font-size:0.7rem;}
<div class='wrap'>
<a href='index.php' class='a1'>LOREM IPSUM</a>
<a href='index.php' class='a2'>DOLOR SIT</a>
<a href='index.php' class='a3'>BLUE SKY</a>
<a href='index.php' class='a4'>DEEP OCEAN</a>
</div>

【问题讨论】:

  • 你能在left and right side.上解释更多吗?你需要在一列还是一行?
  • 这里有一个类似问题的解决方案(但将其应用于单个单词):stackoverflow.com/a/4355274/5641669
  • 如果您的字体大小和样式不会改变,不妨找出最适合的字母间距并在您的 CSS 中进行设置。如果字体大小或样式可能发生变化,为什么不使用 JS?获取所有元素的最大宽度,然后遍历每个项目并可能增加字母间距,直到达到所需的宽度,然后移动到下一个元素。似乎有点脏,但它应该工作。另一种解决方案是将每个字母包装在 span 中的标签内,并在元素上使用 display:flex 来分隔字母。
  • @Manjuboyz,在一栏
  • @ChrisL 调整文本大小应通过调整字符间距来完成。我认为您的解决方案改为调整文本的大小

标签: html css letter-spacing


【解决方案1】:

这就是我想出的。有点“脏”,但它正是你想要的。您可能会找到改进代码的方法,因为我的代码两次运行相同的循环,但我写得很快。至少你会有一个想法。

首先,将标签的显示设置为 inline-block 以便能够测量所有标签的最大宽度。一旦你有了 maxWidth,循环遍历所有元素,将每个字符包装在一个 span 中,并将标签的显示设置为 flex。

CSS:

a{
  display: inline-block;
  width: auto;
  justify-content: space-between;
  text-decoration:none;
  clear: both;
}
a.flex{
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}
.a1{font-size:0.7rem;}
.a2{font-size:1rem;}
.a3{font-size:1rem;}
.a4{font-size:0.7rem;}
a span{
  display:inline-block;
}

JS:

var elements = document.querySelectorAll(".wrap > a");
 var maxWidth = 0;
 for (var i = elements.length - 1; i >= 0; i--) {
    maxWidth = Math.max(maxWidth, elements[i].offsetWidth);
 }
 for (var i = elements.length - 1; i >= 0; i--) {
    elements[i].classList.add("flex");
    elements[i].style.width = maxWidth+ "px";
    var text = elements[i].textContent;
    text.split("");
    elements[i].innerHTML = "";
    for (var j = 0; j < text.length; j++) {
       var span = document.createElement("span");
       // Fix: issue reported by Chris L
       // Replace space with non-breaking space HTML code
       span.innerHTML = (text[j] === " ")? "&nbsp;" : text[j];
       elements[i].appendChild(span);
    }
 }

这里的工作示例:https://jsfiddle.net/nLdx923c/

【讨论】:

  • 这是相当不错的 IMO,但它将单词之间的空格宽度设置为零,使其看起来根本没有空格。
  • 但是添加一个min-width(以em为单位)可以解决这个问题:jsfiddle.net/0qhezcj7
  • 检查器显示空间跨度没有宽度,但是,以“蓝天”为例,当您将每个字符的宽度相加时,它比全宽 83 少 9.78 . 所以这个空间必须有9.78的宽度,虽然用肉眼看起来没有那么宽。不过仔细看,空间跨度肯定有一点空间。
  • 确实如此。我编辑了我的回复。现在应该没事了。
【解决方案2】:

一种至少接近您想要的方法:使用text-align-last: justifyem 中的letter-spacing 值(即相对于字体大小)和包装元素上的固定宽度,找到合适的值通过反复试验:

.wrap {
  width: 95px;
}

a {
  display: block;
  text-decoration: none;
}

.a1 {
  font-size: 0.7rem;
}

.a2 {
  font-size: 1rem;
}

.a3 {
  font-size: 1rem;
}

.a4 {
  font-size: 0.7rem;
}

a {
  text-align-last: justify;
  letter-spacing: 0.08em;
}
<div class='wrap'>
  <a href='index.php' class='a1'>LOREM IPSUM</a>
  <a href='index.php' class='a2'>DOLOR SIT</a>
  <a href='index.php' class='a3'>BLUE SKY</a>
  <a href='index.php' class='a4'>DEEP OCEAN</a>
</div>

【讨论】:

  • deepocean 之间的差距在任何情况下都很大,但是......我明白了 - 这是 css 的最大可能
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多