首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fadeIn在第n个子节点上不起作用(2)

fadeIn在第n个子节点上不起作用(2)
EN

Stack Overflow用户
提问于 2014-05-18 06:14:29
回答 2查看 120关注 0票数 0

有没有人可以看看我的代码。它应该做的是使用fadeIn和fadeOut动画的img标签,但它只淡出第一个img,而不是在第二个img淡出。我认为我的css可能是错误的,这就是为什么第二张图片没有显示我没有得到任何错误的原因

它是一个图像叠加在另一个图像之上

jQuery

代码语言:javascript
复制
$(document).ready(function() {
    $('.social-media a').on('mouseenter', function(e) {
        $(this).find("img:nth-child(2)").fadeIn();
        $(this).find("img:nth-child(1)").fadeOut()
    });
})

HTML

代码语言:javascript
复制
<div class="social-media">
    <a title="Share On Twitter" href="#">
         <img alt="" src="images/icon_twitter.png" />
         <img class="test" alt="" src="images/icon_twitter_active.png" />
</a>
</div>

CSS

代码语言:javascript
复制
.social-media {
    padding-top: 20px; 
    width: 166px; 
    margin: 0 auto 10px auto;
}
.social-media a {
    position: relative;
    width: 55px;
    height: 51px;
}
.social-media a img:nth-child(1) {
    opacity: 1;
}
.social-media a img:nth-child(2) {
    position: absolute;
    left: 0; top: -33px;
    opacity: 0;
    z-index: 2; 
}
EN

回答 2

Stack Overflow用户

发布于 2014-05-18 06:21:39

您应该改用display: none,而不是用零不透明度隐藏第二个<img>元素:

代码语言:javascript
复制
.social-media a img:nth-child(2) {
    position: absolute;
    left: 0; top: -33px;
    display: none;
    z-index: 2; 
}

http://jsfiddle.net/8vH4E/

但是,我强烈建议使用简单的CSS图像sprite来实现此效果,它不需要JS。

更新:自从OP询问是否可以使用CSS时,我已经修改了以排除JS的使用,并简单地依赖于CSS和伪元素:http://jsfiddle.net/8vH4E/2/

代码语言:javascript
复制
.social-media a {
    display: block;
    position: relative;
    width: 100px;
    height: 100px;
    background-image: url(http://placehold.it/200x200);
    background-size: cover;
}
.social-media a::before {
    background-image: url(http://placehold.it/200x200/4a7298/eeeeee);
    background-size: cover;
    content: '';
    display: block;
    opacity: 0;
    pointer-events: none;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    -webkit-transition: all .25s ease-in-out;
    transition: all .25s ease-in-out;
}
.social-media a:hover::before {
    opacity: 1;
}

我的策略很简单:

  • 改用背景图像。为了调整大小,我使用了cover,但您可以自由地使用任何大小(绝对像素/点大小、相对百分比大小或动态计算的大小,如covercontain)
  • For悬停状态,使用覆盖整个<a>的绝对定位伪元素(通过绝对定位并从所有四个方向零偏移)。我们不需要伪元素上的指针事件,所以我们将它设置为pointer-events: none
  • When,<a>元素被悬停在上面(以:hover选择器为目标),我们将伪元素的不透明度从0切换到1。我们在伪元素上声明transition属性,以允许平滑的、浏览器计算的和JS不可知的转换。
票数 1
EN

Stack Overflow用户

发布于 2014-05-18 07:31:28

精灵很好,但是没有给出平滑的淡入淡出动画(我想这是主要原因,KDM,不是吗?)

因此,让我们修复现有的代码:

  1. 作为fadeOut()将元素转换为display: none;状态,因为fadeIn()在元素为display: none;时开始工作。因此,让我们首先在display: none;中旋转第二个图像;
  2. 我们可以完全忽略这两个图像的不透明度(依赖于1.0作为默认值);$.fadeIn/Out()使用CSS中的不透明度作为动画的开始/结束点。当然,如果图像是在这样的way;
  3. display: inlibe-block;中设计的,那么您可以显式地为每个图像设置不透明度,因为<a>是一个很好的点,因为它包含可能会消失的内联元素(display: none;);这会导致整个<a>消失,并且mouseleave事件会触发意外的UI错误。

享受http://jsfiddle.net/8vH4E/1/,并感谢Terry提供的小提琴:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23716583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档