Использование CSS Градиенты + Превращает:
Одним из способов достижения этой формы с отзывчивым разрезом в верхней части будет использовать два перекошенные псевдоэлементы, добавьте фон только к псевдоэлементам, а не к родительскому элементу.
Поскольку псевдоэлементы имеют половину ширины их родительского элемента, заполнение linear-gradient
, которое требуется от родителя, также должно быть разделено на две половины и назначено на 2 псевдоэлемента.
Одним из потенциальных недостатков этого подхода является то, что глубина разреза будет увеличиваться, если высота родительского div увеличивается.
.shape {
position: relative;
height: 100px;
width: 100%;
overflow: hidden;
}
.shape:after,
.shape:before {
position: absolute;
content: '';
height: 100%;
width: calc(50% + 1px);
top: 0;
backface-visibility: hidden;
}
.shape:before {
left: 0;
background-image: linear-gradient(to right, red, gold);
transform: skewY(2deg);
transform-origin: left top;
}
.shape:after {
right: 0;
background-image: linear-gradient(to right, gold, crimson);
transform: skewY(-2deg);
transform-origin: right top;
}
body {
background-image: radial-gradient(circle at center, sandybrown, chocolate);
min-height: 100vh;
}
<div class='shape'></div>
Использование CSS Clip-путь: (плохая поддержка браузера)
Другой подход должен был бы использовать CSS clip-path
. Это, на мой взгляд, было бы идеальным вариантом, поскольку не должно быть никаких манипуляций с градиентом (например, разделение на половину), глубина разреза не изменится, даже если высота div
увеличивается и т. Д. Но, к сожалению, у нее плохой браузер поддержка.
.shape {
height: 100px;
width: 100%;
-webkit-clip-path: polygon(0px 0px, 50% 14px, 100% 0%, 100% 100%, 0% 100%);
background-image: linear-gradient(to right, red, gold, crimson);
}
body {
background-image: radial-gradient(circle at center, sandybrown, chocolate);
min-height: 100vh;
}
<div class='shape'></div>
Использование SVG Clip-путь: (лучшая поддержка браузера)
Другой подход будет использовать SVG clip-path
. Это улучшенная поддержка браузера, чем его коллега, но, к сожалению, здесь глубина резкости будет меняться по мере изменения размеров.
.shape {
height: 100px;
width: 100%;
-webkit-clip-path: url(#clipper);
clip-path: url(#clipper);
background-image: linear-gradient(to right, red, gold, crimson);
}
body {
background-image: radial-gradient(circle at center, sandybrown, chocolate);
min-height: 100vh;
}
<svg width="0" height="0" viewBox="0 0 200 200">
<defs>
<clipPath id="clipper" clipPathUnits="objectBoundingBox">
<path d="M0,0 0.5,0.07 1,0 1,1 0,1z" />
</clipPath>
</defs>
</svg>
<div class='shape'></div>
В качестве альтернативы, мы можем сделать то же самое с использованием SVG path
или polygon
элемента (вместо clip-path
) и положения его абсолютно в пределах родительского контейнера также, но она будет иметь то же ограничение, путь клипа SVG (то есть глубина резкости будет увеличиваться, если размеры изменяются, потому что значения находятся в долях размера родительского контейнера, а не фиксированной длины).
Откликаете ли вы на то, что разрез сверху должен всегда достигать максимальной глубины в центре div и быть нулевой глубиной с левой/правой стороны? Кроме того, каков фон элемента? Всегда ли это сплошной цвет (или) имеет ли он градиент/изображение? – Harry
S ur right.try изменение размера окна. Поскольку граница имеет фиксированную ширину.это не касается его родительского конца. Существует ли какое-либо обходное решение для этого, чтобы оставаться в том же размере, даже когда размер браузера изменяется. И, конечно, у него будет градиентная заливка ... –
В вашем примере область разреза имеет белый цвет? Может ли эта область быть сплошным цветом или она должна показывать фон страницы (я имею в виду, должен ли он быть прозрачным)? – Harry