【问题标题】:Flickering div when using CSS transform on hover在悬停时使用 CSS 变换时闪烁的 div
【发布时间】:2013-09-21 14:43:21
【问题描述】:

我在推文(以及 Facebook 赞)按钮的顶部创建了一个div。我希望它在我将鼠标悬停在div(按钮)上方时立即向上移动,这样您就可以真正按下真正的推文按钮。我尝试了以下方法。

HTML:

<div class="tweet-bttn">Tweet</div>         
<div class="tweet-widget">
    <a href="https://twitter.com/share" class="twitter-share-button">Tweet</a>
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
</div>

CSS:

.tweet-bttn{
    position: relative;
    top: -30px;
    left: -10px;
    display:block;
    opacity: 1;
    width: 80px;
    padding: 10px 12px;
    margin:0px;
    z-index:3;}

.tweet-bttn:hover{
    -webkit-animation-name: UpTweet;
    -moz-animation-name: UpTweet;
    -o-animation-name: UpTweet;
    animation-name: UpTweet;
    -webkit-animation-duration:.5s;
    -moz-animation-duration:.5s;
    animation-duration:.5s;
    -webkit-transition: -webkit-transform 200ms ease-in-out;
    -moz-transition: -moz-transform 200ms ease-in-out;
    -o-transition: -o-transform 200ms ease-in-out;
    transition: transform 200ms ease-in-out;}

@-webkit-keyframes UpTweet {
    0% {
        -webkit-transform: translateY(0);
    }   
    80% {
        -webkit-transform: translateY(-55px);
    }
    90% {
        -webkit-transform: translateY(-47px);
    }
    100% {
        -webkit-transform: translateY(-50px);
    }
    ... and all other browser pre-fixes.
}

我不确定出了什么问题。看起来一悬停,它就会移动,但如果我将光标再移动一个像素,它必须进行新的计算,这会导致闪烁。

【问题讨论】:

    标签: html css hover transform


    【解决方案1】:

    当您可以使用transitions 简单地实现上述目标时,我不知道为什么您需要动画来实现这一点

    诀窍是在父鼠标悬停时移动子元素

    Demo

    div {
        margin: 100px;
        position: relative;
        border: 1px solid #aaa;
        height: 30px;
    }
    
    div span {
        position: absolute;
        left: 0;
        width: 100px;
        background: #fff;
        top: 0;
        -moz-transition: all 1s;
        -webkit-transition: all 1s;
        transition: all 1s;
    }
    
    div span:nth-of-type(1) {
    /* Just to be sure the element stays above the 
       content to be revealed */
        z-index: 1;
    }
    
    div:hover span:nth-of-type(1) { /* Move span on parent hover */
        top: -40px;
    }
    

    解释:首先我们将span 包裹在div 元素中,即position: relative; 后来我们在span 上使用transition,这将有助于我们平滑animation 的流动,现在我们使用position: absolute;left: 0;,这将彼此堆叠元素,而不是我们使用z-index确保第一个元素覆盖第二个。

    现在,最后,我们移动第一个span,我们使用nth-of-type(1) 选择它,它只是嵌套在div 中的第一个子元素,我们分配top: -40px;,它将传输当父 div 悬停时。

    【讨论】:

    • 好吧,我不知道这个,但它看起来像一个魅力。非常感谢!!
    • @EmielJanson 欢迎您,如果您不知道,请尝试了解这一点:) 虽然我会编辑我的答案来解释,对不起,我错过了
    • @EmielJanson 解释 :)
    • 非常感谢!这一切都开始变得有意义了。我玩过一点。 :)
    • @EmielJanson 很高兴为您提供帮助 :)
    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2020-08-28
    • 2018-03-11
    • 1970-01-01
    • 2012-06-18
    • 2011-11-26
    相关资源
    最近更新 更多