Как позиционировать: до &: после псевдоэлементов друг на друга?

Как лучше всего позиционировать один псевдоэлемент непосредственно поверх другого псевдоэлемента?

Скажем, я хочу сделать причудливый "флажок" рядом с меткой здесь:

<input id="pretty"><label for="pretty">Label text</label>

Мне может понадобиться один псевдоэлемент с градиентом, а другой - простой ящик, расположенный сверху, чтобы имитировать эффект градиентной границы.

Я могу сделать две коробки, перейдя:

label:before {
content: "\00a0";
color: #FFF;
height: 6px;
width: 6px;
display: inline-block;
}

label:after {
 content: "\00a0";
 height: 18px;
 width: 18px;
 display: inline-block;
 background:#ebd196;
 background-image: linear-gradient(top, #ebd196 4%, #e2b65d 5%, #ab8844 100%);
 }

Каков порядок укладки псевдоэлементов? Делает: перед тем, как появляться ниже или выше: after-, который лучше подходит для границы, и который заполняет?

И каково наилучшее позиционирование для метки, label: before и label: after, чтобы получить правильное позиционирование?

Ответ 1

:before (или ::before) рассматривается как первый ребенок элемента, к которому он применяется, тогда как :after (или ::after) рассматривается как последний ребенок. Поэтому :after, естественно, будет охватывать :before.

https://developer.mozilla.org/en-US/docs/Web/CSS/::before

https://developer.mozilla.org/en-US/docs/Web/CSS/::after

Я предполагаю, что лучший способ убедиться, что они выстраиваются в линию, - это использовать position: relative; на label и position: absolute; для псевдоэлементов вместе с теми же значениями для top, bottom и т.д.

Если вы хотите сделать градиентную границу с помощью псевдоэлементов, вы можете сделать что-то вроде этого:

label {
    position: relative;
    display: inline-block;
    padding: 0 2px;
    margin: 2px;
}

label:before {
    content:"";
    position: absolute;
    top: 0;
    left: 0;
    z-index: -1;
    width: 100%;
    height: 100%;
    background: white;
}

label:after {
    content:"";
    position: absolute;
    top: -2px;
    bottom: -2px;
    left: -2px;
    right: -2px;
    z-index: -2;
    background: linear-gradient(to bottom, #1e5799 13%, #efe22f 79%);
}

http://jsfiddle.net/QqzJg/

Вы можете найти это полезным:

http://css-tricks.com/examples/GradientBorder/