Я сделал учебный инструмент, используя Javascript и PHP. Есть переключатель, который показывает/скрывает ключевые слова в абзаце, чтобы пользователь мог мысленно «заполнить пробелы».
До сих пор я делал это так: все ключевые слова подчеркивались, и я использовал селектор DOM для выбора всех тегов innerHTML в u.
<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 для замены каждого символа в ключевом слове символами подчеркивания, но всплывают еще две проблемы. Во-первых, даже если количество символов останется прежним, ширина может измениться. Например, «яблоко» не имеет такой же физической длины, как «______». Это не идеально, так как изменится поток документов. Вторая проблема заключается в том, что я не могу придумать, как вернуть ключевые слова после преобразования их в символы подчеркивания.
Один обходной путь: вместо изменения видимости на «скрытый» я мог бы изменить цвет фона на тот же цвет, что и текст. Это блокирует текст, но структура строки и поток документа сохраняются. Тем не менее, я надеюсь найти способ реализовать мою первоначальную идею, поэтому любое предложение приветствуется!
Обновление: я бы предпочел не добавлять дополнительные элементы div к ключевым словам. Пользователь может добавлять новые записи с помощью редактора форматированного текста, поэтому объявить ключевое слово так же просто, как подчеркнуть его в текстовом редакторе.
Ширину @JaromandaX bottom-border
изменить нельзя.
@JaromandaX Спасибо, но это не работает. Когда я меняю видимость на «скрытую», нижняя граница тоже скрывается.
Какой у вас размер шрифта?
@Jodast Размер шрифта 20 пикселей. Мне интересно, как это может что-то изменить?
@Panpaper просто что-то для кода, который я пишу в своем ответе
Я бы, вероятно, реализовал это, используя ваш второй метод. Установите цвет текста таким же, как фон, затем добавьте нижнюю границу к элементу. Сохраняет интервал и позволяет быстро проверить, правы ли вы, просто выделив строку. Кроме того, если вы дадите элементу оболочки ключевого слова класс, вы можете легко просто переключить цвет скрытого текста и сохранить подчеркивание, чтобы вы могли видеть, что изменилось.
div {
color: black;
}
span {
color: white;
text-decoration: none;
border-bottom: 2px solid green;
}
<div>
This <span>is hidden</span> with an underline
</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
Это сработало красиво, большое спасибо! Мне просто нужно удалить исходное подчеркивание в теге u, чтобы не получить лишнюю толстую линию.
Я нашел небольшую проблему с вашим решением. Кажется, что когда подчеркнутый текст (ключевые слова) переходит на новую строку, добавленное подчеркивание исчезает. Это немного проблематично, так как мой веб-сайт оптимизирован для мобильных устройств, а текстовые разрывы постоянно меняются. Знаете ли вы какие-либо решения? Большое спасибо!
@Panpaper, можешь привести более подробный пример? Я пытаюсь использовать ключевые слова во всех местах и не могу найти.
Итак, возьмите следующее предложение в качестве примера. В этом предложении есть подчеркнутая часть, <u>очень длинная и переходящая в новую строку</u>. В этом сценарии дополнительное подчеркивание, которое мы добавили с помощью «u::after», не отображается.
@Panpaper Вы можете поместить «каждое длинное ключевое слово» в <u></u>, и псевдоэлементы просто начинаются с каждого из них, например: <u>это </u> <u>является </u> < u>действительно </u> <u>долго </u> <u>и </u> <u>разбивается </u> <u>на </u> <u>а </u> <u> новая </u> <u>строка</u>
Вам нужно будет найти какой-то способ расположить div под скрытым текстом, но вы можете использовать следующий код для создания div с шириной текста. Я мог бы вернуться позже после ответа и найти способ разместить div.
Допустим, в вашем HTML у вас есть фраза foo bar
, которую вы хотите скрыть. Вы присвоите ему идентификатор с кодом: <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 является точной длиной текста.
Альтернативным решением было бы использование моноширинного шрифта, а затем вычисление ширины вручную.
Спасибо за подробный ответ! К сожалению, это добавляет некоторую зависимость от размера шрифта, что может быть не очень хорошо для просмотра на мобильных устройствах. Веб-сайт спроектирован так, чтобы быть адаптивным, а размер шрифта может динамически меняться при просмотре на мобильных устройствах.
использовать сплошную линию нижней границы