观察各个电商网址轮播图的效果,总结了一下主要突破点与难点

1.->封装函数的步骤与具体实现

2->this关键字的指向

3->jquery js函数熟练运用 如animate

4->各个图片的位置关系分析

5->正确的json格式

实现步骤

  封装jq函数四个步骤:

  1    ----->构造函数   var Carousel = function(poster){}  //poster 为传入的类  具体为一个ul

  2    ----->Carousel.prototype上写函数

  3    ----->Carousel.init new出每一个对象

  4    ----->window["Carousel"] = Carousel;  添加到window上

先是主要的html结构

  1. <!-- 正确的json对象 属性有双引号 -->
  2. <div class="J_Poster poster-main" data-setting='{
  3. "width":1000,
  4. "height":270,
  5. "posterHeight":270,
  6. "posterWidth":640,
  7. "scale":0.9,
  8. "speed":300,
  9. "verticalAlign":"middle", "autoPlay":true,
  10. "delay":2000
  11. }'>
  12. <div class="poster-btn poster-prev-btn"></div>
  13. <ul class="poster-list">
  14. <li class="poster-item"><a href="#"><img src="img01/1.jpg" width="100%"></a></li>
  15. <li class="poster-item"><a href="#"><img src="img01/2.jpg" width="100%"></a></li>
  16. <li class="poster-item"><a href="#"><img src="img01/3.jpg" width="100%"></a></li>
  17. <li class="poster-item"><a href="#"><img src="img01/4.jpg" width="100%"></a></li>
  18. <li class="poster-item"><a href="#"><img src="img01/5.jpg" width="100%"></a></li>
  19. <li class="poster-item"><a href="#"><img src="img01/2.jpg" width="100%"></a></li>
  20. <li class="poster-item"><a href="#"><img src="img01/3.jpg" width="100%"></a></li>
  21. <li class="poster-item"><a href="#"><img src="img01/4.jpg" width="100%"></a></li>
  22. <li class="poster-item"><a href="#"><img src="img01/5.jpg" width="100%"></a></li>
  23. </ul>
  24. <div class="poster-btn poster-next-btn"></div>
  25. </div>

  下面是具体实现

  1. Carousel.prototype = {
  2.  
  3. //获取人工配制参数方法
  4. getSetting:function(){},
  5.  
  6. //根据配制参数去控制高度,宽度。。
  7. setSettingValue:function(){},
  8.  
  9. //垂直方向位置设置
  10. setVerticalAlign:function(height){},
  11.  
  12. //设置剩余帧位置关系
  13. setPosterPos:function(){},
  14.  
  15. //旋转函数
  16. carouselRotate:function(arr){},
  17.  
  18. //自动播放函数
  19. autoPlayFn:function(){}
  20.  
  21. };

  1.构造函数 Carousel

  1. var Carousel = function(poster){
  2.  
  3. var self = this;
  4. //保存单个旋转木马对象
  5. this.poster = poster;
  6. this.posterItemMain = poster.find("ul.poster-list");// 保存poster中ul对象
  7. //保存上下切换按钮
  8. this.prevBtn = poster.find("div.poster-prev-btn");
  9. this.nextBtn = poster.find("div.poster-next-btn");
  10. this.posterItems = this.posterItemMain.find("li");//所有li的个数
  11. this.posterFirstItem = this.posterItems.first();//保存第一帧
  12. this.posterLastItem = this.posterItems.last();
  13. this.rotateFlag = true; //旋转结束的标志 若不设置 多次点击时会出现bug
  14.  
  15. //默认配置参数
  16. this.setting = {
  17. "width":900, //幻灯片宽度
  18. "height":270, //幻灯片高度
  19. "posterHeight":270, //幻灯片第一帧宽度
  20. "posterWidth":640, //幻灯片第一帧高度
  21. "scale":0.9, //幻灯片比例
  22. "speed":500, //切换速度
  23. "autoPlay":true, //是否自动播放
  24. "delay":2000, //自动播放的延迟时间
  25. "verticalAlign":"middle"//图片垂直方向上显示的位置
  26. };
  27. $.extend(this.setting,this.getSetting());
  28.  
  29. this.setSettingValue();
  30. this.setPosterPos();
  31. // 按钮事件
  32. this.prevBtn.click(function(){
  33. if(self.rotateFlag){
  34. self.rotateFlag = false;
  35. self.carouselRotate("left");
  36. }
  37.  
  38. });
  39. this.nextBtn.click(function(){
  40. if(self.rotateFlag){
  41. self.rotateFlag = false;
  42. self.carouselRotate("right");
  43. }
  44. });
  45. if(self.setting.autoPlay){
  46. this.poster.hover(function(){//hover 为jq函数
  47. window.clearInterval(self.timer);
  48. },function(){
  49. self.prevBtn.click();
  50. });
  51. self.autoPlayFn();
  52. }
  53.  
  54. };

  

  主要获取对象:  carousel对象本身,幻灯片区域,幻灯片的上下切换按钮,幻灯片的每一张图片,幻灯片的第一帧与最后一帧

  默认的配置参数: 如果有html中有多块切换区域时,要修改不同的切换样式,在html下修改date-setting属性即可,具体获取到人工配制参数的函数将在prototype下实现

  事件的执行:   1.上下按钮切换点击事件(执行旋转函数),  2.是否自动播放

