You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSS周期表Hover时Z-Index切换延迟问题求助(优先非JS方案)

问题:元素缩放动画与z-index切换不同步

我为作业制作了一个简易周期表,希望为鼠标悬停的元素添加缩放动画,为此修改了该元素的Z-Index,但出现延迟现象:元素先完成缩放,再切换Z-Index。我是编程新手,从未使用过JavaScript,希望优先通过非JS方案解决该问题,若必须使用JS也愿意尝试。

核心代码

#container {
    margin: 0px;
    display: grid;
    grid-template-columns: repeat(18, 1fr);
    grid-template-rows: auto;
    grid-gap: 5px;
    padding: 10px;
}

.num {
    color: rgba(255, 255, 255, 0);
    font-size: 1vw;
    transition: 100ms color ease-in-out;
}

.element {
    background-color: rgb(228, 228, 228);
    width: calc(90vw / 18);
    height: calc(90vw / 18);
    border-radius: 20%;
    text-align: center;
    z-index: 1;
    transition: 50ms scale ease-in-out;
    font-size: 3vw;
}

.element:hover{
    z-index: 2;
    scale: 2;
}

.element:hover .num {
    z-index: 2;
    scale: 1;
    color: rgba(0, 0, 0, 0.7);
}

完整样式代码

* {
    word-wrap: break-word;
    font-weight: normal;
    font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
    color: rgba(0, 0, 0, 0.7);
}

#container {
    margin: 0px;
    display: grid;
    grid-template-columns: repeat(18, 1fr);
    grid-template-rows: auto;
    grid-gap: 5px;
    padding: 10px;
}

.num {
    color: rgba(255, 255, 255, 0);
    font-size: 1vw;
    transition: 100ms color ease-in-out;
}

.element {
    background-color: rgb(228, 228, 228);
    width: calc(90vw / 18);
    height: calc(90vw / 18);
    border-radius: 20%;
    text-align: center;
    z-index: 1;
    transition: 50ms scale ease-in-out;
    font-size: 3vw;
}

.element:hover{
    z-index: 2;
    scale: 2;
}

.element:hover .num {
    z-index: 2;
    scale: 1;
    color: rgba(0, 0, 0, 0.7);
}

.blankr1 {
    opacity: 0%;
    grid-column: span 16;
}

.blankr2 {
    opacity: 0%;
    grid-column: span 10;
}

.blankExtra1 {
    grid-column:span 1;
    opacity: 0%;
}

.blankExtra2 {
    opacity: 0%;
    grid-column: span 1;
}

.reactiveNonMetals {
    background-color: rgb(193, 233, 178);
}

.alkaliMetals {
    background-color: rgb(255, 152, 152);
}

.alkaliEarthMetals {
    background-color: rgb(255, 203, 136);
}

.transistionMetals {
    background-color: rgb(182, 182, 254);
}

.postTransMetals {
    background-color: rgb(174, 126, 220);
}

.metalloids {
    background-color: rgb(255, 241, 118);
}

.nobelGases {
    background-color: rgb(253, 189, 199);
}

.longer {
    font-size: 1.6vw;
}

.lanthanides {
    z-index: 1;
    background-color: rgb(103, 103, 255);
    color: white;
}

.actinides {
    z-index: 0;
    background-color: rgb(166, 220, 202);
}

#container2 {
    display: grid;
    grid-template-columns: repeat(18, 1fr);
    grid-template-rows: auto;
    grid-gap: 5px;
    margin-top: 40px;
}

元素类(element)嵌套在容器(container)div内,数字类(num)嵌套在元素div内。


解决方案

优先非JS方案

方案1:给z-index添加过渡动画

默认z-index不支持过渡,但可以通过指定过渡函数让它和缩放动画同步触发。修改.element的过渡属性:

.element {
    /* 保留原有属性 */
    transition: 50ms scale ease-in-out, 50ms z-index step-end;
}

step-end会让z-index在过渡周期结束时立即切换,和缩放动画时长一致,视觉上就会同步。

方案2:设置元素为相对定位

Grid布局中元素默认是静态定位,z-index作用受限。给.element添加position: relative,让z-index层级变化及时生效:

.element {
    /* 保留原有属性 */
    position: relative;
}

加上后,z-index切换会和缩放动画同步,不会出现延迟。

优化点:移除子元素冗余z-index

.num是.element的子元素,会继承父元素的层级,无需单独设置z-index: 2,删掉.element:hover .num里的该属性即可。

可选JS方案(仅CSS方案无效时使用)

如果上面的CSS方法没解决,用简单JS监听鼠标事件同步修改样式:

const elements = document.querySelectorAll('.element');
elements.forEach(el => {
    el.addEventListener('mouseenter', () => {
        el.style.zIndex = '2';
        el.style.scale = '2';
    });
    el.addEventListener('mouseleave', () => {
        el.style.zIndex = '1';
        el.style.scale = '1';
    });
});

把这段代码放在HTML的</body>标签前即可。


内容的提问来源于stack exchange,提问作者JanCi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:14:54