:first-of-type
выбирает первое p
, как следует из названия, а не первое непустое p
, как вам может понадобиться.
Они складываются просто отлично, но :first-of-type
работает исключительно с тегом (т.е. тип), а не с предыдущим комплексным селектором. Таким образом, вы просто ищете первый p
, и этот первый абзац также не должен быть пустым. И этого не существует.
Предполагая, что пустые абзацы могут появляться по всему тексту, и вы хотите, чтобы затрагивался только первый, непустой абзац, я не думаю, что это возможно сделать только одним селектором. Это лучшее, что я могу придумать:
p:first-of-type::first-letter,
p:empty + p::first-letter { text-transform: uppercase; /* ... */ }
p:not(:empty) ~ p::first-letter { text-transform: inherit; /* reset */ }
Это будет применять CSS только к первому непустому абзацу (ну, и к первому пустому абзацу, но в любом случае он ничего не будет делать).