Carousel.prototype上函数的实现

  1.获取来自htnl中data-setting的人工配制参数  

        getSetting     //主要注意json格式下的属性要用双引号才能读取

  1. getSetting:function(){
  2. var setting = this.poster.attr("data-setting");
  3. if(setting&&setting!=""){
  4. return $.parseJSON(setting);// 传出json对象
  5. }
  6. else{
  7. return {};
  8. }
  9. /*return setting;*/
  10. }

  2.根据配置参数去控制幻灯片区域,第一帧的位置关系,上下切换按钮的样式,主要设置宽高 z-index left值

        setSettingValue

  1. setSettingValue:function(){
  2. this.poster.css({
  3. width:this.setting.width,
  4. height:this.setting.height
  5. });
  6. this.posterItemMain.css({
  7. width:this.setting.width,
  8. height:this.setting.height
  9.  
  10. });
  11. var w = (this.setting.width-this.setting.posterWidth)/2 //按钮的宽度
  12. this.prevBtn.css({
  13. width:w,
  14. height:this.setting.height,
  15. zIndex:Math.ceil((this.posterItems.size()/2))//按钮的层级关系
  16. });
  17. this.nextBtn.css({
  18. width:w,
  19. height:this.setting.height,
  20. zIndex:Math.ceil((this.posterItems.size()/2))
  21. });
  22. this.posterFirstItem.css({
  23. left:w,
  24. zIndex:Math.floor((this.posterItems.size()/2))
  25. });
  26.  
  27. },

  

  3.剩余帧的位置关系,样式,主要通过获取第一帧的位置关系来确定其他帧的关系//通过slice函数将区域分为左右区域,然后左右区域每一帧分别修改z-index left top opacity width height

        setPosterPos{

                rightSlice.each(function(){})

                leftSlice.each(function(){})

               }

  1. setPosterPos:function(){
  2. var sliceItems = this.posterItems.slice(1);
  3. var sliceSize = sliceItems.size()/2
  4. var rightSlice = sliceItems.slice(0,sliceSize);
  5. //
  6. var leftSlice = sliceItems.slice(sliceSize);
  7.  
  8. var level = Math.floor((sliceItems.size()/2));
  9.  
  10. //每张幻灯片的间距
  11. var gap = ((this.setting.width-this.setting.posterWidth)/2)/level;
  12.  
  13. var self = this;
  14. //右边帧的宽度高度
  15. var rw = this.setting.posterWidth;
  16. var rh = this.setting.posterHeight;
  17.  
  18. var firstLeft = (this.setting.width-this.setting.posterWidth)/2;
  19. var fixoffsetLeft = firstLeft+rw;
  20.  
  21. //设置右边帧的宽度高度透明度
  22. rightSlice.each(function(i){
  23. //右边每一帧相应的宽度透明度的值
  24. level--;
  25. rw = self.setting.scale*rw;
  26. rh = self.setting.scale*rh;
  27. var j = i;
  28.  
  29. //右边帧的位置
  30.  
  31. $(this).css({
  32. width:rw,
  33. zIndex:level,
  34. height:rh,
  35. top:self.setVerticalAlign(rh),
  36. left:fixoffsetLeft+(++i)*gap-rw,
  37. opacity:1/++j
  38.  
  39. });
  40. });
  41.  
  42. var lw = rightSlice.last().width(),
  43. lh = rightSlice.last().height();
  44. var oloop = Math.floor((sliceItems.size()/2));
  45. leftSlice.each(function(i){
  46. //左边帧每一帧的宽度高度
  47.  
  48. $(this).css({
  49. width:lw,
  50. zIndex:i,
  51. height:lh,
  52. top:self.setVerticalAlign(lh),
  53. left:i*gap,
  54. opacity:1/oloop
  55.  
  56. });
  57. lw = lw/self.setting.scale;
  58. lh = lh/self.setting.scale;
  59. oloop--;
  60. });
  61.  
  62. },

  4.垂直方向位置设置,即幻灯片区域的将垂直居上 垂直居中 垂直居底显示

        setVerticalAlign(height)// height 为data-setting中传来的verticalAlign

  1. //垂直方向位置设置
  2. setVerticalAlign:function(height){
  3. var verticalType = this.setting.verticalAlign;
  4. var top = 0;
  5. if(verticalType === "middle"){
  6. top = (this.setting.height-height)/2;
  7. }else if(verticalType === "top"){
  8. top = 0;
  9. }else if(verticalType === "bottom"){
  10. top = this.setting.height-height;
  11. }else{
  12. top = (this.setting.height-height)/2;
  13. };
  14. return top;
  15. },

