Добавление объектов HTML с использованием содержимого CSS

795

Как вы используете свойство CSS content для добавления html-объектов?

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

<div class="breadcrumbs">
    <a>One</a>
    <a>Two</a>
    <a>Three</a>
</div>

К какому стилю приложен следующий стиль:

.breadcrumbs a:before {
    content: '> ';
}

Проблема заключается в том, что когда список палитр получает длинный и обертывается на следующую строку, стрелка остается на предыдущей строке. Очевидным решением является изменение пространства в неразрывное пространство, но это не работает:

.breadcrumbs a:before {
    content: '>&nbsp;';
}

Он фактически выводит &nbsp; на экран. Я обошел это с другими странными символами (например, & raquo;), вставив символ непосредственно, но как вы вставляете &nbsp;?

  • 4
    В другом смысле добавление контента с использованием CSS нарушает разделение интересов, CSS предназначен только для определений стилей. Желательно избегать с точки зрения доступности, так как отключение CSS портит всю разметку. Тем не менее, приятно добавлять изображения, используя эту технику.
  • 94
    Это зависит. В данном случае это для целей презентации. Было бы "нарушать" SoC, чтобы поставить ">" в HTML
Показать ещё 6 комментариев
Теги:
html-entities
css-content

9 ответов

905
Лучший ответ

Вам нужно использовать экранированный юникод:

Как

.breadcrumbs a:before {
    content: '>\0000a0';
}

Дополнительная информация: http://www.evotech.net/blog/2007/04/named-html-entities-in-numeric-order/

  • 1
    хахаха @ dlamblin жизнь иногда бывает тяжелой, когда ты слишком хорош в том, что делаешь. :)
  • 51
    Ведущие нули лишние, см. CSS 2.1: 4.3.7 Строки . '>\a0' достаточно.
Показать ещё 7 комментариев
138

CSS не является HTML. &nbsp; - это имя ссылка на символ в HTML; эквивалентно значению десятичного числового символа &#160;. 160 является точкой десятичного кода символа NO-BREAK SPACE в Unicode (или UCS-2, см. Спецификация HTML 4.01). Шестнадцатеричное представление этой кодовой точки U + 00A0 (160 = 10 × 16 1 + 0 × 16 0). Вы найдете это в Unicode Диаграммы кода и База символов.

В CSS вам нужно использовать escape-последовательность Unicode для таких символов, которая основана на шестнадцатеричном значении кодовой точки символа. Поэтому вам нужно написать

.breadcrumbs a:before {
  content: '>\a0';
}

Это работает до тех пор, пока escape-последовательность будет последней в строковом значении. Если символы следуют, есть два способа избежать неправильной интерпретации:

a) (упомянутые другими) Используйте ровно шесть шестнадцатеричных цифр для escape-последовательности:

.breadcrumbs a:before {
  content: '>\0000a0foo';
}

b) Добавьте после пробельной последовательности один символ пробела (например, пробел):

.breadcrumbs a:before {
  content: '>\a0 foo';
}

(Так как f является шестнадцатеричной цифрой, \a0f в противном случае означает GURMUKHI LETTER EE здесь, или ਏ, если у вас есть подходящий шрифт.)

Разметка пробела будет проигнорирована, и это будет отображаться > foo, где отображаемое пространство здесь будет символом NO-BREAK SPACE.

Подход белого пространства ('\a0 foo') имеет следующие преимущества перед шестизначным подходом ('\0000a0foo'):

  • легче набирать, поскольку ведущие нули не нужны, а цифры не нужно учитывать;
  • легче читать, потому что между escape-последовательностью и последующим текстом есть пробел между пробелами и цифры не нужно подсчитывать;
  • для этого требуется меньше места, поскольку ведущие нули не нужны;
  • это совместимо с повышением уровня, поскольку Unicode, поддерживающий кодовые точки за пределами U + 10FFFF, в будущем потребует изменения спецификации CSS.

Таким образом, чтобы отобразить пробел после экранированного символа, используйте два пробела в таблице стилей -

.breadcrumbs a:before {
  content: '>\a0  foo';
}

- или сделать его явным:

.breadcrumbs a:before {
  content: '>\a0\20 foo';
}

Подробнее см. CSS 2.1, раздел "4.1.3 Персонажи и футляр" .

  • 0
    +1 за уловку «отображать пробел после экранированного символа», но нужно упомянуть, что добавление nbsp, а затем пробел, побеждает цель nbsp;)
  • 0
    @TWiStErRob Нет, комбинация неразрывного пробела, за которым следует символ пробела (или наоборот), будет отображать пробел относительно ширины двух пробелов, в то время как два или более дословных пробела будут отображать только пробел ширина одного пробела в качестве синтаксического анализатора механизма компоновки последовательно разбивает пробел (включая символ новой строки) на один пробел, если свойство CSS white-space объявляет иное.
