【问题标题】:Fancybox - apply a function to several elementsFancybox - 将函数应用于多个元素
【发布时间】:2013-08-16 01:34:02
【问题描述】:

下面的源代码由 Cristiano G. Carvalho 发布以回答问题: calling fancybox gallery with other link 由其他用户创建。

<div class="details_gallery">
 <a href="#" class="manualfancybox">Manual Call Fancybox</a>
 <div class="details_gallery_min">
  <a rel="details" href="max/1.jpg" class="fancybox"><img src="min/1.jpg" alt="" /></a>
  <a rel="details" href="max/2.jpg" class="fancybox"><img src="min/2.jpg" alt="" /></a>
  <a rel="details" href="max/3.jpg" class="fancybox"><img src="min/3.jpg" alt="" /></a>
  <a rel="details" href="max/4.jpg" class="fancybox"><img src="min/4.jpg" alt="" /></a>
 </div>
</div>

<script>

$(document).ready(function(){
    $(".manualfancybox").click(function() {
        var photos  = new Array();

        $(".details_gallery_min a").each(function(){

            href = $(this).attr("href"); 
            title = $(this).attr("title"); 
            photos.push({'href': href, 'title': title})         

        });

        jQuery.fancybox(photos , 
            {   'transitionIn' : 'elastic', 
                'easingIn' : 'easeOutBack', 
                'transitionOut' : 'elastic', 
                'easingOut' : 'easeInBack', 
                'opacity' : false, 
                'titleShow' : true, 
                'titlePosition' : 'over',
                'type'              : 'image',          
                'titleFromAlt' : true 
            }
        );
    });
});

</script>

它确实有效...如果您只有一个画廊(.details_gallery_min 在示例中)。

我试图改变

$(".details_gallery_min a").each(function(){

$(".galleryone a, .gallerytwo a").each(function(){

但它仅适用于“.galleryone a”,当我单击名为“gallerytwo”的链接时,它会打开“galleryone”。我的 HTML 代码是正确的。

我的问题是:

如果我有多个链接打开不同的画廊,并且我想对所有画廊使用相同的行为(过渡、缓动等)怎么办?

【问题讨论】:

    标签: jquery function fancybox fancybox-2


    【解决方案1】:

    好吧,虽然Cristiano G. Carvalho 的回答有效,但我认为这是过度的事情。 array() + .each() 方法在内存和性能方面会产生(n)个(有争议的)高成本,如果您的画廊中有多个图像,则成本会更高。

    如果简单的fancybox 代码和手动事件处理程序可以解决问题,我认为没有任何理由遍历每个元素并(再次)在数组中构建fancybox 库。但这完全是我个人的看法。

    例如,如果您有这样的 html:

    <h3>gallery one</h3>
    <div id="gallery_one">
        <a rel="galleryone" class="fancybox" href="http://fancyapps.com/fancybox/demo/1_b.jpg"><img src="http://fancyapps.com/fancybox/demo/1_s.jpg" alt=""/></a>
        <a rel="galleryone" class="fancybox" href="http://fancyapps.com/fancybox/demo/2_b.jpg"><img src="http://fancyapps.com/fancybox/demo/2_s.jpg" alt=""/></a>
    ... etc.
    </div>
    
    <h3>gallery two</h3>
    <div id="gallery_two">
        <a rel="gallerytwo" class="fancybox" href="http://fancyapps.com/fancybox/demo/3_b.jpg"><img src="http://fancyapps.com/fancybox/demo/3_s.jpg" alt=""/></a>
        <a rel="gallerytwo" class="fancybox" href="http://fancyapps.com/fancybox/demo/4_b.jpg"><img src="http://fancyapps.com/fancybox/demo/4_s.jpg" alt=""/></a>
    ...etc.
    </div>
    

    将我的own answer 重写为同一个问题,我会设置我需要的任何手动链接,例如:

    <a class="manualfancybox" data-gallery="gallery_one" href="#nogo">manual call to first gallery</a>
    <a class="manualfancybox" data-gallery="gallery_two" href="#nogo">manual call to second gallery</a>
    

    注意,我添加了一个 HTML5 data-gallery 属性,指示链接所针对的画廊(data-gallery 值与每个画廊的父容器的 ID 匹配)

    然后,为所有画廊添加 fancybox 代码

    $(".fancybox").fancybox({
        // API options here
    });
    

    并将事件处理程序绑定到手动fancybox调用,例如:

    $(".manualfancybox").on("click", function(){
        var gallery = "#" + $(this).data("gallery");
        $(gallery).find(".fancybox").eq(0).click();
        return false;
    });
    

    根据图库应从哪个图像开始设置.eq() 的值。

    JSFIDDLE

    注意.on() 需要 jQuery v1.7+

    【讨论】:

    • 我在问之前看到了你的答案,但无法实现它以满足我的需求。你的代码比我使用的更简单和流畅。我印象非常深刻,我希望它也可以帮助其他人。谢谢。
    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多