使用MouseEvent将图像更改为另一个图像时,如何避免闪烁?

时间:2016-04-19 18:15:14

标签: javascript

我有一个可点击的图像(徽标),我希望在HTML(而不是CSS)中定义,因为它是位于菜单中的徽标,应该与文本一起缩放,也是内容的语义部分。 / p>

我想让它在悬停时改变:

componentWillReceiveProps

问题是当我悬停图像时菜单和徽标会闪烁。这并不总是发生,但似乎与新的图像正确缩放需要眨眼。我在徽标上有Match Line = Regex.Match(str, @"Evaluation\s*(.+?)\s*Ltd."); str = str.Replace(Line.ToString(), ""); ,而<img src="logo.svg" onmouseover="this.src='logo_hover.svg'" onmouseout="this.src='logo.svg'"> 设置在持有它的div上。

如何避免这种闪烁?我应该在图像上设置宽度和高度,如果是这样,我该如何找出图像的高度?或者是否有其他方法可以避免浏览器在加载新图像时“感到惊讶”?

到目前为止我所做的一切:

我已经尝试使用javascript预加载图片,并且还使用width: 100%标记,但闪烁仍然会发生。

3 个答案:

答案 0 :(得分:1)

如果在悬停对象时图像没有被加载,则只需要预加载图像。你可以通过各种方式做到这一点。

你可以在没有一点CSS的情况下通过在页面的最末端再次添加图像来完成它,并将此副本设置为宽度和高度为0.我建议&#34;页面结束&#34 ;因为您可能希望首先加载页面的可见位。如果你把它放在开头,页面可见位的加载时间可能会稍长一些,但翻转不应该让页面完全加载才能工作。

<img src="myimage_onhover.png" height="0" width="0" />

这样浏览器就会在缓存中显示图像,即使它没有显示。

所以如果你有一个像这样的图像:

<img src="myimage.png" onmouseover="this.src='myimage_onhover.png'" [...] />

当用户将鼠标悬停在图像上时,浏览器应该获取已在同一页面加载时加载的缓存图像。

答案 1 :(得分:1)

根据您尝试做的事情,我强烈建议不要采用这种方法,因为您实际上只需使用CSS来处理悬停状态,就可以操纵SVG的属性。

您对徽标有什么改变 - 如果我可能会问?

如果是颜色等情况,您可以使用直接在您的HTML中使用内联SVG代码然后使用CSS应用颜色等的方法。然后,您可以编辑悬停状态的CSS属性。通过NSString *strDou = @"40.87"; strDou = [NSString stringWithFormat:@"%.2f",[strDou floatValue]]; double d = [strDou doubleValue]; 标记使用SVG的问题是您无法编辑其属性 - 我相信您已了解这些属性。

对于istance - 一个svg徽标:

img

悬停颜色变化的CSS:

<svg version="1.1" id="my-Logo" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 140.9 36.1" xml:space="preserve">
<g>
    <path d="M0,35.8v-35h7.8v28h14.9v7H0z"/>
    <path d="M56.9,30.9c-3.5,3.5-7.9,5.2-13.1,5.2c-5.2,0-9.5-1.7-13-5.2c-3.5-3.4-5.3-7.7-5.3-12.9c0-5.1,1.8-9.4,5.3-12.9
        c3.5-3.4,7.9-5.2,13-5.2c5.2,0,9.5,1.7,13.1,5.2c3.5,3.5,5.3,7.7,5.3,12.9C62.1,23.2,60.4,27.5,56.9,30.9z M54.2,18.1
        c0-3.1-1-5.8-3-8c-2-2.2-4.5-3.3-7.4-3.3c-2.9,0-5.4,1.1-7.4,3.3c-2,2.2-3,4.9-3,8c0,3.1,1,5.8,3,7.9c2,2.2,4.5,3.3,7.4,3.3
        c2.9,0,5.4-1.1,7.4-3.3C53.2,23.8,54.2,21.2,54.2,18.1z"/>
    <path d="M91.4,18h7.9v12.4c-3.5,3.9-8.3,5.8-14.4,5.8c-5.1,0-9.4-1.7-12.9-5.1c-3.5-3.4-5.2-7.7-5.2-12.9c0-5.2,1.8-9.5,5.3-13
        S79.9,0,84.9,0c5,0,9.4,1.6,13.1,5l-4,5.8c-1.6-1.4-3-2.3-4.3-2.8c-1.3-0.5-2.7-0.8-4.3-0.8c-3,0-5.5,1-7.5,3c-2,2-3,4.7-3,8
        c0,3.3,1,5.9,2.9,7.9c2,2,4.3,3,7,3s5-0.5,6.8-1.6V18z"/>
    <path d="M135.6,30.9c-3.5,3.5-7.9,5.2-13.1,5.2c-5.2,0-9.5-1.7-13-5.2c-3.5-3.4-5.3-7.7-5.3-12.9c0-5.1,1.8-9.4,5.3-12.9
        c3.5-3.4,7.9-5.2,13-5.2c5.2,0,9.5,1.7,13.1,5.2c3.5,3.5,5.3,7.7,5.3,12.9C140.9,23.2,139.2,27.5,135.6,30.9z M133,18.1
        c0-3.1-1-5.8-3-8c-2-2.2-4.5-3.3-7.4-3.3c-2.9,0-5.4,1.1-7.4,3.3c-2,2.2-3,4.9-3,8c0,3.1,1,5.8,3,7.9c2,2.2,4.5,3.3,7.4,3.3
        c2.9,0,5.4-1.1,7.4-3.3C132,23.8,133,21.2,133,18.1z"/>
</g>
</svg>

如果你想用这种方法编辑/操作SVG属性,你可以避免做一些过于复杂的javascript魔术师shazaam。

Live Example

答案 2 :(得分:0)

闪烁可能与未加载的新图像有关,因此在您设置img标记的 src 属性之前,它不会开始加载。因此,为了避免这种情况,您可以使用javascript预加载新图像。

如果您想知道如何操作,可以查看以下答案: Load Image from javascript

但是在悬停时切换图像的更好解决方案是将两个图像放入spritesheet,将图像设置为div,span,a等的背景,并使用CSS background-position来制作悬停部分悬停时可见的图像如下所示:https://stackoverflow.com/a/19967062/1768033