研究了 10 个小时还没搞懂,求到底原理是什么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
jacob
V2EX    Javascript

研究了 10 个小时还没搞懂,求到底原理是什么

  •  
  •   jacob 2014-02-13 13:41:44 +08:00 6194 次点击
    这是一个创建于 4309 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码挺多,但是只麻烦看一行就好'zIndex', ((numberOfPhotos - i) + currentPhoto) % numberOfPhotos
    先说功能,6张重叠在一起的图片(a链接中),轮流显示每张图片。
    //---------------------
    <div id="photos">
    <a href="#"><img src="images/a.jpg" alt=""></a>
    <a href="#"><img src="images/b.jpg" alt=""></a>
    <a href="#"><img src="images/c.jpg" alt=""></a>
    <a href="#"><img src="images/d.jpg" alt=""></a>
    <a href="#"><img src="images/e.jpg" alt=""></a>
    <a href="#"><img src="images/f.jpg" alt=""></a>
    </div>
    //----------------------
    //---------------------
    #photos {
    width:200px;
    height: 200px;
    overflow: hidden;
    }

    #photos a {
    position: absolute;
    }
    //--------------------------
    $(document).ready(function() {
    rotatePics(1);
    });

    function rotatePics(currentPhoto) {
    var numberOfPhotos = $('#photos a').length;

    currentPhoto = currentPhoto % numberOfPhotos;
    $('#photos a').eq(currentPhoto).fadeOut(function() {
    // re-order the z-index
    $('#photos a').each(function(i) {

    $(this).css(

    'zIndex', ((numberOfPhotos - i) + currentPhoto) % numberOfPhotos
    );
    });

    $(this).show();
    setTimeout(function() {rotatePics(++currentPhoto);}, 1000);
    });
    }


    请问,z-index属性调整会影响 $(this).show();这行中的this对象吗,因为它是与$('#photos a').eq(currentPhoto).对应的,究竟是怎么做的呢?实在是想不下去了,大脑已经完全混乱了。
    14 条回复    1970-01-01 08:00:00 +08:00
    loading
        1
    loading  
       2014-02-13 13:47:29 +08:00 via iPhone
    在代码中添加些addClass,用浏览器的审查元素,一目了然。
    z-index你知道是css的吧!
    yayy
        2
    yayy  
       2014-02-13 13:47:34 +08:00   1
    你开个 devtool 自己debuge 一下呗,
    其实我是搬运 jsfiddle 来的:

    http://jsfiddle.net/Ut3W5/
    yayy
        3
    yayy  
       2014-02-13 13:48:13 +08:00
    不过这个样式写的,看的我真累啊。。
    mclxly
        4
    mclxly  
       2014-02-13 15:39:45 +08:00   1
    “$(this).show();这行中的this对象吗”,这个this是遍历a元素的object
    -----------------------------
    程序逻辑:
    -----------------------------
    1. 页面加载完成后,第一次调用rotatePics();
    $(document).ready(function() {
    rotatePics(1);
    });
    2. 根据传入参数currentPhoto,在selector'#photos a'选择的元素组中,隐藏(设置透明)对应位置的元素;
    $('#photos a').eq(currentPhoto).fadeOut()
    3. 重新设置所有元素的z-index,并显示,下一个元素将设置为最大z-index:5,因此获得显示;
    4. 一秒钟后执行步骤2,将下一个元素隐藏;
    FrankFang128
        5
    FrankFang128  
       2014-02-13 15:43:20 +08:00
    代码不放在 jsbin/jsfiddler 的,一律不看。
    jacob
        6
    jacob  
    OP
       2014-02-13 16:32:18 +08:00
    @mclxly 原来是遍历一遍,我原来就是没搞懂this怎么就指向下一张图片了,原来是全显示了,但是$(this).css(

    'zIndex', ((numberOfPhotos - i) + currentPhoto) % numberOfPhotos
    );

    这句算法的原理可否说一下,这个计算方式真的不明觉厉。如果自己解决累似问题,怎么能想到这样的公式?我觉得只能数学天才能做到啊
    jacob
        7
    jacob  
    OP
       2014-02-13 16:36:09 +08:00
    @yayy 我基本把能用的工具,书全用上了,折腾了好几个小时了,实在没辙了,我知道一大陀代码本身就是不受欢迎的。
    menic
        8
    menic  
       2014-02-13 17:05:35 +08:00   1
    我觉得
    因为current是1 base, i是0 base 目的是让与current对应的i的z-index最大
    i = current -1,i - current = -1
    所以应该是(n+(i-current))%n
    比如:
    n = 6 current = 3 其实i最大的应该是2 ( 6 + (2 - 3 ) ) % 6 = 5
    如果是(6 + (3 - 2)) % 6 = 1 显然不是最大的
    flynngao
        9
    flynngao  
       2014-02-13 17:07:22 +08:00
    吐槽不能了,不会用chrome么
    kmokidd
        10
    kmokidd  
       2014-02-13 18:04:14 +08:00   1
    这是个递归 lz说的((numberOfPhotos - i) + currentPhoto) % numberOfPhotos 应该算是递归的公式

    线上地址 http://jsfiddle.net/Ut3W5/3/ 我写了一些注释 不知道lz会不会明白

    简单来说 currentPhoto不是当前显示的图片而是当前显示图片的上一张图片 显示是用z-index来控制的 这一组图片的z-index是有一个规律:currentPhoto的z-index最小为0,当前显示图片的z-index最大为图片个数-1

    lz说公式怎么得到的…… 这个就是高中数列 找规律
    jacob
        11
    jacob  
    OP
       2014-02-14 00:31:55 +08:00
    @kmokidd 对我帮助太大了,非常感谢.还有一个问题,如何把你脑力copy给我点。。。
    kmokidd
        12
    kmokidd  
       2014-02-14 09:22:41 +08:00
    @jacob 多写点找规律的代码或者题目应该就能写好递归吧= =
    menic
        13
    menic  
       2014-02-14 12:00:59 +08:00   1
    @kmokidd
    @jacob
    lz说只看一行 扫了一眼看到rotatePic(1) 以为currentPic是1based 所以搞错了
    如果这是教科书里的 真心觉得可以扔了 如果current不是1based 为啥上来就rotatePic(1) 而不是rotatePic(0) 你去看效果 其实第一张出来的图不是第一张 而是第三张 如果想从第一张开始
    最开始改成
    rotatePic(0)
    然后公式改成
    (n + (i - current) - 1) % n (如果i==current 让mod最大)
    如果他本意就是从第三张开始 可以扔了
    jacob
        14
    jacob  
    OP
       2014-02-15 14:34:38 +08:00
    @menic

    确实是书里的,jquery-novice-to-ninja-new-kicks-and-tricks
    这书写的我觉得对我这样初学者很不好,该细致的地方不讲,不该细致的地方嗦一堆。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1071 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 23:22 PVG 07:22 LAX 15:22 JFK 18:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86