#css
#css
Вопрос:
Мне было интересно, возможно ли создать сложную форму с div, похожую на следующую:
По сути, это закругленный квадрат с загнутыми внутрь углами. Цель состоит в том, чтобы использовать фоновое изображение для его заполнения. Я мог бы выполнить это с помощью маски-клипа со следующим путем SVG:
<path id="Path_1386" data-name="Path 1386" d="M20.148,599.906,455.922,482.262a15.989,15.989,0,0,0,11.817-15.433V139.242a15.986,15.986,0,0,0-11.632-15.381L20.335.613A15.984,15.984,0,0,0,0,15.994V584.475a15.983,15.983,0,0,0,20.148,15.431" transform="translate(0 0)" />
Но немного неудобно работать с этим в CSS для адаптивного изменения размера.
Комментарии:
1. Отличный вопрос, и я не знаю, сможете ли вы сделать это без SVG. Взгляните на этот сайт, polypane.app/css-3d-transform-examples , 3D Transform #13 от hqdrone на CodePen
Ответ №1:
Вариант 1 ( transform
)
Используйте transform: perspective()
с tranfrom: rotateY()
.
#box {
background-color: #f00;
border-radius: 40px;
height: 300px;
margin: 20px 0 0 20px;
transform: perspective(300px) rotateY(10deg);
width: 300px;
}
<div id="box"></div>
Вариант 1.1
Используйте transform: matrix3d()
. Вы можете использовать генератор здесь
#box {
background-color: #f00;
border-radius: 40px;
height: 300px;
margin: 50px 0 0 50px;
transform: matrix3d(0.98,0,0.17,.0005,0.00,1,0.00,0,-0.17,0,0.98,0,0,0,0,1);
width: 300px;
}
<div id="box"></div>
Вариант 2 ( perspective
с transform
)
Используйте perspective
с transform: rotateY()
. Эту опцию можно использовать perspective-origin
для указания позиции.
#perspective-box {
perspective: 400px;
perspective-origin: left;
}
#box {
background-color: #f00;
border-radius: 40px;
height: 300px;
margin: 20px 0 0 20px;
transform-style: preserve-3d;
transform: rotateY(15deg);
width: 300px;
}
<div id="perspective-box">
<div id="box"></div>
</div>
Вариант 2.1
Используйте perspective
с transform: rotate3D()
.
#perspective-box {
perspective: 700px;
}
#box {
background-color: #f00;
border-radius: 40px;
height: 300px;
margin: 50px 0 0 50px;
transform: rotate3D(0, 1, 0, 30deg);
width: 300px;
}
<div id="perspective-box">
<div id="box"></div>
</div>
Ответ №2:
clip-path
в сочетании с SVG-фильтром это можно сделать. Отрегулируйте стандартное отклонение фильтра для управления радиусом.
.box {
width:200px;
height:300px;
display:grid;
margin:20px;
filter: url('#goo');
}
.box > div{
clip-path:polygon(0 0,100% 20%,100% 80%,0 100%);
background:url(https://picsum.photos/id/1069/200/300)
}
<div class="box">
<div></div>
</div>
<svg style="visibility: hidden; position: absolute;" width="0" height="0" xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<filter id="goo"><feGaussianBlur in="SourceGraphic" stdDeviation="8" result="blur" />
<feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 19 -9" result="goo" />
<feComposite in="SourceGraphic" in2="goo" operator="atop"/>
</filter>
</defs>
</svg>