移动web中的幻灯片切换效果

百度或者谷歌下类似的插件有很多,原理都差不多,关键适合自己的项目,如果移动端要引入jquery这么大的插件,只能呵呵了....

下面是工作中针对webkit内核的浏览器写的,html很简单:

<section id="banner" class="banner z-c" >
            <ul class="z-c-w">         <li class="z-c-i"></li>       </ul>
</section>

上面的li标签实际都可以动态生成的,这里只是为了方便阅读才加上。

css:

.banner {
        position:relative;
        overflow:hidden;
        border-bottom:1px solid #FFFDFB;
        font-size:0;
    }
    .z-c-w {
        display:-webkit-box;
        width:100%;
        height:100%;
    }
    .z-c-w.transitionable {
        -webkit-transition:-webkit-transform 0.25s ease;
    }
    .z-c-i {
        display:block;
        width:100%;
    }
    .z-c-p {
        position: absolute;
        margin-top: -13px;
        width: 100%;
        text-align: center;
    }
    .z-c-p span {
        display:inline-block;
        width:6px;
        height:6px;
        margin:0 4px;
        border-radius:50%;
        border:1px solid #7cca26;
    }
    .z-c-p span.active {
        background-color:#7cca26;
    }
    .z-c-i .img-wrapper{
        display: inline-block;
        width:100%;
        height:100%;
        background: #fafafa url(‘../images/cart_icon.png‘) no-repeat center center;
    }
    .z-c-i a{display: block;}
    .z-c-i .img-wrapper img{width:100%;}

javascript:需要引入zepto,zepto压缩后不到10k,是移动端开发不错的js库。

/*
 * carousel
 */
