win10的日历背景效果

flyKot2025/10/20

效果预览

1
2
3
4
5
6

分析

  • 实际上就是在包裹器中、卡片下方设置一个before

所有卡片公用一个before

  • 坐标都相同,全部重合

内部容器inset:2作为可透明边框

  • 就是比父容器每个边都往进缩2像素

页面结构

        <div class="box">
            <div class="card">
                <div class="inner">1</div>
            </div>
            <div class="card">
                <div class="inner">2</div>
            </div>
            <div class="card">
                <div class="inner">3</div>
            </div>
            <div class="card">
                <div class="inner">4</div>
            </div>
            <div class="card">
                <div class="inner">5</div>
            </div>
            <div class="card">
                <div class="inner">6</div>
            </div>
        </div>

css

.box {
    width: 600px;
    height: 600px;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(256px, 1fr));
}

.card {
    height: 180px;
    width: 280px;
    background: rgba(255, 255, 255, 0.1);
    position: relative;
    overflow: hidden;
}

.card::before {
    content: "";
    position: absolute;
    width: 100%;
    height: 100%;
    z-index: 2;
    left: var(--x, -1000px);
    top: var(--y, -1000px);
    transform: translate(-50%, -50%);
    border-radius: 50%;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.6) 0%, transparent);
    filter: blur(40px);
}

.inner {
    position: absolute;
    inset: 2px;
    background-color: #000000db;
    color: #fff;
    text-align: center;
    z-index: 3;
}

js

    const container = document.querySelector(".box");
    const cards = document.querySelectorAll(".card")
    container.onmousemove = function (e) {
        for (const card of cards) {
            const rect = card.getBoundingClientRect()
            const x = e.clientX - rect.left;
            const y = e.clientY - rect.top;
            card.style.setProperty("--x", `${x}px`)
            card.style.setProperty("--y", `${y}px`)
        }
    }