【问题标题】:Comma-separated spans with pure CSS使用纯 CSS 的逗号分隔跨度
【发布时间】:2021-03-23 16:11:37
【问题描述】:

我有 - 比方说 - 我的页面上有 4 个跨度。每个的内容都是通过我的视图模型的剔除填充的。有时内容在几个跨度内都是空的。我想以一种很好的逗号分隔方式显示它们,同时考虑到可能的空白。

我尝试了以下 HTML 和 CSS。

版本 1

它也为空跨度显示逗号

.comma:not(:last-child):after {
  content: ", ";
}
<span class="comma">A</span>
<span class="comma">B</span>
<span class="comma"></span>
<span class="comma">D</span>

第 2 版

如果最后一个跨度为空,它会显示(视觉上)最后一个逗号。

.comma:not(:empty):not(:last-child):after {
  content: ", ";
}
<span class="comma">A</span>
<span class="comma">B</span>
<span class="comma">C</span>
<span class="comma"></span>

无论间隙在哪里(如果有),我如何调整它以始终正确渲染? 我只需要支持现代浏览器(IE9+ 等)。

【问题讨论】:

  • 您究竟需要什么格式的 A、B、C、D?
  • 您的第二个解决方案似乎对我来说在小提琴上效果很好?
  • 哦,不,等一下。
  • 感谢大家的努力,@FabrizioCalderan 的回答看起来是目前最有希望的。

标签: html css


【解决方案1】:

我颠倒了逻辑,将逗号作为before 伪元素的内容,我处理了第一个跨度也可以为空的情况。

.comma:not(:first-child) {
  margin-left: -.3em;  
}

.comma:first-child:empty ~ .comma:not(:empty) {
  margin-left: 0;  
}

.comma:first-child:empty ~ .comma:not(:empty) ~ .comma:not(:empty) {
  margin-left: -.3em;  
}

.comma:empty {
  display: none;
}

.comma:not(:first-child):before {
  content: ", ";
}

.comma:empty + .comma:not(:empty):before {
  content : "";
}

.comma:not(:empty) ~ .comma:empty + .comma:not(:empty):before {
  content : ", ";
}
<div> 
  <span class="comma">A</span>
  <span class="comma">B</span> 
  <span class="comma">C</span>
  <span class="comma">D</span>
</div>

<hr />

<div>
  <span class="comma">A</span>
  <span class="comma">B</span> 
  <span class="comma"></span>
  <span class="comma">D</span>
</div>

<div>
  <span class="comma">A</span>
  <span class="comma">B</span> 
  <span class="comma">C</span>
  <span class="comma"></span>
</div>

<div>
  <span class="comma"></span>
  <span class="comma">B</span> 
  <span class="comma">C</span>
  <span class="comma">D</span>
</div>

<div>
  <span class="comma">A</span>
  <span class="comma"></span> 
  <span class="comma">C</span>
  <span class="comma">D</span>
</div>

<div>
  <span class="comma">A</span>
  <span class="comma">B</span> 
  <span class="comma"></span>
  <span class="comma"></span>
</div>

<div>
  <span class="comma">A</span>
  <span class="comma"></span> 
  <span class="comma">C</span>
  <span class="comma"></span>
</div>

<div>
  <span class="comma">A</span>
  <span class="comma"></span> 
  <span class="comma"></span>
  <span class="comma">D</span>
</div>

<div>
  <span class="comma"></span>
  <span class="comma">B</span> 
  <span class="comma">C</span>
  <span class="comma"></span>
</div>

<div>
  <span class="comma"></span>
  <span class="comma">B</span> 
  <span class="comma"></span>
  <span class="comma">D</span>
</div>

<div>
  <span class="comma"></span>
  <span class="comma"></span> 
  <span class="comma">C</span>
  <span class="comma">D</span>
</div>

<div>
  <span class="comma">A</span>
  <span class="comma"></span> 
  <span class="comma"></span>
  <span class="comma"></span>
