我使用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。用户可以使用富文本编辑器添加新条目,因此声明关键字就像在文本编辑器中加底线一样简单。
答案 0 :(得分:5)
您可以通过使用CSS添加伪元素来做到这一点,而不是使用隐藏的可见性,而使用color:transparent,如下所示:
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>
答案 1 :(得分:0)
我可能会使用您的第二种方法来实现。将文本颜色设置为与背景相同,然后向元素添加底部边框。保留间距并允许您仅通过突出显示线条来快速检查是否正确。另外,如果为关键字wrapper元素提供一个类,则可以轻松地切换隐藏文本的颜色,并保留下划线,以便您查看已更改的内容。
div {
color: black;
}
span {
color: white;
text-decoration: none;
border-bottom: 2px solid green;
}
<div>
This <span>is hidden</span> with an underline
</div>
答案 2 :(得分:0)
您将必须找到某种方法来将div定位在隐藏的文本下方,但是您可以使用以下代码创建一个具有文本宽度的div。我可能会在回答后稍后再回来,并找到一种方法来定位div。
在您的HTML中,假设您有一个短语foo bar
要隐藏。您将使用以下代码为其分配ID:<p id="foo">foo bar</p>
这是CSS:
#foo {
position: absolute;
visibility: hidden;
height: auto;
width: auto;
white-space: nowrap;
}
然后在您的Javascript中,您可以使用以下代码:
var fontSize = 20; //this defines a font size
var foo = document.getElementById("foo");
foo.style.fontSize = fontSize; //this sets the style as the font size
var width = (foo.clientWidth) + "px"
var div = document.createElement("div");
div.style.width = width;
div.style.height = 2px;
div.style.background = "red"; //makes the underline visible
document.getElementById("main").appendChild(div);
从这里开始,您可能只是想按自己的意愿重新放置div,使其显示在文本下方。这样,div就是文本的确切长度。
另一种解决方案是使用等宽字体,然后手动计算宽度。