【问题标题】:jQuery Image fadeIn Upon Scroll Inside DIV在DIV内滚动时jQuery图像淡入淡出
【发布时间】:2012-06-28 22:31:55
【问题描述】:

我无法让实际的 LazyLoad 插件为我工作,所以我正在尝试自己编写。目前我有一个在 DIV 中加载的图像列表。它们由 PHP 查询拉到 mysql 数据库。 DIV 滚动设置为自动。我使用的代码是:

<div id="b1" style="overflow:auto;">
<?PHP $result = mysql_query("SELECT * FROM images");

while($row = mysql_fetch_assoc($result)) {

echo "<img src='$row[photo]' style='display:none'> <br>";

}

</div>

<script type="text/javascript">
function imgCheck() {
var position        = $("img").offset().top;            
var scrollCheck       = $("#b1").scrollTop() + $("#b1").height();
if ( scrollCheck > position) {
  $("img").fadeIn("fast");
   }


$("#b1").scroll( function() { imgCheck() } );
</script>

虽然这对我不太有效。任何人都可以帮助我或提出一些建议吗?

【问题讨论】:

  • 您能否进一步说明“不适合我”?
  • 是的,很抱歉,在滚动 DIV 时没有图像淡入。没有任何反应。

标签: javascript jquery


【解决方案1】:

两件事:

  • 正如其他人已经说过的那样,您的代码存在语法错误 - 无论是 PHP 还是 Javascript。
  • 如果你使用display: none,元素不会占据任何高度,从而导致整个东西变得无法滚动和失败。
  • 前几个元素应该是可见的,而无需用户开始滚动

考虑到这些,我们可以尝试这样写:

// Cache the containing element and it's height
var b1 = $('#b1'),
    h = b1.height();

// Insert 20 img's - simulating server-side code
for(var i = 0; i < 20; i++){
    $('<img />', {
        src: 'http://placehold.it/100x100',
        alt: '',
        class: 'hidden',
        width: 100,
        height: 100
        // visibility: hidden to retain it's size
    }).css('visibility', 'hidden').appendTo(b1);
}

b1.scroll(function(){
    // Loop through only hidden images
    $('img.hidden').each(function(){
        // $(this).position().top calculates the offset to the parent
        // So scrolling is already taken care of here
        if(h > $(this).position().top){
            // Remove class, set visibility back to visible,
            // then hide and fade in image
            $(this).css('visibility', 'visible')
                .hide()
                .removeClass('hidden')
                .fadeIn(300);
        } else {
            // No need to check the rest - everything below this image
            // will always evaluate to false - so we exit out of the each loop
            return false;
        }
    });
    // Trigger once to show the first few images
}).trigger('scroll');

在此处查看演示:http://jsfiddle.net/yijiang/eXSXm/2

【讨论】:

  • 当我去链接查看它时,我什么都没有发生。它只是显示一个空的 DIV。顺便谢谢。你总是把我从困境中拉出来并帮助我。我真的很感激。
  • @mcb 我已经更新了代码,因为我在早期版本中犯了一个错误。现在可以用了吗?
  • 非常感谢,我无法告诉您我多么感谢您的帮助。你一直在帮助我,你又一次做到了。如果没有社区和这里的伟人,我不知道我会做什么。
  • 不错的解决方案。打败我:)
【解决方案2】:

如果所有图像都被隐藏,则永远不会有“滚动”,因为元素永远不会滚动。

您到底想达到什么目的?如果要让以前不可见但现在可能可见的新图像变得可见,那么您将必须执行类似的操作;

<div id="b1" style="overflow:auto;">
<?php $result = mysql_query("SELECT * FROM images");

while($row = mysql_fetch_assoc($result)) {
    echo "<img src='$row[photo]' style='visibility:hidden'> <br>";
} ?>

</div>

<script type="text/javascript">

function imgCheck() {
    var scrollCheck = $("#b1").scrollTop() + $("#b1").height();

    $("#b1 img").each(function() {
        var position = $(this).offset().top;            
        if (scrollCheck > position) {
            $(this).fadeIn("fast");
        }
    });
}

$(document).ready(imgCheck);

$("#b1").scroll(imgCheck);
</script>

请注意,我没有测试上述内容,我可以想象它会立即显示所有图像,因为它们的所有“顶部”都将是 0,因为它们都被隐藏并且它们的位置不受DOM 中的先前图像。

编辑

我已经更改了上面的代码,所以 img 具有可见性:隐藏,这应该给它们一个高度并占用 DOM 中的空间

【讨论】:

  • 如果我在每个空的图像上添加一个元素,例如占位符,例如: echo "

    ";或者如果我将每个图像包装在一个 DIV 中?
  • @Jess:是的,所有这些都在第一次滚动后立即显示。
  • 是的,我也注意到了,在初始滚动之后,一切都淡入了。我认为我没有指定,对此很抱歉,但我希望在滚动到它们的位置时淡入每个。谢谢您的帮助。我很感激。
  • 我更新了代码,使图像可见性:隐藏,这应该允许它们在 DOM 中具有高度。
  • 仍然不适合我。我还在努力。再次感谢您的帮助。
【解决方案3】:

我一直在测试它,它似乎进行了一些修改:

http://jsfiddle.net/antiflu/zEHtu/

有些事情我不得不改变:

  • 我为imgCheck() 函数添加了结束},你忘了
  • 有些项目需要从一开始就可见,否则滚动条永远不会出现,并且永远不会调用 imgCheck()。

好的,上面的问题是图像在滚动时不会单独淡入。我通过一些修改让它工作:

http://jsfiddle.net/antiflu/GdzmQ/

我改变了什么:

  • 我将display: none改为opacity: 0,这样任何不可见的图片都至少有一个相同大小的空占位符,这样滚动条才会可见。
  • 然后我使用animate 淡入到opacity: 1
  • 我使用 jQuery each() 遍历图像并检查每个图像是否应该淡入或不应该淡入(而不是像以前一样检查所有)。
  • 我将图像包装在 DIV 中。我认为没有必要,但也无妨。
  • 我用id 标记了每张图片,这样我就可以将它们挑选出来进行淡入淡出。

仍然存在一些审美问题,但这应该对您有所帮助。

【讨论】:

  • 啊,我看到它确实适用于 jsFiddle,我想也许我没有指定我试图让每个图像在滚动到它的位置时淡入。有任何想法吗?感谢您的帮助。
  • 是的,检查修改后的小提琴,现在效果更好。我将继续更新答案以解释我的所作所为。
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 2011-12-18
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多