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

iOS端CSS动画卡顿、星星溢出问题求助(桌面端正常)

iOS Safari下CSS动画兼容问题解决方案:卡顿与元素溢出修复

一、心形点赞按钮卡顿修复

iOS Safari对CSS transform的默认硬件加速触发逻辑和桌面浏览器不同,加上过渡属性的重复覆盖会导致动画计算异常,最终出现卡顿。

修改方案

  • 用transform: translateZ(0)显式触发GPU加速
  • 统一过渡属性定义,避免多次覆盖导致的动画冲突
  • 添加will-change告诉浏览器提前优化动画属性

修改后的.heart CSS代码:

.heart {
    width: 30px;
    margin: 0;
    transition: transform 0.4s ease, opacity 0.3s ease;
    will-change: transform, opacity;
    transform: translateZ(0);
}

.heart:hover {
    transform: scale(1.5) translateZ(0);
    transition-duration: 0.1s;
}

.heart:active {
    transform: scale(3.7) translateZ(0);
    opacity: 0.1;
    transition-duration: 0.3s;
}

二、提交按钮星星元素溢出修复

问题根源:

  1. .btn未设置position: relative,导致内部绝对定位的#container-stars以整个文档为基准,而非按钮容器
  2. #stars的超大尺寸(200rem)在iOS Safari下会突破overflow: hidden的裁剪限制
  3. 伪元素的定位参数未适配容器尺寸,进一步加剧溢出

修改方案

  • 给.btn添加position: relative,约束内部绝对定位元素的基准
  • 缩小#stars尺寸为容器100%,调整伪元素的位置和动画参数保持视觉效果
  • 给#container-stars添加clip-path: inset(0),强制Safari裁剪溢出内容

修改后的相关CSS代码:

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

#container-stars {
    /* 原有属性保留 */
    clip-path: inset(0);
}

#stars {
    position: relative;
    background: transparent;
    width: 100%;
    height: 100%;
    overflow: hidden;
}

#stars::after {
    content: "";
    position: absolute;
    top: 0;
    left: -100%;
    width: 300%;
    height: 300%;
    animation: animStarRotate 90s linear infinite;
}

#stars::before {
    content: "";
    position: absolute;
    top: -200%;
    left: -100%;
    width: 300%;
    height: 300%;
    animation: animStar 60s linear infinite;
}

@keyframes animStar {
    from {
        transform: translateY(0);
    }
    to {
        transform: translateY(300%);
    }
}

完整修复后代码

CSS

.btn {
    margin-top: 1rem;
    margin-bottom: 1rem;
    display: flex;
    justify-content: center;
    align-items: center;
    width: 13rem;
    overflow: hidden;
    height: 3rem;
    background-size: 300% 300%;
    backdrop-filter: blur(1rem);
    border-radius: 5rem;
    transition: 0.5s;
    animation: gradient_301 5s ease infinite;
    border: double 4px transparent;
    background-image: linear-gradient(#212121, #212121),  linear-gradient(137.48deg, #ffdb3b 10%,#FE53BB 45%, #8F51EA 67%, #0044ff 87%);
    background-origin: border-box;
    background-clip: content-box, border-box;
    position: relative;
}

#container-stars {
    position: absolute;
    z-index: -1;
    width: 100%;
    height: 100%;
    overflow: hidden;
    transition: 0.5s;
    backdrop-filter: blur(1rem);
    border-radius: 5rem;
    clip-path: inset(0);
}

strong {
    z-index: 2;
    font-family: 'Oooh Baby', cursive;
    font-size: 22px;
    letter-spacing: 5px;
    color: #FFFFFF;
    text-shadow: 0 0 4px white;
}

#glow {
    position: absolute;
    display: flex;
    width: 12rem;
}

.circle {
    width: 100%;
    height: 30px;
    filter: blur(2rem);
    animation: pulse_3011 4s infinite;
    z-index: -1;
}

.circle:nth-of-type(1) {
    background: rgba(254, 83, 186, 0.636);
}

.circle:nth-of-type(2) {
    background: rgba(142, 81, 234, 0.704);
}

.btn:hover #container-stars {
    z-index: 1;
    background-color: #212121;
}

.btn:hover {
    transform: scale(1.1);
    cursor: pointer;
}

.btn:active {
    border: double 4px #FE53BB;
    background-origin: border-box;
    background-clip: content-box, border-box;
    transition: 0.1s;
    transform: scale(1.4);
    animation: none;
}

.btn:active .circle {
    background: #FE53BB;
}

#stars {
    position: relative;
    background: transparent;
    width: 100%;
    height: 100%;
    overflow: hidden;
}

#stars::after {
    content: "";
    position: absolute;
    top: 0;
    left: -100%;
    width: 300%;
    height: 300%;
    animation: animStarRotate 90s linear infinite;
    background-image: radial-gradient(#ffffff 1px, transparent 1%);
    background-size: 50px 50px;
}

#stars::before {
    content: "";
    position: absolute;
    top: -200%;
    left: -100%;
    width: 300%;
    height: 300%;
    animation: animStar 60s linear infinite;
    background-image: radial-gradient(#ffffff 1px, transparent 1%);
    background-size: 50px 50px;
    opacity: 0.5;
}

@keyframes animStar {
    from {
        transform: translateY(0);
    }
    to {
        transform: translateY(300%);
    }
}

@keyframes animStarRotate {
    from {
        transform: rotate(360deg);
    }
    to {
        transform: rotate(0);
    }
}

@keyframes gradient_301 {
    0% {
        background-position: 0% 50%;
    }
    50% {
        background-position: 100% 50%;
    }
    100% {
        background-position: 0% 50%;
    }
}

@keyframes pulse_3011 {
    0% {
        transform: scale(0.75);
        box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);
    }
    70% {
        transform: scale(1);
        box-shadow: 0 0 0 10px rgba(0, 0, 0, 0);
    }
    100% {
        transform: scale(0.75);
        box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
    }
}

.heart {
    width: 30px;
    margin: 0;
    transition: transform 0.4s ease, opacity 0.3s ease;
    will-change: transform, opacity;
    transform: translateZ(0);
}

.heart:hover {
    transform: scale(1.5) translateZ(0);
    transition-duration: 0.1s;
}

.heart:active {
    transform: scale(3.7) translateZ(0);
    opacity: 0.1;
    transition-duration: 0.3s;
}

HTML

<button class="btn" type="button">
    <strong>Submit</strong>
    <div id="container-stars">
        <div id="stars"></div>
    </div>
    <div id="glow">
        <div class="circle"></div>
        <div class="circle"></div>
    </div>
</button>

<img src="https://images.emojiterra.com/google/noto-emoji/unicode-15/color/512px/2764.png" class="heart">

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:24:50