zoukankan      html  css  js  c++  java
  • 仿优酷 图片 轮播

    最新更新公司企业站,二级页面的时候,有个图片 轮播效果,设计的和优酷的差不多,只是个数不一样,就在优酷的js上面进行了修改

    主要是

      1.支持了自定义显示广告个数,交互逻辑进行相应的动态计算

      2.修改了飞入飞出的逻辑,使得逻辑更加清晰

      3.js进行了jq插件的封装,方便调用

      4.相应的动画最终状态也要进行自己定义(程序计算没办法满足各种各样的需求),由于图片2边显示是对称关系,提示状态只要配置一半,另一半可以通过计算获得,暂时没有做相关支持

          以显示3个为例, 0为最中间的显示状态,

                  1,-1为0 两边的显示状态

                  2,-2为飞出的显示状态

    废话不多说,直接上代码

      插件jsYKSlider.js代码,默认配置为 优酷 配置信息

      查看效果,戳这里


    (function ($, undefined) {
        var noop = function () {};
        var slice = Array.prototype.slice;
        var defaults = {
            direct : "left",//滚动的方向
            offsetPages : 3,//默认可视最大条数
            initPageIndex : 0,//默认当前显示第几条
            delay : 5000,//滚动间隔(毫秒)
            speed : 500, //滚动速度毫秒,
            itemSize: {
                 640,
                height: 270
            },
            boxWidth : 970,//最外层宽,需要使用的时候在传,默认由程序自动判断
            boxHeight : 310,//最外层高  
            cssOpts: {
                '-2': {left: -530, top: 85, 530, height: 100},
                '-1': {left: 0, top: 23, 530, height: 224},
                '0':  {left: 165, top: 0, 640, height: 270},
                '1':  {left: 440, top: 23, 530, height: 224},
                '2':  {left: 970, top: 85, 530, height: 100}
            }
        };
        function JsYKSlider($elm, options) {
            this.$elm = $elm;
            this.options = options;
            this.init();
        }
        JsYKSlider.prototype = {
            init: function () {
                var self = this;
                this.reset();
                $(window).resize(function(){
                    self.reset();
                });
            },
            reset: function (options) {
                if (options) {
                    $.extend(this.options, options);    
                }
                options = this.options;
                this.total = options.data.length;
                this.pageNowIndex = options.initPageIndex;
                this.drawContent();
            },
            drawContent: function () {
                var $elm = this.$elm;
                var options = this.options;
                var data = options.data;
                var totle = data.length;
                
                $elm.empty().css({position: "relative"}).addClass('ykSlider-box');
                var html = ['<div class="ykSlider-bottomNav-box">'];
                for (var i = 0; i < totle; i++) {
                    html.push('<div class="ykSlider-bottomNav ' + ( i == this.pageNowIndex ? "sel":"") + '" ref="' + i + '" ></div>');
                }
                html.push('</div>');
                html.push('<div class="ykSlider-lr-box"><div class="ykSlider-leftNav" style="display: block;"></div><div class="ykSlider-rightNav" style="display: block;"></div></div>');
                html.push('<div style=" ' + options.boxWidth + 'px;height:' + options.boxHeight + 'px;margin: 0 auto;position: relative;">');
                for (var i = 0; i < totle ; i++ ) {
                    var obj = data[i];
                    html.push('<div class="ykSlider-item" ref="' + i + '" >
                                <a data-from="1-' + i + '" class="ykSlider-item-link" target="_blank" href="' + obj.url + '">
                                    <img title="' + obj.title + '" src="' + obj.img + '">
                                </a>
                                <span class="ykSlider-item-overlay" ></span></div>');
                }
                html.push('</div>');
                $elm.html(html.join(''));
                var $elmTab = this.$elmTab = [];
                $elm.find(".ykSlider-item").each(function () {
                    $elmTab.push($(this));
                })
                this.initContent();
                this.bind();
                this.start();
            },
            initContent: function () {
                var $elmTab = this.$elmTab;
                var options = this.options;
                var pageNowIndex = this.pageNowIndex;
                var offsetPages = options.offsetPages;
                var totle = options.data.length;
                
                var range = offsetPages/2>>0;
                var maxIndex = range + 2;
                for (var i = -range; i <= range; i++) {
                    var pIndex = (i + pageNowIndex + totle) % totle;
                    var absI = Math.abs(i);
                    var $pElm = $elmTab[pIndex];
                    if (absI == 0) {
                        $pElm.find('.ykSlider-item-overlay').hide();
                        $pElm.css($.extend({opacity: 1,zIndex: maxIndex}, options.cssOpts[0]));
                    } else {
                        $pElm.find('.ykSlider-item-overlay').css({opacity: (0.4 + (absI-1) * 0.1)});
                        $pElm.css($.extend({opacity: 1,zIndex: maxIndex-absI}, options.cssOpts[i]));    
                    }
                }
            },
            bind: function(){
                var self = this;
                var $elm = this.$elm;
                
                
                var $leftNav = $elm.find(".ykSlider-leftNav").click(function() {
                    self.turn("right");                    
                });
                var $rightNav = $elm.find(".ykSlider-rightNav").click(function() {
                    self.turn("left");                    
                });
                $elm.mouseover(function(){
                    self.stop();
                    $leftNav.show();
                    $rightNav.show();
                }).mouseout(function(){
                    self.start();
                    //$leftNav.hide();
                    //$rightNav.hide();
                });
                $elm.find(".ykSlider-bottomNav").click(function() {
                    var ref = this.getAttribute("ref")*1;
                    var pageNowIndex = self.pageNowIndex;
                    if (pageNowIndex == ref) return false;
                    if (pageNowIndex < ref){
                        var rightAbs = ref - pageNowIndex;
                        var leftAbs = pageNowIndex + self.total - ref;
                    }else{
                        var rightAbs = self.total - pageNowIndex + ref;
                        var leftAbs = pageNowIndex - ref;
                    }
                    if (leftAbs < rightAbs) {
                        self.turnpage(ref, "right");
                    } else {
                        self.turnpage(ref, "left");
                    }
                    return false;
                });
                $elm.find(".ykSlider-item").click(function(e)  {
                    var ref = this.getAttribute("ref")*1;
                    var pageNowIndex = self.pageNowIndex;
                    if (pageNowIndex == ref) {
                        return;
                    }
                    e.preventDefault();
                    if (pageNowIndex < ref) {
                        var rightAbs = ref - pageNowIndex;
                        var leftAbs = pageNowIndex + self.total - ref;
                    }else{
                        var rightAbs = self.total - pageNowIndex + ref;
                        var leftAbs = pageNowIndex - ref;
                    }
                    if (leftAbs < rightAbs) {
                        self.turnpage(ref, "right");
                    } else {
                        self.turnpage(ref, "left");
                    }
                });
            },
            initBottomNav: function(){
                this.$elm.find(".ykSlider-bottomNav").removeClass("sel")
                    .eq(this.pageNowIndex).addClass("sel");
            },
            start: function(){
                var self = this;
                if (self.timerId) {
                    self.stop();
                }
                self.timerId = setInterval(function() {
                    if (self.options.direct == "left") {
                        self.turn("left");    
                    } else {
                        self.turn("right");    
                    }
                }, self.options.delay);
            },
            stop: function () {
                clearInterval(this.timerId);
            },
            turn: function(dir){
                var self = this;        
                if (dir == "right") {
                    self.turnpage(self.pageNowIndex - 1, dir);
                } else {
                    self.turnpage(self.pageNowIndex + 1, dir);
                }
            },
            turnpage: function(pageIndex, dir){
                if (this.locked) return false;
                this.locked = true;
                
                var totle = this.options.data.length;
                pageIndex = (pageIndex + totle)%totle
                
                if (this.pageNowIndex == pageIndex) return false;
                this.run(pageIndex, dir, this.options.speed);
            },
            run: function(pageIndex, dir, t) {            
                var self = this;        
                var $elmTab = this.$elmTab;
                var options = this.options;
                var pageNowIndex = this.pageNowIndex;
                var offsetPages = options.offsetPages;
                var totle = options.data.length;
                var showNowMap = {}, showMap = {};
                
                var hideParams = { 0, height: 0, opacity: 0, left: options.boxWidth/2, top: options.boxHeight/2};
                var range = offsetPages/2>>0;
                var maxIndex = range + 2;
                for (var i = -range; i <= range; i++) {    
                    showNowMap[(i + pageNowIndex + totle) % totle] = 1;
                    showMap[(i + pageIndex + totle) % totle] = 1;
                }
                for (var i = -range; i <= range; i++) {
                    var pIndex = (i + pageNowIndex + totle) % totle;
                    var $pElm = $elmTab[pIndex];
                    var absI = Math.abs(i);
                    if (!showMap[pIndex]) {//不再显示的元素,中间的中间缩小,2边的飞出
                        if (absI < range) {
                            $pElm.css({zIndex: 0}).animate(hideParams);
                        } else if (i == -range){
                            $pElm.css({zIndex: 0}).animate($.extend({opacity: 0}, options.cssOpts[-1 - range]), t);
                        } else if (i == range){
                            $pElm.css({zIndex: 0}).animate($.extend({opacity: 0}, options.cssOpts[1 + range]), t);
                        }
                    }
                }
                for (var i = -range; i <= range; i++) {
                    var pIndex = (i + pageIndex + totle) % totle;
                    var $pElm = $elmTab[pIndex];
                    var absI = Math.abs(i);
                    if (absI == 0) {
                        $pElm.find('.ykSlider-item-overlay').hide();
                    } else {
                        $pElm.find('.ykSlider-item-overlay').css({opacity: (0.4 + (absI-1) * 0.1)}).show();
                    }
                    $pElm.css({zIndex:maxIndex-absI});//先修改zIndex
                    if (!showNowMap[pIndex]) {//当前未显示,中间位置,不是边缘则从中间隐藏展现, 边缘则从2侧飞入
                        //可以考虑状态tab同步更新,防止下次需要设置css + (hide,show) 方式
                        if (absI < range) {
                            $pElm.css(hideParams)
                        } else if (i == -range){
                            $pElm.css($.extend({opacity: 0}, options.cssOpts[-1-range]));
                        } else if (i == range){
                            $pElm.css($.extend({opacity: 0}, options.cssOpts[1+range]));
                        }
                    }
                    $pElm.animate($.extend({opacity: 1}, options.cssOpts[i]), t);
                }
                setTimeout(function () {
                    self.locked = false;
                }, t);
                this.pageNowIndex = pageIndex;
                this.initBottomNav();
            }
        }
        $.fn.jsYKSlider = function (options) {
            var args = slice.call(arguments, 1);
            var res;
            var flag = false;
            this.each(function () {
                var $elm = $(this);
                var obj = $elm.data('jsYKSlider');
                if (typeof options == "string" ) {
                    if (obj && obj[options]) {
                        var opt = obj[options];
                        if ($.isFunction(opt)) {
                            res = opt.apply(obj, args);
                            if (res !== undefined) {
                                flag = true;
                                return true;
                            }
                        } else {
                            if (args.length == 0) {
                                res = opt;
                                flag = true;
                                return true;
                            } else if (args.length == 1) {
                                obj[options] = args[0];
                            }
                        }
                    }
                } else {
                    $elm.data('jsYKSlider', new JsYKSlider($elm, $.extend({}, defaults, options)));
                }
            })
            if (flag) {
                return res;
            } else {
                return this;
            }
        }
    })(jQuery)

    下面是页面使用相关的 html,css

    <!DOCTYPE html>
    <script language="javascript" type="text/javascript" src="http://static.youku.com/v1.0.1051/js/jquery.js"></script>
    <style>
        .ykSlider-box {
             position: relative; 
             margin: 0 auto;
             overflow: hidden;
        }
        .ykSlider-lr-box {}
        .ykSlider-item {
            cursor:pointer;
            position:absolute;
            width:640px;
            height:270px;
            opacity: 0;
            zIndex: 0
        }
        .ykSlider-item-link {
            display:block;
            overflow:hidden;
            width:100%;
            height:100%;
        }
        .ykSlider-item img {
            width:100%;
            height:100%;
        }
        .ykSlider-item-overlay {
            z-index:1;
            position:absolute;
            top:0;
            left:0;
            background:#000;
            width:100%;
            height:100%;
            opacity:0;
            filter:opacity=0;
        }
        .ykSlider-leftNav,.ykSlider-rightNav {
            cursor:pointer;
            z-index:10;
            position:absolute;
            top:50%;
            width:45px;
            height:45px;
            margin-top:-43px;
        }
        .ykSlider-leftNav {
            left: 7px;
            background: url("slide_prev_btn.png") no-repeat;
            _background: none;
            _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="slide_prev_btn.png");
        }
        .ykSlider-rightNav{
            right:7px;
            background:url("slide_next_btn.png") no-repeat;
            _background:none;
            _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="slide_next_btn.png");
        }
        .ykSlider-bottomNav-box{
            height: 10px;
            position: absolute;
            text-align: center;
            width: 100%;
            z-index: 140;
            bottom: 20px; 
        }
        .ykSlider-bottomNav{
            cursor:pointer;
            overflow:hidden;
            display:inline-block;
            *display:inline;
            *zoom:1;
            width:10px;
            height:10px;
            margin:0 5px;
            vertical-align:top;
            -webkit-border-radius:5px;
            -moz-border-radius:5px;
            border-radius:5px;
            background:#c3c3c3;
        }
        .ykSlider-bottomNav:hover{
            background:#aaa;
        }
        .ykSlider-bottomNav.sel, ykSlider-bottomNav.sel:hover{
            background:#69aaec;
        }
    </style>
    <script language="javascript" type="text/javascript" src="jsYKSlider.js"></script>
    <div id="posterTvGrid86804" style="height: 272px; background-color: #f5f5f5;"></div>
    <script type="text/javascript">
        $('#posterTvGrid86804').jsYKSlider({
            data: [{"img":"http://r2.ykimg.com/0510000055463EF567BC3D37FB006CE4","title":"u864eu5988u732bu7238","url":"http://v.youku.com/v_show/id_XOTQ3OTkwMTg4.html"},{"img":"http://r4.ykimg.com/05100000553E61B767BC3D1B4806A29F","title":"u7279u8b66u529bu91cf","url":"http://v.youku.com/v_show/id_XOTQ4MjcxNjQ4.html"},{"img":"http://r4.ykimg.com/0510000055404BEB67BC3D651B01FC09","title":"u4e8eu65e0u58f0u5904","url":"http://v.youku.com/v_show/id_XOTQ0Njg2NzMy.html"},{"img":"http://r1.ykimg.com/0510000055346BB467BC3D61850626F4","title":"u7231u7684u79d8u7b08","url":"http://v.youku.com/v_show/id_XOTQ1MDUyMjky.html"},{"img":"http://r2.ykimg.com/05100000552744516737B31999017E28","title":"u9177u7238u4fcfu5988","url":"http://v.youku.com/v_show/id_XOTQ3MjE3Njky.html"},{"img":"http://r1.ykimg.com/051000005530AC9867BC3D63060502E0","title":"u5929u4f7fu7684u57ce","url":"http://v.youku.com/v_show/id_XOTIxMjExMTA4.html"},{"img":"http://r3.ykimg.com/051000005518B40D6737B30E12044057","title":"u59bbu5b50u7684u8c0eu8a00","url":"http://v.youku.com/v_show/id_XOTIyNjA2Njky.html"},{"img":"http://r1.ykimg.com/05100000551E09986737B355C8049A88","title":"u738bu5927u82b1u7684u9769u547du751fu6daf","url":"http://v.youku.com/v_show/id_XOTI1NTAyOTQ4.html"},{"img":"http://r4.ykimg.com/05100000553AF6C667BC3D411C04BBD7","title":"u5929u624dJ","url":"http://v.youku.com/v_show/id_XOTQ1NDU5ODk2.html"},{"img":"http://r4.ykimg.com/051000005416BED66737B32526092749","title":"u5973u56fdu52a1u537f","url":"http://v.youku.com/v_show/id_XOTQ3NzAxNzY4.html"}]
        })
        /*项目中使用的配置
        $('#posterTvGrid86804').jsYKSlider({
            itemSize: {
                 650, 
                height: 400
            },
            offsetPages: 5,
            cssOpts: {
                '-3': {left: -450,  top: 150,  450, height: 100},
                '-2': {left: 0,     top: 62,   450, height: 276},
                '-1': {left: 194,   top: 34,   541, height: 332},
                '0':  {left: 450,   top: 0,    650, height: 400},
                '1':  {left: 815,   top: 34,   541, height: 333},
                '2':  {left: 1100,  top: 62,   450, height: 276},
                '3':  {left: 1550,  top: 150,  450, height: 100}
            },
            boxWidth : 1532,
            boxHeight : 400,
            data: [{"img":"http://r2.ykimg.com/0510000055463EF567BC3D37FB006CE4","title":"u864eu5988u732bu7238","url":"http://v.youku.com/v_show/id_XOTQ3OTkwMTg4.html"},{"img":"http://r4.ykimg.com/05100000553E61B767BC3D1B4806A29F","title":"u7279u8b66u529bu91cf","url":"http://v.youku.com/v_show/id_XOTQ4MjcxNjQ4.html"},{"img":"http://r4.ykimg.com/0510000055404BEB67BC3D651B01FC09","title":"u4e8eu65e0u58f0u5904","url":"http://v.youku.com/v_show/id_XOTQ0Njg2NzMy.html"},{"img":"http://r1.ykimg.com/0510000055346BB467BC3D61850626F4","title":"u7231u7684u79d8u7b08","url":"http://v.youku.com/v_show/id_XOTQ1MDUyMjky.html"},{"img":"http://r2.ykimg.com/05100000552744516737B31999017E28","title":"u9177u7238u4fcfu5988","url":"http://v.youku.com/v_show/id_XOTQ3MjE3Njky.html"},{"img":"http://r1.ykimg.com/051000005530AC9867BC3D63060502E0","title":"u5929u4f7fu7684u57ce","url":"http://v.youku.com/v_show/id_XOTIxMjExMTA4.html"},{"img":"http://r3.ykimg.com/051000005518B40D6737B30E12044057","title":"u59bbu5b50u7684u8c0eu8a00","url":"http://v.youku.com/v_show/id_XOTIyNjA2Njky.html"},{"img":"http://r1.ykimg.com/05100000551E09986737B355C8049A88","title":"u738bu5927u82b1u7684u9769u547du751fu6daf","url":"http://v.youku.com/v_show/id_XOTI1NTAyOTQ4.html"},{"img":"http://r4.ykimg.com/05100000553AF6C667BC3D411C04BBD7","title":"u5929u624dJ","url":"http://v.youku.com/v_show/id_XOTQ1NDU5ODk2.html"},{"img":"http://r4.ykimg.com/051000005416BED66737B32526092749","title":"u5973u56fdu52a1u537f","url":"http://v.youku.com/v_show/id_XOTQ3NzAxNzY4.html"}]
        })*/
    </script>
  • 相关阅读:
    JedisConnectionException: java.net.ConnectException: Connection refused
    启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法
    JAVA 判断一个字符串是不是一个合法的日期格式
    升级openssl
    Linux操作路由
    Linux的用户行为审计
    升级gdb
    Linux的运行级别
    sudo的用法
    Linux缓存清理
  • 原文地址:https://www.cnblogs.com/legu/p/4512906.html
Copyright © 2011-2022 走看看