#css #pseudo-element
#css #псевдоэлемент
Вопрос:
Селектор :first-letter
псевдоэлементов отлично работает для <p>
элемента, но не для ссылок. Это, например, не имеет никакого эффекта:
a:first-letter
{
font-size:200%;
text-transform:uppercase;
color:#8A2BE2;
}
Почему? Как я могу изменить стиль первой буквы для <a>
элемента
Ответ №1:
Согласно спецификации W3, :first-letter
псевдоэлемент работает только для блочного элемента, а a
это не так.
Как ни странно, *:first-letter
это привело к преобразованию первой буквы в Chrome 14 и Firefox 3.6.23. Скрипка: http://jsfiddle.net/8W7FF/3 /
Комментарии:
1. Ваша демонстрация jsfiddle «работает», потому что первая буква O — это не только
:first-letter
of<a>
, но и:first-letter
of<body>
. Тем не менее, 1, ваш ответ выглядит правильным.2. Я бы предположил, что это потому, что * будет включать
body
тег, который jsFiddle помещает туда автоматически.3. @JonathanNewmuis, чтобы быть более точным, необязательно указывать, что входит
<body>
в документ; в HTML<body>
есть необязательные как открывающие, так и закрывающие теги. У каждого HTML-документа есть свойbody
, независимо от того, добавляете ли вы его явно в разметку или нет.4. @duri Правильно. Извините, если это могло быть неоднозначным. Скорее, я пытался сказать, что jsFiddle обслуживает содержимое, имеющее тег body, а не то, что тег body должен быть явно помечен, как это сделал jsFiddle.
5. @RobW Вы только что доказали, что это действительно из — за
body
. Селекторbody *
соответствует «любому элементу внутриbody
» ==a
элементу. Поскольку:first-letter
это не работает со встроенными элементами, буква не пишется с заглавной буквы. Попробуйте использоватьbody:first-letter
, и вы увидите, что буква пишется с заглавной буквы, потому что это первая букваbody
, даже если это первая буква другого элемента (a
в данном случае).
Ответ №2:
Проверьте спецификацию. На данный момент inline
элементы не поддерживаются ::first-letter
:
В CSS
::first-letter
псевдоэлемент применяется к блочным контейнерам, таким какblock
,list-item
,table-cell
,table-caption
, иinline-block
элементам.
Примечание: будущая версия этой спецификации может разрешить применять этот псевдоэлемент к большему количеству типов отображения.
https://www.w3.org/TR/selectors-3/#application-in-css
Таким образом, если вы попытаетесь стилизовать ::first-letter
что-то, что не является «блочным контейнером», например, встроенным элементом, это не сработает. Это относится не только к ссылкам; вы также обнаружите, что по умолчанию вы также не можете стилизовать ::first-letter
of a span
, как показано ниже:
div::first-letter, span::first-letter, a::first-letter {
font-size:200%;
text-transform:uppercase;
color:#8A2BE2;
}
<div>I'm a div</div>
<span>I'm a span</span>
<a href="https://google.com">I'm an anchor</a>
Возможное решение этой проблемы — превратить элемент в блочный контейнер, например, установив для него значение display: block
или display: inline-block
. Ниже приведен пример использования первого для span
, а второго для a
:
div::first-letter, span::first-letter, a::first-letter {
font-size:200%;
text-transform:uppercase;
color:#8A2BE2;
}
span {
display: block;
}
a {
display: inline-block;
}
<div>I'm a div</div>
<span>I'm a span</span>
<a href="https://google.com">I'm an anchor</a>
Комментарии:
1. вы также можете применить ::first-letter к элементу оболочки привязки