完美实现js焦点轮播效果(二)(图片可滚动)


Posted in Javascript onMarch 07, 2017

本文在前一篇js焦点轮播效果的基础上,使用函数递归实现图片滑动切换,采用辅助图片实现图片无限滚动等技巧,具体内容如下

假如前后不加一张图片的话,图片顺序为[1,2,3,4,5],当你点到第 5 张图时,再点“下一张”(就是要回到第 1 张图那里),这时候,你想象下那个画面,会一瞬间“刷刷刷”地闪过中间那几张图片才能到第 1 张图那里,这样,太难看了吧。

为了解决这个问题,所以要在第 5 张那里加多一张 1 图,图片顺序为 [1,2,3,4,5,1]。当你在第 5 张图点下一张时,图片滚动顺序是这样的:5 ----> (1) ----> 1,(注:中间的那个 1 是指后面多加的 1 图),一旦到了那个“多加的 1 图”,轮播就会瞬间回到 前面的 1 图那里。

因为都是“1 图”,所以视觉上不会有那个一次“刷刷刷”闪过好几张图片的效果。

效果如图:

完美实现js焦点轮播效果(二)(图片可滚动)

实现代码:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
  <style type="text/css">
    *{
      margin: 0;
      padding: 0;
      list-style: none;
      text-decoration: none;
    }
    .wrap{
      width: 490px;
      height: 170px;
      margin: 100px auto;
      border: 1px solid #000000;
      position: relative;
      overflow: hidden;
    }
    #pic{
      width: 3430px;
      position: absolute;
    }
    #pic li{
      float: left;
      height: 170px;
    }
    #list{
      position: absolute;
      bottom: 10px;
      left:150px ;
    }
    #list li{
      float: left;
      width: 15px;
      height: 15px;
      background: #fff;
      margin: 0 10px;
      border-radius: 50%;
      cursor: pointer;
    }
    #list .on{
      background: #e27a00;
    }
    .Prev{
      top: 30px;
      left: 0;
    }
    .Next{
      top: 30px;
      right: 0;
    }
    .Prev,.Next{
      position: absolute;
      font-size: 80px;
      font-weight: bold;
      color:#fff ;
      -webkit-transition: all 0.35s ease-in-out
    }
    .Next:hover,
    .Prev:hover{
      background: #ccc;
      background: rgba(204, 204, 204, 0.4);
    }

  </style>
  <script type="text/javascript">
    window.onload=function(){
      var wrap=document.getElementById('wrap');
      var pic=document.getElementById('pic');
      var Li=document.getElementById('list').getElementsByTagName('li');
      var prev=document.getElementById('Prev');
      var next=document.getElementById('Next');
      var animated=false;
      var index=0;
      var timer=null;
      next.onclick=function(){
        if(animated){//如果图片正在滚动时要返回,否则index会变化
          return;
        }
        else{
          index++;
          if(index>=Li.length){
            index=0;
          }
        }

        showlist();
        if(animated == false){//if(!animated)
          animate(-490);
        }
      }
      prev.onclick=function(){
        if(animated){
          return;
        }
        else{
          index--;
          if(index<=0){
            index=Li.length-1;
          }
        }

        showlist();
        if(!animated){//判断其是否滚动完
          animate(490);
        }
      }
      for(var i=0;i<Li.length;i++){
        Li[i].num=i;
        Li[i].onclick=function(){
          if(this.className=="on"){
            return;
          }
          var offset = -490*(this.num-index);
          if(!animated){
            animate(offset);
          }
          index=this.num;
          showlist();
        }
      }
      //图片变换
      function animate(offset){
        animated=true;
        var newLeft=parseInt(pic.style.left) + offset;
        var time=300//位移总时间
        var interval=10;//位移间隔时间
        var speed=offset/(time/interval);//每次位移量

        function go(){
          if((speed < 0 && parseInt(pic.style.left) > newLeft )|| (speed > 0 && parseInt(pic.style.left) < newLeft)){
            pic.style.left = parseInt(pic.style.left) + speed + 'px';
            setTimeout(go,interval);
          }else{
            animated=false;
            pic.style.left= newLeft + 'px';
            if(newLeft > -490){
              pic.style.left = -2450 + 'px';
            }
            if(newLeft < -2450){
              pic.style.left = -490 + 'px';
            }
          }
        }
        go();
      }
      //圆点变换
      function showlist(){
        for(var i=0;i<Li.length;i++){
          Li[i].className="";
        }
        Li[index].className="on";
      }
      //自动播放
      function play(){
        timer=setInterval(function(){
          next.onclick();
        },2000);
      }
      function stop(){
        clearInterval(timer);
      }
      wrap.onmouseover=stop;
      wrap.onmouseout=play;
      play();
    }
  </script>
