<div class="wrap" id="img">
    <img class="prew" src="https://tva1.sinaimg.cn/large/008i3skNgy1gubr2sbyqdj60xa0m6tey02.jpg">
</div>
body{
    margin: 0;
    height: 100vh;
    display: grid;
    place-content: center;
}
.prew{
    display: block;
    width: 800px;
}
.wrap{
    position: relative;
  overflow:hidden;
}
.wrap::before{
    content: '';
    position: absolute;
    width: 100%;
    height: 100%;
    left: 0;
    top: 0;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='50' height='50' viewBox='0 0 50 50' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='25' cy='25' r='25' fill='%23C4C4C4'/%3E%3C/svg%3E"), linear-gradient(red, red);
    -webkit-mask-size: 100px, 100%;
    -webkit-mask-repeat: no-repeat;
    -webkit-mask-position: calc(var(--x, .5) * 100% )  calc(var(--y, .5) * 100% ), 0;
    -webkit-mask-composite: xor; 
    mask-composite: exclude;
    background: rgba(0,0,0,.3);
    backdrop-filter: blur(5px)
}
img.addEventListener('mousemove', (ev) => {
    img.style.setProperty('--x', ev.offsetX / ev.target.offsetWidth);
    img.style.setProperty('--y', ev.offsetY / ev.target.offsetHeight);
})

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.