Если вы в порядке с использованием селекторов CSS3, попробуйте использовать эти (сгруппированные вместе):
/* Select the first child if it's not a .quote */
article > p:not(.quote):first-child:first-letter,
/* Or, if the first child is a .quote, select the following one instead */
article > p.quote:first-child + p:first-letter
{
float: left;
font-family: Georgia, serif;
font-size: 360%;
line-height: 0.85em;
margin-right: 0.05em;
}
См. Демонстрационную версию jsFiddle
В противном случае, я думаю, вам придется поиграть с некоторыми переопределениями, чтобы получить желаемый эффект.
Некоторое объяснение
Псевдокласс отрицания :not()
всегда обрабатывается независимо всех других типов, идентификаторов, классов и псевдоклассов в составном селекторе. Это независимо от того, как вы расположите его с другими селекторами.
Другими словами: вы не можете использовать :not()
, чтобы удалить или отфильтровать элементы, которые соответствуют тому, что находится в отрицании, из выбора, соответствующего остальной части простого селектора. Это также означает, что на набор элементов, соответствующих псевдоклассам :*-child()
и :*-of-type()
, :not()
.
не влияет.
Итак, первый селектор сверху,
article > p:not(.quote):first-child:first-letter
работает примерно так:
Найти каждый элемент p
.
- Если не найдено, игнорировать.
Если найдено, проверьте, является ли это p
:first-child
и , если это :not(.quote)
.
- Если это не первый ребенок, игнорируйте.
- Если он имеет класс
quote
, игнорировать.
Если он соответствует обоим псевдоклассам, проверьте, является ли этот p
дочерним по отношению к article
.
Если так, возьмите его :first-letter
.
Применить правила.
Второй селектор, с другой стороны, относительно прост:
article > p.quote:first-child + p:first-letter
Все, что он делает, это берет p
, который идет сразу после первого потомка article
, если это p.quote
, и применяет правила к его :first-letter
.