Вот идея с перекосом и фильтром drop-shadow
.Вам просто нужен какой-то дополнительный элемент, чтобы правильно иметь градиент.Хитрость заключается в том, чтобы инвертировать наклон, чтобы сохранить правильное направление градиента (не требуется, если мы имеем дело со сплошным цветом)
.box {
width: 150px;
height: 150px;
position: relative;
z-index:0;
overflow: hidden;
filter: drop-shadow(0 1px 10px rgba(0, 0, 0, 0.8));
}
.box span {
position: absolute;
z-index:-1;
top: 0;
width: 50%;
height: 100%;
overflow: hidden;
}
.box span:first-of-type {
left: 0;
transform: skewY(35deg);
transform-origin: top right;
}
.box span:last-of-type {
right: 0;
transform: skewY(-35deg);
transform-origin: top left;
}
.box span::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(to bottom, blue , red );
}
.box span:first-of-type::before {
transform: skewY(-35deg);
transform-origin: top right;
}
.box span:last-of-type::before {
transform: skewY(35deg);
transform-origin: top left;
}
p {
margin:0;
color:#fff;
font-size:45px;
line-height:100px;
text-align:center;
}
<div class="box">
<span></span><span></span>
<p>29</p>
</div>
Вот как мы можем сделать с левым или правым градиентом.В этом случае нам не нужны дополнительные элементы, потому что перекос не повлияет на направление:
.box {
width: 150px;
height: 150px;
position: relative;
z-index:0;
overflow: hidden;
filter: drop-shadow(0 1px 10px rgba(0, 0, 0, 0.8));
}
.box:before,
.box:after{
content:"";
position: absolute;
z-index:-1;
top: 0;
width: 50%;
height: 100%;
overflow: hidden;
background:linear-gradient(to right,blue,red);
background-size:200% 100%;
}
.box:before{
left: 0;
transform: skewY(35deg);
transform-origin: top right;
}
.box:after{
right: 0;
transform: skewY(-35deg);
transform-origin: top left;
background-position:right;
}
p {
margin:0;
color:#fff;
font-size:45px;
line-height:100px;
text-align:center;
}
<div class="box">
<p>29</p>
</div>
А вот с произвольным градиентом:
.box {
width: 150px;
height: 150px;
position: relative;
z-index:0;
overflow: hidden;
filter: drop-shadow(0 1px 10px rgba(0, 0, 0, 0.8));
}
.box span {
position: absolute;
z-index:-1;
top: 0;
width: 50%;
height: 100%;
overflow: hidden;
}
.box span:first-of-type {
left: 0;
transform: skewY(35deg);
transform-origin: top right;
}
.box span:last-of-type {
right: 0;
transform: skewY(-35deg);
transform-origin: top left;
}
.box span::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(35deg, blue , red );
background-size:200% 100%;
}
.box span:first-of-type::before {
transform: skewY(-35deg);
transform-origin: top right;
}
.box span:last-of-type::before {
transform: skewY(35deg);
transform-origin: top left;
background-position:right;
}
p {
margin:0;
color:#fff;
font-size:45px;
line-height:100px;
text-align:center;
}
<div class="box">
<span></span><span></span>
<p>29</p>
</div>
Поскольку каждый элемент занимает 50%
ширины, мы делаем фон 200%
таким, чтобы его размер был основным контейнером, а затем корректируемположение, чтобы создать иллюзию одного фона.Как будто каждый элемент будет показывать половину основного фона.