;(function($) {
    $.extend($.fn, {
        carousel : function(obj) {
            this.each(function(){
                // 当前Zepto对象
                var $self = $(this);

                var dom = {
                    wrap : $self.find(".z-c-w"),
                    items : $self.find(".z-c-i"),
                    pageControl : null,
                    pageItems : null
                };
                var settings = {
                    width : dom.wrap.width(),
                    count : dom.items.size(),
                    index : 0,
                    startX : 0,
                    startY : 0,
                    movingX : false,
                    movingY : false,
                    distance : 0,
                    pageControl : obj ? (obj.showControl ? true : false) : true,
                    autoScroll : obj ? (obj.autoScroll ? true : false) : false
                };
                var funs = {
                    init : function() {
                        funs.initUI();
                        funs.bindEvent();
                        if (settings.autoScroll) {
                            settings.interval = setInterval(funs.autoScroll, 5000);
                        }
                    },
                    bindEvent : function() {
                        dom.wrap.off().on({
                            "touchstart" : function(e) {
                                //e.stopPropagation();
                                settings.width = dom.wrap.width();
                                settings.distance = settings.width / 4;

                                settings.startX = e.touches[0].pageX;
                                settings.startY = e.touches[0].pageY;

                                if (settings.autoScroll){
                                    clearInterval(settings.interval);
                                    //隐藏最后一个循环页
                                    dom.dupItem.css("visibility", "hidden");
                                }
                            },
                            "touchmove" : function(e) {
                                //e.stopPropagation();
                                var currentX = e.touches[0].pageX;
                                var currentY = e.touches[0].pageY;
                                var dX = currentX - settings.startX;
                                var dY = currentY - settings.startY;

                                if (settings.movingX) {
                                    e.stopPropagation();
                                    e.preventDefault();
                                    var x = 0;
                                    if (settings.index == 0 && dX > 0 || settings.index == settings.count - 1 && dX < 0) {
                                        x = -settings.index * settings.width + dX / 3;
                                    } else {
                                        x = -settings.index * settings.width + dX;
                                    }
                                    dom.wrap.css("-webkit-transform", "translate3d(" + x + "px,0,0)");
                                } else if (!settings.movingY) {
                                    e.stopPropagation();
                                    var dX = Math.abs(dX);
                                    var dY = Math.abs(dY);
                                    if (dX > 10 && dX/dY > 1) {
                                        settings.movingX = true;
                                        settings.movingY = false;
                                    } else if(dY > 10 && dX/dY < 1) {
                                        settings.movingY = true;
                                        settings.movingX = false;
                                    }
                                }
                            },
                            "touchend" : function(e) {
                                //e.stopPropagation();
                                settings.movingY = false;
                                if (settings.movingX) {
                                    settings.movingX = false;
                                    var currentX = e.changedTouches[0].pageX;
                                    var distance = currentX - settings.startX;
                                    if (Math.abs(distance) >= settings.distance) {
                                        settings.index = settings.index - Math.abs(distance) / distance;
                                        settings.index = settings.index < 0 ? 0 : (settings.index > (settings.count - 1) ? (settings.count - 1) : settings.index);
                                    }
                                    funs.continueMove();
                                }
                                if (settings.autoScroll) {
                                    settings.interval = setInterval(funs.autoScroll, 5000);
                                    setTimeout(function(){
                                        dom.dupItem.css("visibility", "visible");
                                    },250);
                                }
                            },
                            "webkitTransitionEnd" : function() {
                                dom.wrap.removeClass("transitionable");
                                if(settings.index >= settings.count){
                                    settings.index %= settings.count;
                                    dom.wrap.css("-webkit-transform", "translate3d(" + -settings.index * settings.width + "px,0,0)");
                                }
                            }
                        });
                        dom.pageControl.off().on("touchstart", function(e) {
                            settings.width = dom.wrap.width();
                            settings.distance = settings.width / 4;

                            var touchX = e.touches[0].pageX;
                            var currentX = $(dom.pageItems[settings.index]).offset().left;
                            if (touchX > currentX && settings.index < (settings.count - 1)) {
                                settings.index += 1;
                                funs.continueMove();
                            } else if (touchX < currentX && settings.index > 0) {
                                settings.index -= 1;
                                funs.continueMove();
                            }
                        });
                        $(window).on({
                            "resize" : function() {
                                funs.adjustPOS();
                            },
                            "orientationchange" : function() {
                                funs.adjustPOS();
                            }
                        });
                    },
                    adjustPOS : function() {
                        settings.width = dom.wrap.width();
                        settings.distance = settings.width / 5;
                        dom.wrap.css("-webkit-transform", "translate3d(" + -settings.index * settings.width + "px,0,0)");
                    },
                    continueMove : function() {
                        dom.wrap.addClass("transitionable");
                        dom.pageItems.removeClass("active");
                        $(dom.pageItems[settings.index % settings.count]).addClass("active");
                        dom.wrap.css("-webkit-transform", "translate3d(" + -settings.index * settings.width + "px,0,0)");
                    },
                    initUI : function() {
                        settings.distance = settings.width / 4;
                        if (settings.pageControl) {
                            $self.append(funs.createPageDOM());
                        }
                        dom.pageControl = $self.find(".z-c-p");
                        dom.pageItems = $self.find(".z-c-p>span");

                        if(settings.autoScroll){
                            //重复第一个页面用作尾部的循环
                            funs.dupFirstItem();
                        }
                    },
                    dupFirstItem : function() {
                        dom.dupItem = $self.find(".z-c-i:first-child").clone();
                        $(dom.wrap).append(dom.dupItem);
                    },
                    createPageDOM : function() {
                        var pageControlToRemove = $self.find(".z-c-p");
                        if (pageControlToRemove.length) {
                            pageControlToRemove.remove();
                        }
                        var pageFragment = document.createDocumentFragment();
                        var pageDiv = document.createElement("div");
                        pageDiv.setAttribute("class", "z-c-p");
                        pageFragment.appendChild(pageDiv);
                        var pageItemSpan = document.createElement("span");
                        pageItemSpan.setAttribute("class", "active");
                        pageDiv.appendChild(pageItemSpan);
                        for (var i = 1; i < settings.count; i++) {
                            pageItemSpan = document.createElement("span");
                            pageDiv.appendChild(pageItemSpan);
                        }
                        return pageFragment;
                    },
                    clear : function() {
                        var pageControlToRemove = $self.find(".z-c-p");
                        if (pageControlToRemove.length) {
                            pageControlToRemove.remove();
                        }
                        dom.wrap.empty().css("-webkit-transform", "translate3d(0,0,0)");
                    },
                    autoScroll : function() {
                        if(dom.wrap.width() > 0 && dom.items.width() > 0){
                            settings.index++;
                            settings.width = dom.wrap.width();
                            funs.continueMove(settings.index);
                        }
                    }
                };

                funs.init();

                $self.clear = funs.clear;
            });

            return this;
        }
    });
})(Zepto);

