javascript - 如何将文本更改为不可见,但仍显示下划线?

标签 javascript css dom visibility getelementsbytagname

我使用 Javascript 和 PHP 制作了一个学习工具。有一个显示/隐藏段落中关键字的开关,因此用户可以在心里“填空”。

到目前为止,我是如何做到这一点的,所有关键字都带有下划线,并且我使用 DOM 选择器来选择 u 标签中的所有 innerHTML。

<p>
  Example sentence, <u>this</u> is a <u>keyword</u>.
</p>
<button onClick='hideKeywords()'>Hide Keywords</button>

<script>
  function hideKeywords() {
    var x = Array.from(document.getElementsByTagName('u'));
    for (var i = 0; i < x.length; i++) {
      x[i].style.visibility = "hidden";
    }
  }
</script>

这按预期工作 - “关键字”被删除并且文档流不受影响,因为关键字仍然占用它们通常占用的相同空间。

一个缺点是,在“关键字”特别长的段落中,段落的行结构被打乱,看起来文本只是随机地漂浮在空间中。如果我能以某种方式改变可见性,使关键字中的单词被隐藏并且文本装饰(下划线)仍然显示,这将是可以解决的。这保留了行结构。

我想过用 Javascript 把关键字中的每个字符都替换成下划线,但是又弹出了两个问题。一件事是即使字符数保持不变,宽度也可能会改变。例如,“apple”与“______”的物理长度不同。这并不理想,因为文档流会发生变化。第二个问题是,在将关键字转换为下划线后,我想不出任何方法来取回关键字。

一种解决方法是不将可见性更改为“隐藏”,而是将背景颜色更改为与文本相同的颜色。这挡住了文本,但行结构和文档流都被保留了下来。不过,我确实希望找到一种方法来实现我最初的想法,因此我们将不胜感激任何建议!

更新:我不想在关键字中添加任何额外的 div。用户可以使用富文本编辑器添加新条目,因此声明关键字就像在文本编辑器中添加下划线一样简单。

最佳答案

你可以用 css 添加一个伪元素而不是使用隐藏的可见性,使用颜色:透明,就像这样:

u{
  position:relative;
}
u::after{
  content: ' ';
  display:block;
  position:absolute;
  bottom:0;
  left:0;
  width: 100%;
  height:1px;
  background-color:#000;
}

在脚本中

<script>
  function hideKeywords() {
    var x = Array.from(document.getElementsByTagName('u'));
    for (var i = 0; i < x.length; i++) {
      x[i].style.color = "transparent";
    }
  }
</script>

https://codepen.io/anon/pen/ROoMaM

关于javascript - 如何将文本更改为不可见,但仍显示下划线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55582839/

相关文章:

javascript - 如果我的脚本位于正文末尾,我应该使用 DOM 就绪函数吗?

html - 滚动条更改双列 html 布局中第二列的大小

javascript - this.context 返回一个空对象

html - 缺少几个像素的 css 高度

html - Flexbox 垂直对齐一些元素在顶部,一些元素在底部

jquery - Bootstrap slider 向右移动

javascript - 使用 isPointInPath() 和响应式设计的多 Canvas 多边形检测图

javascript - 带有响应式 HTML5 视频的 Bootstrap 轮播?

javascript - 为什么我的 3em div 比我的 3em 渐变图案小?

javascript - 获取插入符位置的元素节点(在 contentEditable 中)