Как использовать перекос только в родительском элементе?

Есть ли способ использовать перекос только в родительском элементе? Мне нужно создать что-то вроде «алмаза» в качестве маски, и дочерние элементы не могут быть затронуты. В этом случае нет возможности использовать png в качестве маски. Заранее спасибо!


person Túlio Ribeiro    schedule 23.10.2012    source источник


Ответы (4)


Это очень просто, нужно просто расшить вещь для детей. Unskew означает применение другого косого преобразования, но на этот раз с противоположным углом.

.parent { transform: skewX(45deg); }
.parent > * { transform: skew(-45deg); }

В общем, если вы применяете ряд преобразований к родительскому элементу и хотите, чтобы дочерние элементы вернулись к нормальному состоянию, вам нужно применить те же преобразования, только в обратном порядке (в большинстве случаев порядок имеет значение!) и с минусом для значений угла/длины, используемых для наклона, поворота или перемещения. В случае масштаба вам нужен масштабный коэффициент 1/scale_factor_for_parent. То есть для масштаба вы бы сделали что-то вроде этого:

.parent { transform: scale(4); }
.parent > * { transform: scale(.25); /* 1/4 = .25 */ }

Алмазная форма с детьми довольно проста.

ДЕМО

Результат:

результат

HTML:

<div class='wrapper'>
  <div class='diamond'>
    <div class='child'>Yogi Bear</div>
    <div class='child'>Boo Boo</div>
  </div>
</div>

CSS:

.wrapper {
  overflow: hidden;
  margin: 0 auto;
  width: 10em; height: 10em;
}
.diamond {
  box-sizing: border-box;
  margin: 0 auto;
  padding: 4em 1em 0;
  width: 86.6%; height: 100%;
  transform: translateY(-37.5%) rotate(30deg) skewY(30deg);
  background: lightblue;
}
.child {
  transform: skewY(-30deg) rotate(-30deg);
}
person Ana    schedule 15.02.2013

Любое свойство transform влияет на элемент, который применяется к и всем его дочерним элементам.

Таким образом, единственный способ skew одного "родительского" элемента - это иметь его без дочерних элементов (т.е. он не может быть также и родителем!).

person Alessandro Vendruscolo    schedule 23.10.2012

Не могли бы вы немного уточнить, что вы хотите получить в результате?

skew(), как и все свойства преобразования, всегда влияет на дочерние элементы. Вы можете попробовать использовать два блока HTML в одной и той же позиции, один с skew(), а другой с содержимым.

Кроме того, если вы просто хотите ромб, вам должно хватить прямоугольного прямоугольника с функциями scale() и rotate(), но опять же без дочерних элементов.

И если вам нужен этот ромб в качестве маски, я уверен, что было бы проще визуализировать части, НЕ присутствующие в ромбе. Визуализация внешних частей ромба не должна быть такой сложной, в конце концов, это всего лишь прямоугольные треугольники.

person pistache    schedule 23.10.2012

единственный способ добиться этого — убрать дочерний элемент из потока документов с помощью position:absolute; и присвоить дочернему элементу равный отрицательный градус.

Проблема в том, что теперь вам придется изменять размер родителя вручную.

person Colin Worf    schedule 18.11.2017