调用方法:

$("#banner").carousel({
                showControl: true,
                autoScroll: true
});
时间: 2024-10-30 06:18:50

移动web中的幻灯片切换效果的相关文章

javascript实现的有缩略图功能的幻灯片切换效果

不久前写了一个简单的图片效果,没想到那么快就要用到项目中,所以功能方面要丰富一下: 主要改进: 1# 用圆点代替之前简单的页数显示,并且点击圆点可以显示对应图片: 2# 点击圆点,显示对应图片的缩略图. 今天完善了一下,当然动画效果,以及其他小细节还没来得及优化: 演示地址:http://codepen.io/anon/pen/rVMKdz 效果图如下: HTML部分: <!DOCTYPE html> <html lang="en"> <head>

WEB手机端 上下切换效果

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,target-densitydpi=high-dpi,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1

使用原生javascript实现网页中banner滚动切换效果

代码如下: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> *{ padding: 0px; margin: 0px; } #banner{ width: 100%; overflow: hidden; white-space: nowrap; }

Android 自定义 ViewPager 打造千变万化的图片切换效果

Android 自定义 ViewPager 打造千变万化的图片切换效果 标签: Android自定义ViewPagerJazzyViewPager 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPa

Axure RP Pro 7.0苏宁易购式标签切换效果教程

转:http://jingyan.baidu.com/article/7082dc1c4f0a11e40a89bdac.html 页面标签切换效果,几乎是所有大网站(尤其是电商类网站)标配的交互方式: 之所以应用如此普遍,关键在于网站首屏展示区,是寸土寸斤的黄金区域:标签切换可以让更多内容在同一块地方展示:相当于两块同样面积的地皮,一个盖平房,一个盖楼房,土地利用率自然不可同日而语: 本教程是仿造苏宁易购网站标签切换效果,为了就是切合实际,让你能将Axure技术与最前沿的应用场景结合起来,当你需

故事板和自定义切换效果

1.故事板并不完美,它由一些明显的不足之处.但是故事板是构建用户界面的趋势,以及如何使用故事板来完成用nib文件完成的事情(比如和控制器进行通信). 2.添加故事板:方式和添加新文件的方式相同.事实上,从Xcode 5开始,就已经默认打开了Use Storyboard选项,这使得从应用删除故事板变得更加困难了. 3.info.plist中的属性:使用故事板创建新工程时,应用的info.plist键中含有一个名为UIMainStoryboardFile的键.这个键取代了iOS5以前使用的NSMai

Android App中使用Gallery制作幻灯片播放效果

http://www.jb51.net/article/83313.htm 我们有时候在iPhone手机上或者Windows上面看到动态的图片,可以通过鼠标或者手指触摸来移动它,产生动态的图片滚动效果,还可以根据你的点击或者触摸触发其他事件响应.同样的,在Android中也提供这这种实现,这就是通过Gallery在UI上实现缩略图浏览器. 我们来看看Gallery是如何来实现的,先把控件从布局文件中声明,只需知道ID为gallery. ? 1 Gallery gallery = (Gallery

自动播放——幻灯片缓冲效果&amp;&amp;带Loading效果的图片切换&amp;&amp;移动效果(按轨迹移动)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

jQuery框架+DWR框架实现的Java Web中的Ajax效果(异步请求,局部刷新)

一 简介和实现效果 这里用一个小例子来简单举例说明,做一个搜索引擎搜索提示效果,通过不断输入字符,然后在下方给出搜索提示.效果图如下: 通过上图可以看到,当输入一个"a"时,提示了很多内容,然后继续输入一个"e"后,提示的范围明显就变小了. 注:在文末我会给出完整源代码的下载链接,以供大家参考 二 具体实现 1 在eclipse for java ee中创建一个Java Web工程,然后导入相应的jar包,特别说明的是:这里要导入一个额外的dwr.jar.也就是说,