【问题标题】:jQuery, image changing on hover [duplicate]jQuery,悬停时图像更改[重复]
【发布时间】:2013-07-04 16:15:45
【问题描述】:

好的,所以我已经通过 PHP 动态生成了图像,所以不一定是相同的图像结果。在过去的四个小时里,我用 jQuery 和/或 CSS 尝试了无数次互联网,并想出了以下可行的方法。

    <a href="build.php?x=1875&y=2020"><img style='background:url(images/tile_4.jpg)' src='images/tile_4.jpg' onmouseover="this.src='images/Market.png'" onmouseout="this.src='images/tile_4.jpg'" /></a>
<a href="build.php?x=1876&y=2020"><img style='background:url(images/tile_4.jpg)' src='images/tile_4.jpg' onmouseover="this.src='images/Market.png'" onmouseout="this.src='images/tile_4.jpg'" /></a>
<a href="build.php?x=1877&y=2020"><img style='background:url(images/tile_4.jpg)' src='images/tile_4.jpg' onmouseover="this.src='images/Market.png'" onmouseout="this.src='images/tile_4.jpg'" /></a>
<a href="build.php?x=1878&y=2020"><img style='background:url(images/tile_4.jpg)' src='images/tile_4.jpg' onmouseover="this.src='images/Market.png'" onmouseout="this.src='images/tile_4.jpg'" /></a>
<a href="build.php?x=1879&y=2020"><img style='background:url(images/tile_4.jpg)' src='images/tile_4.jpg' onmouseover="this.src='images/Market.png'" onmouseout="this.src='images/tile_4.jpg'" /></a>

Market.png 具有透明背景。

现在,上述工作。在鼠标悬停时,它显示 Market.png,透明背景部分为 tile_4.jpg,鼠标移出为 tile_4.jpg。

我想知道的是:有没有办法用 jQuery 或 CSS 完成与上述完全相同的事情?我还没弄明白,我已经花了几个小时尝试,但如果可能的话,我宁愿做其他事情(由于大量重复,上述格式目前重复了大约 100 次,但我有计划将其扩展到 1000 倍以上)将成为带宽消耗。

【问题讨论】:

  • 好吧,当动态生成的图像并不总是相同的图像时,问题就会出现。例如,其他图像之一编码为:&lt;img style='background:url(images/tile_4.jpg)' src="images/2.jpg" onmouseover="this.src='images/Market.png'" onmouseout="this.src='images/2.jpg'" /&gt; 进行简单的切换。

标签: javascript jquery html css


【解决方案1】:

您可以为每个&lt;img /&gt; 元素添加一个类,例如“xyz”(请选择更好的名称),然后利用hover() 函数。鉴于您的图像是动态的,您可以使用额外的数据属性渲染图像标记以用作“替代”或“悬停”图像源。最后,您可能会呈现如下内容:

<img class="xyz" data-alt-src="/images/Market.png" src="/images/tile_4.png" />
<img class="xyz" data-alt-src="/images/Something.png" src="/images/tile_5.png" />

然后为每个图像应用切换功能,您可以编写一个小函数,在悬停/悬停时交换图像src 属性和data-alt-src 属性:

var sourceSwap = function () {
    var $this = $(this);
    var newSource = $this.data('alt-src');
    $this.data('alt-src', $this.attr('src'));
    $this.attr('src', newSource);
}

然后它就像使用一点点jQuery事件绑定直接执行函数一样简单:

$(function () {
    $('img.xyz').hover(sourceSwap, sourceSwap);
});

这是一个工作示例(版本 1):