</div>

<div>
  <span class="comma"></span>
  <span class="comma">B</span> 
  <span class="comma"></span>
  <span class="comma"></span>
</div>

<div>
  <span class="comma"></span>
  <span class="comma"></span> 
  <span class="comma">C</span>
  <span class="comma"></span>
</div>

<div>
  <span class="comma"></span>
  <span class="comma"></span> 
  <span class="comma"></span>
  <span class="comma">D</span>
</div>

<hr />
All empty:
<div>
  <span class="comma"></span>
  <span class="comma"></span> 
  <span class="comma"></span>
  <span class="comma"></span>
</div>

MDN 上提供有关 :empty 伪类的更多信息

【讨论】:

  • 很好,但你作弊了,你隐藏了空的;)
  • 好吧 :empty 受 IE9 支持,所以看起来是合法的:D
  • 这确实假设第一个跨度不是空的,对吧?
  • 这是因为 last-child 用于选择父元素的最后一个子元素。它不能用于选择给定父元素下具有特定类的最后一个子元素。 check this out
  • 谢谢,这看起来是我认为最有前途的,我很快就会测试它。
【解决方案2】:

切换它。不要在您的跨度之后放置逗号,而是将它放在 before 每个跨度之前(任意距离!)由一个非空跨度:

.comma:not(:empty) ~ .comma:not(:empty):before {
  content: ", ";
}

Fiddle

【讨论】:

  • 这留下了那个丑陋的空间。
  • 将此与 Fabrizio 的 margin-left: -.3em; 结合起来应该可以解决问题。
  • @Jackhardcastle 如果您在 html 标记之间没有空格 (fiddle),则不会。这就是 HTML works.
【解决方案3】:

http://jsfiddle.net/xtrabhwh/3/

<span class="comma">A</span><span class="comma">B</span><span class="comma">C</span><span class="comma"></span>

.comma ~ .comma:not(:empty):before {
    content: ", ";
}

【讨论】:

  • 都在一行的原因是,在每个跨度(nl 字符所在的位置)之后添加了一个空格。
【解决方案4】:

下面的内容应该可以做到,几乎可以用于任何组合,没有隐藏任何东西。

.comma:before {
  content: ','
}
.comma:empty:before,
.comma:first-of-type:before,
.comma:first-of-type+.comma:empty:before,
.comma:empty+.comma:not(:last-of-type):before,
.comma:empty+.comma:empty:before {
  content: '';
}
<h4>Missing first</h4>
<div>
  <span class="comma"></span>
  <span class="comma">item</span>
  <span class="comma">item</span>
  <span class="comma">item</span>
</div>
<h4>Missing last</h4>
<div>
  <span class="comma"></span>
  <span class="comma">item</span>
  <span class="comma">item</span>
  <span class="comma">item</span>
</div>
<h4>Missing first two</h4>
<div>
  <span class="comma"></span>
  <span class="comma"></span>
  <span class="comma">item</span>
  <span class="comma">item</span>
</div>
<h4>Missing last two</h4>
<div>
  <span class="comma">item</span>
  <span class="comma">item</span>
  <span class="comma"></span>
  <span class="comma"></span>
</div>
<h4>Missing middle</h4>
<div>
  <span class="comma">item</span>
  <span class="comma">item</span>
  <span class="comma"></span>
  <span class="comma">item</span>
</div>
<h4>Missing middle two</h4>
<div>
  <span class="comma">item</span>
  <span class="comma"></span>
  <span class="comma"></span>
  <span class="comma">item</span>
</div>

【讨论】:

  • 这很干净,但是当最后两个元素为空时会出现一个额外的逗号
  • @FabrizioCalderan - 查看修订版和用例 - 修订后的规则均通过
  • 很好,但...几乎:如果你只有 D 一个额外的逗号仍然出现。无论如何都做得很好。
猜你喜欢
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多