【问题标题】:JQuery: How to hide an image until source changedJQuery:如何隐藏图像直到源更改
【发布时间】:2014-05-07 14:09:41
【问题描述】:

我有一个图像正在根据容器的当前高度/宽度以编程方式调整大小。我的问题是它在调整大小之前以原始大小显示图像。

看到这个JSFiddle

您会注意到它是如何在拉伸后的图像很好地适合中间的图像之前闪烁的。

我想在调整大小之前隐藏图像,但我不知道怎么做。

有什么建议吗?

JS代码:

function LoadImg(img) {
    img.css('visibility','hidden');
    var src=img.attr('src');
    var imgh = img.parent().height();
    var imgw = img.parent().width();
    var pattern = /&?(w|h)=[^&]+/g;
    src = src.replace(pattern, '');
    img.attr('src', src + '&w=' + imgw + '&h=' + imgh);    
    img.css('visibility','');
}

HTML:

<div class="window">
<img src="http://www.angclassiccarparts.co.uk/image_anysize.aspx?f=/images/ww/panel/service_kits.jpg&w=154&h=154&color=png" id="img" onload="LoadImg($(this));" />
</div>

我尝试在函数运行之前隐藏可见性,但这并没有等待它加载...

【问题讨论】:

    标签: javascript jquery css image show-hide


    【解决方案1】:

    您正在更改图像的来源,这会强制它加载新图像,然后您立即将图像设置为可见。

    最终你想等到第二张图片加载完毕后再显示,这可以使用.load() 来实现,如下所示:

    img.on('load', function() {
        img.css('visibility','visible');
    });
    

    这是一个更新后的 jsFiddle,其中包含工作代码:http://jsfiddle.net/ev4YL/2/

    不过,我会推荐一种不同的方法。加载图像没有多大意义,然后在加载时加载另一个图像。也许您应该将尺寸存储在 html 数据属性中,然后在 document.ready 上动态加载图像。

    如果您将每个图像设置为以data-src 而不是src 开头,这样的方法可能会起作用:

    $('img').each(function() {
        var img = $(this);
    
        var src = img.attr('data-src');
        var imgh = img.parent().height();
        var imgw = img.parent().width();
        var pattern = /&?(w|h)=[^&]+/g;
        src = src.replace(pattern, '');
        img.attr('src', src + '&w=' + imgw + '&h=' + imgh);    
    
        img.on('load', function() {
            img.css('visibility','visible');
        });
    });
    

    这里的演示:http://jsfiddle.net/ev4YL/4/

    【讨论】:

    • 这里创建了一种无限循环,我的意思是:jsfiddle.net/ev4YL/3
    • 它在我的实际项目中被$(window).resize 函数调用。它的容器的尺寸基于浏览器窗口的高度和宽度。它的工作原理很奇怪,从另一个 img onload 函数中调用了一个 img onload 函数。我不会想到这一点,谢谢:)
    • @JamieBarker 等等,不要使用它,A. Wolff 是对的,它会不断触发 load 事件。给我一点时间来修复它。
    • 我认为最好放弃 html 中的 onload 事件,而只使用类似这样的东西(这也考虑了调整大小):jsfiddle.net/ev4YL/7。话虽如此,为什么需要在调整大小时加载新图像?仅使用 HTML/CSS 调整大小有什么问题?
    • 似乎只在 IE 中循环,典型...它调整图像大小以适应边界,但保持纵横比。
    【解决方案2】:

    您可以使用 display: none 隐藏图像,直到函数结束,然后将图像设置为 display: block (或任何您需要的)在最后。这样,函数的其余部分已经运行,当它显示时,它已经被调整了大小。

    JSFiddle

    但基本上只是: CSS:

    img {
      display: none;
    }
    

    JavaScript:

    function loadImg(img) {
      ----all of your function here----
      img.css('display', 'block');
    }
    

    【讨论】:

    • 不能这样做。使用隐藏的可见性,因为它将周围的元素保持在原位。
    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2010-10-07
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多