var sourceSwap = function () {
        var $this = $(this);
        var newSource = $this.data('alt-src');
        $this.data('alt-src', $this.attr('src'));
        $this.attr('src', newSource);
    }

    $(function () {
        $('img.xyz').hover(sourceSwap, sourceSwap);
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<img class="xyz" data-alt-src="http://cdn1.iconfinder.com/data/icons/fatcow/32/accept.png" src="http://cdn1.iconfinder.com/data/icons/fatcow/32/cancel.png" />
<br/>
<img class="xyz" data-alt-src="http://cdn1.iconfinder.com/data/icons/fatcow/32/accept.png" src="http://cdn1.iconfinder.com/data/icons/fatcow/32/cancel.png" />
<br/>
<img class="xyz" data-alt-src="http://cdn1.iconfinder.com/data/icons/fatcow/32/accept.png" src="http://cdn1.iconfinder.com/data/icons/fatcow/32/cancel.png" />

这里是来自 cmets 的 Andres Separ 的示例。使用此选择器,您无需使用标记类来装饰图像。它还将预加载备用源图像,以帮助消除悬停时的任何滞后或闪烁:

$(function() {
    $('img[data-alt-src]').each(function() { 
        new Image().src = $(this).data('alt-src'); 
    }).hover(sourceSwap, sourceSwap); 
});

这是第二个版本:

var sourceSwap = function () {
        var $this = $(this);
        var newSource = $this.data('alt-src');
        $this.data('alt-src', $this.attr('src'));
        $this.attr('src', newSource);
    }

    $(function() {
        $('img[data-alt-src]').each(function() { 
            new Image().src = $(this).data('alt-src'); 
        }).hover(sourceSwap, sourceSwap); 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<img data-alt-src="http://cdn1.iconfinder.com/data/icons/fatcow/32/accept.png" src="http://cdn1.iconfinder.com/data/icons/fatcow/32/cancel.png" />
<br/>
<img data-alt-src="http://cdn1.iconfinder.com/data/icons/fatcow/32/accept.png" src="http://cdn1.iconfinder.com/data/icons/fatcow/32/cancel.png" />
<br/>
<img data-alt-src="http://cdn1.iconfinder.com/data/icons/fatcow/32/accept.png" src="http://cdn1.iconfinder.com/data/icons/fatcow/32/cancel.png" />

【讨论】:

  • 是的,这行得通。谢谢,非常感谢。它还可以满足我的要求(减少 DOM 中生成的代码量)。只有一件事:看到覆盖png图像如何具有透明背景,仍然需要将img.xyz{background:url(images/tile_4.png);}添加到文档的样式表中(使用您的xyz示例类),以便透明背景仍然是正确背景的背景图像而不是页面背景颜色的图像。
  • 现在这是一个很棒的脚本。
  • @Cory 干得好! 我建议一点! $('img[data-alt-src]').each(function(){ var $this = $(this); new Image().src = $this.data('alt-src'); $this.hover(sourceSwap, sourceSwap); });
  • @AndresSepar:谢谢,预加载很不错。我已将您的版本包含在我的答案中。
  • 效果很好,谢谢!特别是带有预加载的版本 2:D
【解决方案2】:

jQuery

您可以使用mouseover 和mouseout 事件:

$("img").on({
 "mouseover" : function() {
    this.src = 'images/Market.png';
  },
  "mouseout" : function() {
    this.src='images/tile_4.jpg';
  }
});

这样您可以从 HTML 中取出属性 onmouseout 和 onmouseover 并使您的代码整洁。

CSS

不过,最简单的方法是使用 CSS:

img {
  background-image: url('images/tile_4.jpg');
}

img:hover {
  background-image: url('images/Market.png');
}

【讨论】:

  • 它并不总是相同的图像,我说它是动态生成的。例如,其他图像之一被编码为:&lt;img style='background:url(images/tile_4.jpg)' src="images/2.jpg" onmouseover="this.src='images/Market.png'" onmouseout="this.src='images/2.jpg'" /&gt; 进行简单的切换。
  • @WitoldKowelski 然后您必须提供数据源。你从哪里得到这些数据?是 JSON 吗?
  • 它在 PHP 中,图像 src(以及 onmouseout)来自 MySQL 数据库。或者这不是你要问的?
  • 我认为你必须在这个问题中添加一个 PHP 标记,并在动态添加图像的代码中加上你从服务器接收到的数据的 lil sn-p。
  • 好吧,我可以。如果那会有所帮助。我认为锚链接并不是那么重要,它是通过一个调用几个 PHP 函数的 while 循环来实现的,但是控制显示什么图像的变量被编码为 src=\"images/$ImageNumber.jpg\" 其中 $imageNumber 是我第一条评论中的 2 .如果数据库中没有对应于 DB 查询的行,则结果将通过另一个函数运行,该函数将 src 简单地打印为 src='images/tile_4.jpg'
【解决方案3】:

当然,使用 jQuery 很容易。

$('img').hover(function(){
    $(this).attr('src','images/Market.png');
},function(){
     $(this).attr('src','images/tile_4.jpg'); 
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2015-01-16
    • 2018-07-07
    • 2012-03-13
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多