Как сделать текст невидимым, но при этом показать подчеркивание?

Я сделал учебный инструмент, используя 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 к ключевым словам. Пользователь может добавлять новые записи с помощью редактора форматированного текста, поэтому объявить ключевое слово так же просто, как подчеркнуть его в текстовом редакторе.

использовать сплошную линию нижней границы

Jaromanda X 09.04.2019 00:53

Ширину @JaromandaX bottom-border изменить нельзя.

Jodast 09.04.2019 01:00

@JaromandaX Спасибо, но это не работает. Когда я меняю видимость на «скрытую», нижняя граница тоже скрывается.

Panpaper 09.04.2019 01:01

Какой у вас размер шрифта?

Jodast 09.04.2019 01:11

@Jodast Размер шрифта 20 пикселей. Мне интересно, как это может что-то изменить?

Panpaper 09.04.2019 01:13

@Panpaper просто что-то для кода, который я пишу в своем ответе

Jodast 09.04.2019 01:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
6
1 493
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я бы, вероятно, реализовал это, используя ваш второй метод. Установите цвет текста таким же, как фон, затем добавьте нижнюю границу к элементу. Сохраняет интервал и позволяет быстро проверить, правы ли вы, просто выделив строку. Кроме того, если вы дадите элементу оболочки ключевого слова класс, вы можете легко просто переключить цвет скрытого текста и сохранить подчеркивание, чтобы вы могли видеть, что изменилось.

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 09.04.2019 01:23

Я нашел небольшую проблему с вашим решением. Кажется, что когда подчеркнутый текст (ключевые слова) переходит на новую строку, добавленное подчеркивание исчезает. Это немного проблематично, так как мой веб-сайт оптимизирован для мобильных устройств, а текстовые разрывы постоянно меняются. Знаете ли вы какие-либо решения? Большое спасибо!

Panpaper 09.04.2019 10:19

@Panpaper, можешь привести более подробный пример? Я пытаюсь использовать ключевые слова во всех местах и ​​не могу найти.

Chema 09.04.2019 15:50

Итак, возьмите следующее предложение в качестве примера. В этом предложении есть подчеркнутая часть, <u>очень длинная и переходящая в новую строку</u>. В этом сценарии дополнительное подчеркивание, которое мы добавили с помощью «u::after», не отображается.

Panpaper 09.04.2019 19:16

@Panpaper Вы можете поместить «каждое длинное ключевое слово» в <u></u>, и псевдоэлементы просто начинаются с каждого из них, например: <u>это </u> <u>является </u> < u>действительно </u> <u>долго </u> <u>и </u> <u>разбивается </u> <u>на </u> <u>а </u> <u> новая </u> <u>строка</u>

Chema 10.04.2019 10:30

Вам нужно будет найти какой-то способ расположить 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 является точной длиной текста.

Альтернативным решением было бы использование моноширинного шрифта, а затем вычисление ширины вручную.

Спасибо за подробный ответ! К сожалению, это добавляет некоторую зависимость от размера шрифта, что может быть не очень хорошо для просмотра на мобильных устройствах. Веб-сайт спроектирован так, чтобы быть адаптивным, а размер шрифта может динамически меняться при просмотре на мобильных устройствах.

Panpaper 09.04.2019 01:26

Другие вопросы по теме