【问题标题】:Cleaning up CSS jitters清理 CSS 抖动
【发布时间】:2013-05-08 02:55:34
【问题描述】:

我已经构建了这些在鼠标悬停时扩展边框的圆圈。我现在遇到的唯一问题是有时圆圈会抖动/晃动。当我将transition: all .1s ease-in-out; 设置为超过 0.2 秒时,它变得更加明显。

有没有办法解决这个问题,还是就是这样?

这是JsFiddle中的代码

感谢您的所有帮助!

编辑:我正在转换圆圈的尺寸(宽度和高度)以保持居中。我意识到这导致了过渡期间的抖动。有解决办法吗?

【问题讨论】:

  • 相对位置似乎有点清楚了。但你必须重做所有的CSS。我稍微摆弄了一下,让抖动消失了,但它完全改变了功能。
  • 也玩过,但还是有抖动:jsfiddle.net/enBMC/7
  • 是的......似乎正在发生,因为过渡属性没有同时均匀地移动所有其他属性。
  • 显然 Chrome 会遍历转换,但 Firefox 会一一进行。 Chrome 对我来说没有抖动(Firefox 有)
  • Chrome 也有抖动。如果您使用过渡持续时间,它会变得很明显(至少在 linux/64 位)

标签: html css css-transitions


【解决方案1】:

去抖动抖动 ma​​rgin: 0 -12%; 如果添加填充 padding: 0 12%;

menu li a:hover {
    margin: 0 -12%;
    padding: 0 12%;
    color: #fff;
    background: #ff5a5f;
    display: inline-block;
}

【讨论】:

    【解决方案2】:

    不要过渡宽度和高度。保持相同的宽度和高度,只转换外圈的边框。

    对于您的内圈 (.circle),设置一个 12 像素实心的白色边框#ffffff。现在它总是相对于外圆在同一个位置,现在它不必改变大小。标题也不能跳来跳去,因为它总是在同一个位置。

    对于外圈,当它没有悬停时,确保它的大小和边框和原来一样,但是边框是白色的,5px纯色#ffffff。

    我认为你也可以取消很多额外的定位。

    这里是修改后的jsFiddle,大家可以看看,这里是修改后的CSS:

    .box {
    position: relative;
    width: 220px;
    height: 220px;
    float: left;
    margin-right: 50px;
        text-align: center;
    }
    
    .clearcircle {
    width: 225px;
    height:225px;
    border-radius: 100%;
    background-color: transparent;
    border: 5px solid #ffffff;
    transition: all .2s ease-in-out;
    }
    
    .clearcircle:hover {
    border: 5px solid #c0392b;
    
    }
    .circle {
    width: 200px;
    height:200px;
        border: 12px solid #ffffff;
    border-radius: 100%;
    background-color: #e74c3c;
    overflow: hidden;
    transition: all .2s ease-in-out;
    
    }
    
    
    .circle p {
    position:relative;
    text-align: center;
    color: white;
    transition: all .3s;
    }
    
    
    .circle:hover{
    background-color: #e97468;
    } 
    

    顺便说一句,将 divp 放入 a 标记会破坏经过验证的 XHTML 标记。您可能想改用 div,并添加一个“点击时”操作,使其表现为链接。

    【讨论】:

    • 虽然您的标记更清晰,但该示例所做的操作与操作的动画不同
    • 虽然我理解你的推理,但我已经按照它们的方式制作了我的圆圈,以便从圆圈后面扩展边框的动画。在您的示例中,边框刚刚淡入,我的边框看起来更具扩展性。我想保持这种外观。
    • 哦!是的,我的错。我不得不说 Alp 的演示在我测试时运行良好。
    【解决方案3】:

    我去掉了顶部/左侧定位的百分比值,清理了边距并对齐了外圆的边框宽度:

    这是DEMO

    .box {
        position: relative;
        width: 220px;
        height: 220px;
        float: left;
        margin-right: 50px;
    }
    
    .clearcircle {
        position: absolute;
        top:15px;
        left:15px;
        width: 190px;
        height:190px;
        border-radius: 100%;
        background-color: transparent;
        border: 5px solid #c0392b;
        transition: all .2s ease-in-out;
    }
    
    .clearcircle:hover {
        width:220px;
        height: 220px;
        top: 0px;
        left: 0px;
        border: 5px solid #c0392b;
    
    }
    .circle {
        position: absolute;
        top:50%;
        margin-top: -100px;
        left: 50%;
        margin-left:-100px;
        width: 200px;
        height:200px;
        border-radius: 100%;
        background-color: #e74c3c;
        overflow: hidden;
        transition: all .2s ease-in-out;
    
    }
    
    
    .circle p {
        position:relative;
        text-align: center;
        top: 50%;
        margin-top: -55px;
        color: white;
        transition: all .3s;
    }
    
    
    .circle:hover{
        background-color: #e97468;
    }
    

    【讨论】:

    • 这似乎消除了 jfiddle 示例中的抖动。不幸的是,在我实际使用这些圆圈的代码中,即使使用您的代码,抖动仍然存在。但是,您的代码确实减少了抖动!
    • 也许您可以上传您的页面或展开小提琴示例。
    • 在这里对您的示例进行了一些小的调整,现在有了完美的结果。谢谢您的帮助!你让我走上了正确的道路。也很抱歉回复晚了,我也在柏林时区忙了一整天......:D
    • 同一时区 :) 很高兴我能帮上忙!
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多