</head>
<body>
<div class="wrap" id="wrap">
  <ul id="pic" style="left: -490px;">
    <li><a href="#"><img src="/54111d7d00018ba604900170.jpg" alt="5"/></a></li>
    <li><a href="#"><img src="/54111cd9000174cd04900170.jpg" alt="1"/></a></li>
    <li><a href="#"><img src="/54111dac000118af04900170.jpg" alt="2"/></a></li>
    <li><a href="#"><img src="/54111d9c0001998204900170.jpg" alt="3"/></a></li>
    <li><a href="#"><img src="/54111d8a0001f41704900170.jpg" alt="4"/></a></li>
    <li><a href="#"><img src="/54111d7d00018ba604900170.jpg" alt="5"/></a></li>
    <li><a href="#"><img src="/54111cd9000174cd04900170.jpg" alt="1"/></a></li>
  </ul>
  <ul id="list">
    <li class="on"></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul>
  <a href="javascript:;" class="Prev" id="Prev"><</a>
  <a href="javascript:;" class="Next" id="Next">></a>
</div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js类中的公有变量和私有变量
Jul 24 Javascript
js利用div背景,做一个竖线的效果。
Nov 22 Javascript
jQuery实现切换字体大小的方法
Mar 10 Javascript
ajax读取数据后使用jqchart显示图表的方法
Jun 10 Javascript
提高Web性能的前端优化技巧总结
Feb 27 Javascript
Vue.js实现文章评论和回复评论功能
May 30 Javascript
基于JavaScript实现飘落星星特效
Aug 10 Javascript
在vue中添加Echarts图表的基本使用教程
Nov 22 Javascript
基于Vuejs的搜索匹配功能实现方法
Mar 03 Javascript
详解Vue 全局引入bass.scss 处理方案
Mar 26 Javascript
Vue使用Three.js加载glTF模型的方法详解
Jun 14 Javascript
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 Vue.js
完美实现js焦点轮播效果(一)
Mar 07 #Javascript
Vue2.0组件间数据传递示例
Mar 07 #Javascript
js实现网页定位导航功能
Mar 07 #Javascript
Vuejs 组件——props数据传递的实例代码
Mar 07 #Javascript
js实现百度登录框鼠标拖拽效果
Mar 07 #Javascript
Vue获取DOM元素样式和样式更改示例
Mar 07 #Javascript
原生JavaScript实现Tooltip浮动提示框特效
Mar 07 #Javascript
You might like
PHP个人网站架设连环讲(三)
2006/10/09 PHP
杏林同学录(二)
2006/10/09 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
JQuery jsonp 使用示例代码
2009/08/12 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
python避免死锁方法实例分析
2015/06/04 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
使用Python实现分别输出每个数组
2019/12/06 Python
python剪切视频与合并视频的实现
2020/03/03 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
LINUX下线程,GDI类的解释
2012/04/17 面试题
主题实践活动总结
2014/05/08 职场文书
报名委托书
2015/01/29 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
Golang二维数组的使用方式
2021/05/28 Golang
React实现动效弹窗组件
2021/06/21 Javascript
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python