2016-05-19 2 views
3

Вот fiddle.Как абсолютное положение: перед псевдоэлементом дочернего элемента относительно родителя?

У меня есть два элемента div.

<div class="parent"> 
    <div class="child"> 
    </div> 
</div> 

И код CSS для этого.

.parent { 
    height: 20px; 
    width: 100px; 
    background-color: #080; 
    position: relative; 
} 

.child { 
    position: absolute; 
    width: 80px; 
    height: 200px; 
    background-color: #008; 
    right: -10px; 
    top: 30px; 
} 

.child:before { 
    border-right: 10px solid transparent; 
    border-bottom: 10px solid #008; 
    border-left: 10px solid transparent; 
    top: -10px; 
    width: 0; 
    height: 0; 
    content: ""; 
    position: absolute; 
    left: 50%; 
} 

Как позиционировать .child:before, связанные с .parent без JS. Я знаю решение с .parent:before, но это не хорошо для меня.

+0

Хотя '.child' ДИВ имеет значение позиции чего-либо, кроме' static' это не представляется возможным с помощью CSS. Непонятно, что вы пытаетесь сделать или почему. –

+0

@Paulie_D Я пытаюсь центрировать '.child: before' относительно родителя. Без использования 'parent: before'. – cassln

+0

Да ... но почему? Что случилось с '.parent: before'? В любом случае, как я уже сказал, это невозможно с помощью CSS. –

ответ

2

Я думаю, что это то, что вы пытаетесь сделать.

Я думаю, вы найдете это более надежным и масштабируемым.

.parent { 
 
    height: 20px; 
 
    width: 100px; 
 
    background-color: #080; 
 
    position: relative; 
 
} 
 
.child { 
 
    position: absolute; 
 
    width: 80px; 
 
    height: 200px; 
 
    background-color: #008; 
 
    left: 50%; 
 
    /* note 50% */ 
 
    top: 30px; 
 
    margin-left: -20px; 
 
    /* 2x your arrow size */ 
 
} 
 
.child:before { 
 
    position: absolute; 
 
    border-right: 10px solid transparent; 
 
    border-bottom: 10px solid #008; 
 
    border-left: 10px solid transparent; 
 
    top: -10px; 
 
    /* your border size */ 
 
    margin-left: 10px; 
 
    /* your border-size */ 
 
    width: 0; 
 
    height: 0; 
 
    content: ""; 
 
    left: 0; 
 
}
<div class="parent"> 
 
    <div class="child"> 
 
    </div> 
 
</div>

+0

Вот [скрипка] (https://jsfiddle.net/cassln/qdgp7dwh/3/), как выглядит то, что мне нужно. Но он использует '.parent: before', мне нужно то же самое с' .child: before'. Но, возможно, это невозможно. – cassln

+0

Обновлено ... это всего лишь вопрос корректировки полей. –

+0

Как я уже сказал в ответе брата, оба элемента могут иметь любую ширину. – cassln

2

Вы можете позиционировать только элемент absolute ly относительно ближайшего родителя, который сам позиционируется. В вашем случае это .child.

Если .child и .child:before не связаны в макете, почему бы не поставить .child:before в родительский элемент, либо как .parent:before, или как его собственный элемент?

В качестве альтернативы, если ваши элементы имеют фиксированную ширину, как в вашем примере, просто укажите псевдоэлемент как фиксированное положение пикселя. Demonstration.

+0

Нет, оба элемента могут быть любой ширины. Да, 'parent: before' будет работать. Но, как вы видите, синий треугольник ('.child: before') является семантически частью' .child'. – cassln

Смежные вопросы