Показать ещё 2 комментария
72

Обновить: PointedEars упоминает, что правильная позиция для &nbsp; во всех ситуациях css была бы '\a0 ' подразумевая, что пространство является терминатором шестнадцатеричной строки и поглощается беглой последовательностью. Далее он указал на это авторитетное описание, которое звучит как хорошее решение проблемы, которую я описал и зафиксировал ниже.

Что вам нужно сделать, это использовать escape-код unicode. Несмотря на то, что вам сказали, \00a0 не является идеальной версией для &nbsp; в CSS; поэтому попробуйте:

content:'>\a0 ';          /* or */
content:'>\0000a0';       /* because you'll find: */
content:'No\a0 Break';    /* and */
content:'No\0000a0Break'; /* becomes No&nbsp;Break as opposed to below */

В частности, используя \0000a0 как &nbsp;. Если вы попробуете, как предложили матье и милликин:

content:'No\00a0Break'   /* becomes No&#2571;reak */

Он берет B в шестнадцатеричные экранированные символы. То же самое происходит с 0-9a-fA-F.

  • 6
    Вам просто нужно поставить пробел после escape-последовательности, как указано: '\a0 Break' . '\0000a0Break' не является надежным.
  • 0
    @PointedEars Интересно, тогда это пространство является терминатором и не включается в строку?
Показать ещё 1 комментарий
34

Я обнаружил, что самый простой способ конвертировать символы, например от ▾ (&#9662;) в \25BE, - это использовать калькулятор Microsoft =)

Да. Включите режим программистов, включите десятичную систему, введите 9662, затем переключитесь на шестнадцатеричный, и вы получите 25BE. Затем просто добавьте обратную косую черту \ в начало.

  • 4
    Хотя это абсолютно полезно, на самом деле он не отвечает на вопрос, так что это было бы лучше в качестве комментария к вопросу.
  • 1
    Черная стрелка, указывающая вправо (▸ \25B8 &#x25B8; &#9656; ) ftw. Также см. En.wikipedia.org/wiki/Geometric_Shapes для получения дополнительной информации.
Показать ещё 3 комментария
31

Используйте шестнадцатеричный код для неразрывного пространства. Что-то вроде этого:

.breadcrumbs a:before {
    content: '>\00a0';
}
16

Существует способ вставить nbsp - открыть CharMap и скопировать символ 160. Тем не менее, в этом случае я бы, вероятно, выделил его с заполнением, например:

.breadcrumbs a:before { content: '>'; padding-right: .5em; }

Возможно, вам потребуется установить панировочные сундуки display:inline-block или что-то еще.

  • 4
    Вместо того, чтобы вставлять nbsp, я бы остановился на использовании сущности, чтобы будущие сопровождающие поняли, что она отличается от пробела.
  • 2
    с другой стороны, вы не делаете панировочные сухари, как они должны быть, то есть: символ> должен быть встроен в хлебную крошку, а не просто визуальный стиль. по крайней мере, если вы хотите, чтобы Google видел ваши сухари и перечислил их в списке в поисковой системе.
7

Пример:

http://character-code.com/arrows-html-codes.php

Пример: если вы хотите выбрать своего персонажа, я выбрал "& # 8620" "& # x21ac" (мы используем HEX)

.breadcrumbs a:before {
    content: '\0021ac';
}

Результат: ↬

Вот оно:)

  • 0
    я использовал контент: '\ 10095'; , Но вывод не показывает. вместо значка отображается прямоугольник.
  • 0
    Вы можете попробовать это stackoverflow.com/a/8922306/3129822
0

Я знаю, что это довольно старый пост, но если интервал - это все ваше, почему бы и просто:

.breadcrumbs a::before {
    content: '>';
    margin-left: 8px;
    margin-right: 8px;
}

Я использовал этот метод раньше. Он отлично переносится на другие строки с помощью " > " рядом с моим тестом.

-3

Вот два способа:

  • В HTML:

    <div class="ics">&#9969;</div>

Это приведет к  

  • В Css:

    .ics::before {content: \9969;}

с кодом HTML <div class="ics"></div>

Это также приводит к тому, что

  • 0
    Правильный ответ .ics :: before {content: '\ 9969';}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню