多个下划线的文本

19

我的应用程序是一个可以让用户注释和划线文本以供参考的在线文档。现在,多个用户可以进行此操作,因此每个下划线需要有不同的颜色。

所以基本要求是我需要在一段文本下面添加多个下划线。此外,下划线的颜色应该不同。

我知道一种困难的方法,就是我可以添加带有线条的 div/span 并将其定位在文本下方,但是在响应式窗口的情况下处理位置可能有些困难。

是否有任何使用文本属性的方法来实现这一点? 我在Google上搜索了一下,找到了这个链接

http://fsymbols.com/generators/lines/

他们正在使用 fsymbols 来生成下划线。 但是我不知道如何将其添加到我的应用程序中。而且它似乎不能有不同的颜色。

有更简单的方法吗?还是我只能采取困难的方法?


1
你说的“multiple”是指两个还是三个?因为在你展示的图片中只有两个。 - Ionut Necula
1
你能提供一个最终结果的例子吗? - ppovoski
如果你只需要两个,你可以将 border-bottomtext-decoration: underline 结合起来。 - display-name-is-missing
1
@lonut:是的,多行,因为用户数量可能不止一个。 - pravid
5个回答

23

在文本中使用文本进行注释似乎不是正确的方法。我认为应该通过标记来进行注释。要实现多个下划线(我知道可能有两个以上的用户),可以在嵌套的span中使用border-bottoms。这些需要设置为显示为inline-block,以便可以影响它们的高度,因此可以嵌套更多的span而不会覆盖边框。还需要考虑到可能发生的重叠 - 也可以是非层次结构的。

请注意,我从用户列表和其关联颜色的下划线本身中保留了它们。

span.user { border-bottom:1px solid; display:inline-block; padding-bottom:1px; }

span[data-uid='001'] { border-bottom-color:blue; }
span[data-uid='002'] { border-bottom-color:red; }
span[data-uid='003'] { border-bottom-color:orange; }
<p>
Lorem ipsum dolor sit <span class="user" data-uid="003">amet, <span class="user" data-uid="001"><span class="user" data-uid="002">consectetuer</span> adipiscing elit</span>. Aenean</span> commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. <span class="user" data-uid="001">Donec <span class="user" data-uid="003">quam</span> felis,</span> ultricies nec, pellentesque eu, pretium quis, sem. <span class="user" data-uid="003">Nulla</span> consequat massa quis enim. Nullam dictum <span class="user" data-uid="001">felis eu pede mollis pretium. </span><span class="user" data-uid="002"><span class="user" data-uid="001">Integer</span> tincidunt.</span> Cras dapibus. 
</p>

编辑:

我发现了一个更好的解决方案,可以解决使用“display:inline-block”时引起的换行问题:

p { width:150px; line-height:2em; }

span.annotation { border-bottom:1px solid; }

span.annotation span.annotation { padding-bottom:2px; }

span.annotation span.annotation span.annotation { padding-bottom:4px; }

span.annotation span.annotation span.annotation span.annotation { padding-bottom:6px; }

span[data-uid="001"] { border-color:orange; }
span[data-uid="002"] { border-color:blue; }
span[data-uid="003"] { border-color:red; }
span[data-uid="004"] { border-color:green; }
<p>
Lorem <span class="annotation" data-uid="004">ipsum dolor <span class="annotation" data-uid="001">sit amet, <span class="annotation" data-uid="002">consectetuer adipiscing</span> elit.</span> Aenean commodo ligula eget dolor. Aenean massa. <span class="annotation" data-uid="002">Cum sociis <span class="annotation" data-uid="001">natoque penatibus et <span class="annotation" data-uid="003">magnis</span> dis parturient montes, nascetur</span> ridiculus mus.</span> Donec quam felis, ultricies nec, <span class="annotation" data-uid="002">pellentesque eu, </span><span class="annotation" data-uid="001"><span class="annotation" data-uid="002">pretium</span> quis, sem.</span> Donec pede justo, fringilla vel, aliquet nec,</span> vulputate eget, arcu.
</p>

