Можно заменить box-shadow
шириной drop-shadow
. Последний ничего не покажет для прозрачного div:
.box {
display:inline-block;
margin:5px;
height:100px;
width:100px;
filter:drop-shadow(5px 5px 5px #000);
}
<div class="box"></div>
<div class="box" style="background:red;"></div>
<div class="box" style="background:blue;"></div>
<div class="box" style="background:white;"></div>
<div class="box" style="background:rgba(0,100,0,0.5);"></div>
<div class="box" style="background:rgba(0,0,0,0);"></div>
Или, как показано ниже, если вы хотите, чтобы тень была только вокруг границ:
.box {
display:inline-block;
margin:5px;
height:100px;
width:100px;
position:relative;
}
.box::before,
.box::after{
content:"";
position:absolute;
top:0;
left:0;
right:0;
bottom:0;
z-index:-1;
}
.box::before {
background:inherit;
filter:drop-shadow(5px 5px 5px #000);
}
.box::after {
background:#fff; /* this should be equal to main background */
}
<div class="box"></div>
<div class="box" style="background:red;"></div>
<div class="box" style="background:blue;"></div>
<div class="box" style="background:white;"></div>
<div class="box" style="background:rgba(0,100,0,0.5);"></div>
<div class="box" style="background:rgba(0,100,0,0.3);"></div>
<div class="box" style="background:rgba(0,0,0,0);"></div>