【问题标题】:How to create an image hover fade effect with jQuery and CSS?如何使用 jQuery 和 CSS 创建图像悬停淡入淡出效果?
【发布时间】:2016-05-02 19:04:29
【问题描述】:

我正在尝试通过淡入和淡出两个图像来创建徽标悬停效果。我尝试使用 CSS,但结果看起来并没有预期的那么好(尽管它在其他用途​​上非常有效),所以我决定也尝试 jQuery。 (忽略标签,它们是给博主的)。

这是我的第一种方法(在淡入淡出时看起来不错,但是当第一次将鼠标悬停在它上面时,'display: none' 并没有正确地变成 'display: block',所以图像从它的初始位置移动了。然后它会回到那个位置,当它悬停时它工作得很好。

<script type='text/javascript'>
//<![CDATA[
$(function() {
$('#MyLogoContainer').hover(function() {
    $('#MyLogoHover').fadeIn('slow');
    $('#MyLogo').fadeOut('slow');  
}, function() { 
    $('#MyLogo').fadeIn('slow'); 
    $('#MyLogoHover').fadeOut('slow');   
});
});
//]]>
</script>

我的第二种方法解决了 CSS 位置问题,但动画看起来一点也不流畅,而且两个图像在某些时候几乎完全消失,这看起来不太好,而且我的第一种方法没有发生这种情况。

<script type='text/javascript'>
//<![CDATA[
$(function() {
$('#MyLogoContainer').hover(function() {
    $('#MyLogoHover').fadeIn('slow').css('display','block');
    $('#MyLogo').fadeOut('slow').css('display','none');  
}, function() { 
    $('#MyLogo').fadeIn('slow').css('display','block'); 
    $('#MyLogoHover').fadeOut('slow').css('display','none');   
});
});
//]]>
</script>

问题出在 CSS 上。不知何故,我必须找到一种方法,使 display 属性在定位这两个 SVG 图像中的任何一个时都不会起关键作用,所以我可以使用第一个 jQuery 代码,而不会对我的 SVG 图像的位置发生任何变化。

#MyLogoContainer {
    width: 100%;
    left: 50%;
    margin: 0 0 0 -350px;
    position: absolute;
}
#MyLogo {
    width: 700px;
    display: block;
    position: absolute;
}

#MyLogoHover {
    width: 700px;
    display: none;
    position: absolute;
}

【问题讨论】:

  • 如果你想要一个 javascript 方法,jQuery 将使这更容易。否则,您可以通过更改要淡入淡出的元素的类来使用 css 过渡。我们需要查看更多代码才能提供帮助。 HTML 是什么样的?
  • 要将一个图像淡入另一个图像,两个图像必须在淡出时同时显示。创建两个图像,一个在另一个之上。当顶部的那个应该消失时,将 CSS opacity 设置为 0,使用 CSS transition
  • 感谢您的 cmets,我将使用 jQuery,与自己编写 JavaScript 相比,它非常容易,而且结果看起来比使用 CSS 更好。
  • 删除两个代码块中的css() 方法调用。在幕后fadeIn()fadeOut() 本质上是在动画时间尺度上处理这些CSS 声明,因此它们是不必要的。让我知道这是否有效。

标签: jquery css hover fadein fadeout


【解决方案1】:

根据您的描述,您甚至可能不需要 JS 来执行此操作:

.container {
  position: relative;
  display: inline-block;
  box-sizing: border-box;
  border: 1px solid black;
  cursor: pointer;
  overflow: hidden;
  background: #ccc;
  height: 150px;
  width: 150px;
}

.container:hover .logo--static-state {
  opacity: 0;
}

.container:hover .logo--hover-state {
  opacity: 1;
}

.logo {
  position: absolute;
  transition: opacity 300ms ease-in-out;
}

.logo--static-state {
  z-index: 9999;
}

.logo--hover-state {
  opacity: 0;
  z-index: 9998;
}
<div class="container">
  <img class="logo logo--static-state" src="http://placehold.it/150x150?text=Static" height=150 width=150>
  <img class="logo logo--hover-state" src="http://placehold.it/150x150?text=Hovered" height=150 width=150>
</div>

【讨论】:

  • 它可以工作,但问题是两个图像都是透明的 SVG,并且在悬停之前,边框在静态图像下方可见。有没有办法在悬停图像上设置 0 不透明度并在悬停在静态图像上时将其增加到 1(就像你降低那个不透明度一样。我想我有办法做到这一点。悬停在容器本身上,我会试试的。
  • 根据您的评论进行更改。让我知道这是否有效。
  • 感谢您的更新。我正在尝试制作徽标悬停效果。在您更新答案之前,我使用 jQuery 进行了尝试,并遇到了类似的问题。我的 CSS 代码有问题,因为 'display: none';不会变成“显示:块”;当我第一次在悬停图像中淡入淡出时..如果我添加 .css('display', 'block') 它只是像您的代码一样短暂消失,看起来不像预期的那样。我将用我的 CSS 和 jQuery 更新我的问题。如果您更新答案,我认为您不应该删除到目前为止发布的内容,它肯定会对某人有用。
猜你喜欢
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多