Подтвердить что ты не робот

Скрыть элемент, но показывать содержимое, сгенерированное CSS.

Есть ли способ скрыть содержимое элемента, но сохранить его содержимое :before видимым? Скажем, у меня есть следующий код:

HTML:

<span class="addbefore hidetext">You are here</span>

CSS

.addbefore:before {
    content: "Show this";
}
.hidetext {
    // What do I do here to hide the content without hiding the :before content?
}

Я пробовал:

  • с помощью display: none и установки display: inline на :before, но оба они все еще скрыты
  • используя width: 0; overflow: hidden;, но затем добавляется дополнительное пространство (?)
  • используя цвет: прозрачный;, но тогда, конечно, содержимое диапазона по-прежнему занимает пространство
  • используя text-indent: -....px, но
    • это недоволен поисковыми системами и
    • Кажется, что он не работает для элементов span (?)

Любые другие идеи относительно того, как я могу это сделать?

4b9b3361

Ответ 1

Чистое решение

Вы можете использовать visibility: hidden, но с этим решением скрытый контент по-прежнему будет занимать место. Если это не имеет значения для вас, вот как вы это сделаете:

span {
    visibility: hidden;
}

span:before {
    visibility: visible;
}

Альтернативное решение Hackish

Другим решением было бы установить font-size span на нуль * на действительно небольшое значение. Преимущество этого метода: скрытый контент не займет места. Недостаток: вы не сможете использовать относительные единицы, например em или%, для размера шрифта :before.

span:before {
    content: "Lorem ";
    font-size: 16px;
    font-size: 1rem; /* Maintain relative font-size in browsers that support it */
    letter-spacing: normal;
    color: #000;
}

span {
    font-size: 1px;
    letter-spacing: -1px;
    color: transparent;
}

Пример jsfiddle.

Обновление (4 мая 2015 г.):. С помощью CSS3 вы можете использовать блок rem (Root EM) для поддержания относительных размеров шрифтов в элементе :before. (поддержка браузера.)


* В предыдущей версии этого сообщения предлагается установить размер шрифта равным нулю. Однако в некоторых браузерах это не работает по желанию, потому что CSS не определяет, какое поведение ожидается когда размер шрифта установлен на ноль. Для совместимости с несколькими браузерами используйте небольшой размер шрифта, как указано выше.

Ответ 2

Для лучшей поддержки браузера:

Оберните текст, который должен быть скрыт в дополнительном элементе span, и примените классы к этому диапазону, чтобы скрыть текст, который вы хотите скрыть.

HTML:

<span class="addbefore">
  <span class="visuallyhidden>This text will not show.</span>
</span>

CSS

.addbefore:before {
  content: "Show this";
}

.visuallyhidden {
  border: 0;
  clip: rect(0 0 0 0);
  height: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
  width: 1px;
}

Класс .visuallyhidden, использованный выше, относится к текущей версии HTML5 Boilerplate: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css

Преимущества этого решения:

  • Семантический HTML
  • Полная поддержка браузера.
  • Нет проблем с крошечным текстом, например, с другими небольшими решениями font-size.
  • Скрытый контент не займет места

Смотрите здесь: http://jsfiddle.net/tinystride/A9SSb/

Ответ 3

Основываясь на превосходном хакере @anroesti, здесь есть решение, если вам нужно применять в неизвестном контексте с точки зрения размера и цвета шрифта, т.е. вы не уверены, что сброс на color:black;font-size:1rem; не испортит вещи

<span abbrev-content="Intl.">International</span>

@media only screen and (max-width: 700px) {  /* very narrow viewports */
    span[abbrev-content] { font-size: 0.001em; visibility: hidden; }
    span[abbrev-content]::before { 
        content: attr(abbrev-content); 
        font-size: 1000em; 
        visibility: visible; 
    }
}

Если ваш диапазон содержания является абзацем, а не просто словом, вам также может понадобиться отрицательный межбуквенный интервал.

Ответ 4

Я выбрал аналогичный подход, предложенный здесь, с visibility, но в нем все еще есть поле для контента.

Мое решение состоит в том, чтобы просто использовать font-size чтобы скрыть целевой текст.

span {
    font-size: 0;
}

span:before {
    font-size: 16px;
}

Ответ 5

Я не думаю, что это возможно с чистым css и html. Рассматривая этот пример http://jsbin.com/efeco4, вы увидите, что то, что находится внутри свойства content css, обернуто элементом. Поэтому любая манипуляция с элементом также будет влиять на css content.

Таким образом, альтернативная мысль может заключаться в использовании jquery, чтобы очистить содержимое html внутри тега div с классом hidetext, не затрагивая content css. Пример кода может быть следующим:

$('.hidetext').empty();

Пример: http://jsbin.com/efeco4/2