Search code examples
htmlcsselementdropshadowmix-blend-mode

Apply blend mode to drop-shadow only


Is it possible to blend only the drop-shadow of an element with the color of the element it is overlapping?

For example: I have one element overlapping the other. The element on top has a light-grey drop shadow. The element below is black. I don't want any blend applied to either of the elements themselves but want the drop-shadow of the overlapping element to blend with color of the element below, creating a darker grey where the shadow falls on the overlapped element.

If I wanted to apply the effect to the entire element including the drop-shadow then this can be achieved using mix-blend-mode: multiply. I effectively want to use mix-blend-mode on the drop-shadow only - can this be done?


Solution

  • You can't do this, but what you can do is apply the drop-shadow to a pseudo-element that is the same size and uses a multiply blend mode.

    .above {
        position: absolute;
        background: green;
        width: 100px;
        height: 100px;
    }
    
    .above::before {
        box-shadow: 3pt 3pt 0 0 dodgerblue;
        mix-blend-mode: multiply;
        content: "";
    
        position: absolute;
        top: 0;
        right: 0;
        left: 0;
        bottom: 0;
    }
    
    .below {
        position: absolute;
        top: 50px;
        left: 50px;
    
        width: 100px;
        height: 100px;
    
        background: red;
    }
    <div class="below">
    </div>
    <div class="above">
    </div>

    I used these colours for illustrative purposes, but you can replace them with your own.