这里唯一不喜欢的是,对于每个嵌套层级都需要一个CSS声明(使用LESS可能更容易)。但是,在应用程序中,您会将注释图层的显示限制为(假设)五个,并找到另一种方法来显示有超过五个注释图层。

1
到目前为止,我认为这是最好的解决方案。我尝试了类似的东西,但没有想出支持多行注释/响应的解决方案,这似乎也是一个问题。 - Marvin
是的,有不同的行高,而且换行可能需要改进。 - friedemann_bach
1
例如,如果有一个跨越第1行和第2行的span元素,边框将不会在第2行下划线文本。你需要调整浏览器窗口大小才能在示例中看到它,或者只是假设用户选择了从“Lorem”到“dapibus”的整个文本进行注释。/编辑:是的,“line-breaking”就是我要找的词。 - Marvin
已更新。我认为这解决了换行问题。 - friedemann_bach

5
你可以这样做:

像这样执行

p {
  text-decoration: underline overline line-through;
  border-top: 3px solid red;
  border-bottom: 3px solid green;
  display: inline-block;
  padding: 2px 0 0 0;
  font-size: 50px;
  margin: 0;
}
<p>Test</p>


3
很好的演示了如何使用线条装饰文本的所有可能性。但这并没有解决原来的问题。 - friedemann_bach

3

看起来他们只是使用了上划线和下划线的组合。

http://www.fileformat.info/info/unicode/char/0332/browsertest.htm

http://www.fileformat.info/info/unicode/char/0305/browsertest.htm

我不确定你能否使组合下划线的颜色与文本不同,但在某些浏览器中,可以更改文本装饰的颜色。 修改下划线颜色

这对我在Chrome中不起作用。

.example {
  text-decoration: underline;
  -webkit-text-decoration-color: red;
  -moz-text-decoration-color: red;
  /* vendor prefix not required as of V36 */
  text-decoration-color: red;
  /* color: green; */

}
<b class="example">text-decoration</b>  <br/>

  
<b style="color:red">u̲n̲d̲e̲r̲l̲in̲̲̲̲̲e̲<b><br/>
  
  
  
  


3
到目前为止,所有答案都不完整。
您的主要要求是:
应用程序是一些在线文档,用户可以对其进行注释和下划线以供参考。现在这可以由多个用户完成,因此需要为每个下划线使用不同的颜色。
根据上述引用,需要将所有单词、空格甚至字母保留为单独的内联元素,例如
为什么?
每个用户都可以注释文本(因此可以选择每个标记)
请注意,当注释很长并且断开到另一行时,下划线(边框)也应保留垂直位置
当每个元素都分开时,特别是当您想使用响应式布局时,处理注释肯定会更容易。
让我们看一个例子:
请注意,用户可以选择每个符号
下划线位置被保留(这里需要JavaScript)
可以支持多个注释级别(这里使用了JavaScript)
它是完全响应式的(尝试缩小、扩展fiddle的预览窗格)
Fiddle: https://jsfiddle.net/00w5f0c9/1/

这似乎也是一个不错的解决方案。我对这两个解决方案的另一个担忧是,如果我们正在处理大量文档并且许多用户正在注释文本,那么它会影响性能吗? - pravid
这取决于你所说的“巨大”是什么意思。我已经对JavaScript执行时间进行了简单的测试,对于25k个span元素,它需要大约5秒钟的时间。显然,JavaScript代码可以进行优化,或者在呈现文档时可以限制span元素的数量。Fiddle:https://jsfiddle.net/00w5f0c9/2/ - luke

1

p {
  font-family:tahoma;
   font-size:16px;
}

span {

  border-bottom:1px solid blue;
  position:relative;
  display:inline-block;
 
}
span:before {
  content:'';
  position:absolute;
  left:0;
  bottom:-3px;
  border-bottom:1px solid red;
  display:block;
  width:100%;
  
}
span:after {
  content:'';
  position:absolute;
  left:0;
 bottom:-5px;
  border-bottom:1px solid green;
  display:block;
  width:100%;
  
}
<p>
non-decorated text <span>decorated text</span> non-decorated <span>decorated text</span>
not decorated
</p>

你可以尝试使用after和before伪元素,也可以添加更多行,像这样...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接