5.旋转函数的编写   注意是否获取到DOM结点用get(0)方法

  1. //旋转函数
  2. carouselRotate:function(arr){
  3.  
  4. var _this_ = this;
  5. var zIndexArr = [];
  6. if(arr==="left"){
  7. this.posterItems.each(function(){
  8. var self = $(this),
  9. prev = self.prev().get(0)?self.prev():_this_.posterLastItem,
  10. width = prev.width(),
  11. height = prev.height(),
  12. zIndex = prev.css("zIndex"),
  13. opacity = prev.css("opacity"),
  14. top = prev.css("top"),
  15. left = prev.css("left");
  16. zIndexArr.push(zIndex);
  17. self.animate({
  18. width:width,
  19. height:height,
  20. //zIndex:zIndex,
  21. opacity:opacity,
  22. top:top,
  23. left:left
  24. },_this_.setting.speed,function(){
  25. _this_.rotateFlag = true;
  26. });
  27. });
  28. this.posterItems.each(function(i){
  29. $(this).css("zIndex",zIndexArr[i]);
  30. });
  31. }else if(arr==="right"){
  32. this.posterItems.each(function(){
  33. var self = $(this),
  34. next = self.next().get(0)?self.next():_this_.posterFirstItem,
  35. width = next.width(),
  36. height = next.height(),
  37. zIndex = next.css("zIndex"),
  38. opacity = next.css("opacity"),
  39. top = next.css("top"),
  40. left = next.css("left");
  41. zIndexArr.push(zIndex);
  42.  
  43. self.animate({
  44. width:width,
  45. height:height,
  46. zIndex:zIndex,
  47. opacity:opacity,
  48. top:top,
  49. left:left
  50. },_this_.setting.speed,function(){
  51. _this_.rotateFlag = true;
  52. });
  53. });
  54. this.posterItems.each(function(i){
  55. $(this).css("zIndex",zIndexArr[i]);
  56. });//先切换页面 再过渡其他元素
  57.  
  58. }
  59. },

6.自动播放函数编写  

  1. //自动播放函数
  2. autoPlayFn:function(){
  3. var self = this;
  4. this.timer = window.setInterval(function(){
  5. self.prevBtn.click();
  6. },self.setting.delay);
  7. },

3.new幻灯片中每一帧的实例// this指向carousel对象本身 即要实现 new Carousel(posters);

  1. Carousel.init = function(posters){
  2. var _this_ = this;
  3. posters.each(function(){
  4. new _this_($(this));
  5. });
  6. }

4.添加到window中

  1. window["Carousel"] = Carousel;

通过jquery js 实现幻灯片切换轮播效果的更多相关文章

  1. JS实现焦点图轮播效果

    大家平时逛淘宝网的时候,在首页就能看到焦点图轮播的效果,就是这个样子的: PS:想起每每打开淘宝,总会被这个玩意先夺眼球,偶尔还去点进去溜溜,幸好我定力好,总能控制住自己的购买欲望,为自己不用剁手感到 ...

  2. JS实现小图放大轮播效果

    JS实现小图放大轮播页面效果入下(图片为优行商旅页面照片): 实现效果:图片自动轮播,鼠标移入停止,移出继续轮播点击下方小图可以实现切换 步骤一:建立HTML布局,具体如下: <body> ...

  3. 使用jQuery做简单的图片轮播效果

      一.本特效主要用到的前端知识点 CSS中绝对定位(absolute)CSS实现垂直居中jQuery中简单的淡入淡出动画效果(fadeIn,fadeOut)定时器(setInterval,clear ...

  4. js插件-图片椭圆轮播效果

    插件效果图: html 代码如下: <div id="container"> <img src="images/cartoon/1.jpg" ...

  5. js实现简单的轮播效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 针对淡入淡出的定时轮播效果js

    如果不使用jquery的fadeIn和fadeOut的接口和不适用animate情况下,如果要做用js实现淡入淡出轮播效果,我所想到的办法就是使用css3新特性transition(注意好兼容性). ...

  7. JS、JQ实现焦点图轮播效果

    JS实现焦点图轮播效果 效果图: 代码如下,复制即可使用: (不过里面的图片路径需要自己改成自己的图片路径,否则是没有图片显示的哦) <!DOCTYPE html> <html> ...

  8. Jquery实现左右轮播效果

    首先展示下静态布局h5代码,代码非常简单. <div id="slide"> <ul class="pic-list"> <li& ...

  9. Bootstrap插件之Carousel轮播效果(2015年-05月-21日)

    <!DOCTYPE html><html><head lang="en"><meta charset="UTF-8"& ...

随机推荐

  1. JQuery UI dialog 弹窗实例及参数说明

    按钮代码: <a id="suprise" style="margin-left: 0.5em;cursor:pointer;">点我会有惊喜< ...

  2. C 标准库系列之errno.h

    errno.h 提供了一个整数全局变量errno,当系统调用或者库函数的错误事件发生时可能会修改该值,指明错误的原因,该值可在任何需要的地方被修改:一般情况不为0的值表示出现了异常或者错误. errn ...

  3. JsonHelper MergeJsonTemplate

    namespace Test { using Newtonsoft.Json; using System; using System.Collections.Generic; using System ...

  4. CozyRSS开发记录8-解析一份RSS

    CozyRSS开发记录8-解析一份RSS 1.使用Rss20FeedFormatter解析RSS 使用Rss20FeedFormatter配合XmlReader来解析RSS非常的简单,几行搞定: 来试 ...

  5. Centos 6.5 x64环境下 spark 1.6 maven 编译-- 已验证

    Centos 6.5 x64 jdk 1.7 scala 2.10 maven 3.3.3 cd spark-1.6 export MAVEN_OPTS="-Xmx2g -XX:MaxPer ...

  6. Rdeis 详解 小白

    Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-v ...

  7. 主机信息收集工具DMitry

    主机信息收集工具DMitry   DMitry是Kali Linux内置的一款信息收集工具.它的目标主要是Web类主机.它不仅通过主动查询.端口扫描方式,还借助第三方网站和搜索引擎获取信息. 它搜集的 ...

  8. iOS 时间的处理

    做App避免不了要和时间打交道,关于时间的处理,里面有不少门道,远不是一行API调用,获取当前系统时间这么简单.我们需要了解与时间相关的各种API之间的差别,再因场景而异去设计相应的机制. 时间的形式 ...

  9. [转]Windows7文件夹转移清理臃肿的C盘

    当你使用Windows的时候,你会发现无论哪个版本的Windows,系统都会默认将用户文件夹和程序数据文件夹(xp下是Documents and Settings文件夹,而windows7和vista ...

  10. 可变参数列表与printf()函数的实现

    问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...