vue自定义js图片碎片轮播图切换效果的实现代码


Posted in Javascript onApril 28, 2019

定义一个banner.js文件,代码如下

;window.requestAnimationFrame = window.requestAnimationFrame||function(a){return setTimeout(a,1000/60)};
window.cancelAnimationFrame = window.cancelAnimationFrame||clearTimeout;
var FragmentBanner = function(option) {
  //实例化时,可传的参数
  this.whiteList = ['container','controller','size','imgs','size','grid','index','fnTime','boxTime','type'];
  //容器将包容控制器
  this.container = '.banner';
  //默认的控制器
  this.controller = {
    view : '.banner-view',
    btn : '.banner-btn',
    num : '.banner-number',
    progre : '.banner-progres'
  };
  //栅格 行*列
  this.grid = {
    line : 5,
    list : 10
  };
  //容器的大小
  this.size = {
    width : 1200,
    height : 675,
  };
  //切换类型
  this.type = 1;
  //索引位置
  this.index = 0;
  //函数每次切换时间
  this.fnTime = 5000;
  //栅格每次运动时间
  this.boxTime = 2000;
  //栅格运动结束的时间
  this.activeTime = new Date();
  for(var a = 0,attrLenght = this.whiteList.length; a < attrLenght;a++){
    var attr = this.whiteList[a];
    if(option[attr] != undefined){
      this[attr] = option[attr];
    }
  }
  for(var i in option){
    if(this.whiteList[i] !== undefined){ ; }
  }
  init();
}
function setIndex(){
  this.index %= this.imgs.length;
  this.index = (this.index < 0) ? this.imgs.length - 1 : this.index;
  this.elem.numFind[this.index].className = 'on'; 
}
function init(){
  this.container = document.querySelector(this.container)
  if(!this.container){
    return alert('获取banner容器失败');
  }else{
    this.container.style.width = this.size.width+'px';
    this.container.style.height = this.size.height+'px';
  }
  this.elem = {};
  for(var e in this.controller){
    this.elem[e] = this.container.querySelector(this.controller[e]);
    if(this.elem[e] == null){
      return alert('获取'+e+'容器');
    }
  }
  //栅格
  var w = this.size.width / this.grid.list,
    h = this.size.height / this.grid.line;
  this.elem.viewBox = new Array();
  for(var i = 0,iL = this.grid.line;i < iL;i++){
    for(var j = 0,jL = this.grid.list;j < jL;j++){
      var newI = document.createElement('i');
      setCss(newI,{
        width : w+'px',
        height : h+'px',
        left : 0,
        top : 0,
        opacity : 1,
        backgroundImage : 'url("'+this.imgs[this.index]+'")',
        backgroundSize : this.size.width + 'px ' + this.size.height +'px',
        backgroundPosition : w * -j+'px ' + h * -i+'px'
      });
      this.elem.view.appendChild(newI);
      this.elem.viewBox.push(newI);
    }
  }
  //按钮动作
  for (var b = 1; b >= 0; b--) {
    var oB = document.createElement('span');
    (b) ? oB.innerHTML = '<' : oB.innerHTML = '>';
    oB.setIndex = b;
    oB.onclick = function(obj){
      show({
        switch : true,
        change : obj.setIndex == 0
      });
    }.bind(this,oB);
    this.elem.btn.appendChild(oB);
  }
  //数量
  for(var n = 0,nL = this.imgs.length; n < nL;n++){
    var oI = document.createElement('i');
    oI.setIndex = n;
    oI.onclick = function(obj){
      //显示动画
      show({
        switch : true,
        change : obj.setIndex
      });
    }.bind(this,oI)
    this.elem.num.appendChild(oI);
  }
  this.elem.numFind = this.elem.num.querySelectorAll('i');
  //进度条
  this.progre = new Array;
  for(var p = 1;p >= 0;p--){
    var oP = document.createElement('i');
    setCss(oP,{
      width : 0,
      backgroundColor : p ? '#00c3ff' : '#ffc300'
    });
    this.elem.progre.appendChild(oP);
    this.progre.push(oP);
  }
  //显示动画
  show();
  this.elem.numFind[this.index].className = 'on';
}
function setCss(obj,json){
  for( c in json){
    if(c == 'opacity'){
      obj.style.opacity = c;
      obj.style.filter = "alpha(opacity="+ (json[c]*100) +")";
    }else{
      obj.style[c] = json[c];
    }
  }
  return this;
}
function show(order){
  order = order || {};
  if(new Date() >= this.activeTime){
    this.elem.numFind[this.index].className = '';
    // 下次播放动画时候的进度条
    setCss(this.progre[1],{width : 0})
    anime(this.progre[1],{
        width : this.size.width
      },this.fnTime,function(){
        show({
          switch : true,
          change : true
        });
      }.bind(this));
    var status = true,
      activeTime = 0;
    for( var i = 0,iL = this.elem.viewBox.length;i < iL;i++ ){
      var startTime = getTypeTime(),
        endTime = getTypeTime(),
        obj = this.elem.viewBox[i];
        activeTime = Math.max(activeTime,startTime[1] + endTime[1]);
      anime(obj,{
        left : Math.ceil(Math.random() * this.size.width * 2 - this.size.width),
        top : Math.ceil(Math.random() * this.size.height * 2 - this.size.height),
        opacity: 0
      }, startTime[0] ,function(obj){
        if(order.switch && status){
          if(/number/i.test(typeof order.change)){
            this.index = order.change;
          }else{
            (order.change) ? ++this.index : --this.index;
          }
          setIndex();
          this.elem.numFind[this.index].className = 'on';
          status = false;
        }
        setCss(obj,{backgroundImage : 'url("'+this.imgs[this.index]+'")'})
        anime(obj,{
            left : 0,
            top : 0,
            opacity : 1
          },endTime[0]);
      }.bind(this,obj));
    }
    //栅格结束运动的时间
    this.activeTime = new Date(new Date().getTime() + activeTime);
    setCss(this.progre[0],{width : 0})
    anime(this.progre[0],{width : this.size.width},activeTime);
  }
}
function getTypeTime(){
  var timer = new Array();
  switch(this.type){
    case 1:
      timer.push(this.boxTime / 4 + Math.random() * this.boxTime / 4);
      timer.push(timer[0]);
    break;
    default:
      timer.push([Math.random() * this.boxTime / 5,this.boxTime / 10 * 3]);
      timer.push(timer[0][0] + timer[0][1]);
    break;
  }
  return timer;
}
function anime(obj,attr,endTime,callback) {
  (obj.timer) && cancelAnimationFrame(obj.timer);
  var cssJosn = obj.currentStyle || getComputedStyle(obj,null),
    start = {},end = {},goTime;
  //设置初始属性值和结束属性值
  for(var key in attr){
    if(attr[key] != parseFloat(cssJosn[key])){
      start[key] = parseFloat(cssJosn[key]);
      end[key] = attr[key] - start[key];
    }
  }
  goTime = new Date();
  if(endTime instanceof Array){
     (function delayFn(){
       if((new Date() - goTime) >= endTime[0]){
         endTime = endTime[1];
         goTime = new Date();
         ref();
       }else{
         obj.timer = requestAnimationFrame(delayFn);
       }
     })();
  }else{
    ref();
  }
  function ref(){
    var prop = (new Date() - goTime) / endTime;
    (prop >= 1) ? prop = 1 : obj.timer = requestAnimationFrame(ref);
    for(var key in start){
      var val = -end[key] * prop *(prop-2) + start[key];

      if(key == 'opacity'){

        obj.style.opacity = val;
        obj.style.filter = "alpha(opacity="+ (val*100) +")";
      }else{

        obj.style[key] = val+'px';
      }
    }

    (prop === 1) && callback && callback.call(obj);
  };
}
module.exports.FragmentBanner = FragmentBanner;

在需要的组件里面引入改js

import {FragmentBanner} from '../../../static/js/banner.js'

使用方式如下

// html代码
<header class="js_header mod-header">
   <div class="banner" id="banner1" style="margin: 50px auto;margin-bottom:0px">
      <div class="banner-view"></div>
      <div class="banner-btn"></div>
      <div class="banner-number"></div>
      <div class="banner-progres"></div>
   </div>
 </header>
//css样式
<style>
.banner{
  position: relative;
  overflow: hidden;
}
.banner-view{
  position: relative;
  height: 100%;
  z-index: 999;
  background-color: #090b22;
  background-repeat: no-repeat;
}
.banner-view i{
  position: relative;
  display: block;
  float: left;
  background-repeat: no-repeat;
}
.banner-btn{
  position: absolute;
  width: 100%;
  height: 0;
  top: 45%;
  font-family: "宋体";
  font-size: 20px;
  z-index: 999;
}
.banner-btn span{
  display: block;
  float: left;
  width: 50px;
  line-height: 50px;
  text-align: center;
  background-color: #27cfc3;
  color: white;
  cursor: pointer;
  font-weight: 800;
  /* position: absolute;
  right:-150px; */
  /* background-image: url(../../../static/images/style-index.d437fb5e.png);
 background-position: -268px -18px;
 width: 56px;
 height: 56px; */
}
/* 
.banner-btn span:first-child{
  left: -150px;
} */
.banner-btn span:hover{
  background-color: rgba(0,0,0,0.6);
}
.banner-btn span + span{
  float: right;
}
.banner-number{
  position: absolute;
  bottom: 35px;
  width: 100%;
  height: 0;
  font-size: 0;
  text-align: center;
  z-index: 1000;
}
.banner-number > *{
  display: inline-block;
  border: 2px solid #fff;
  border-radius: 50%;
  margin: 0 8px;
  width: 10px;
  height: 10px;
  background-color: #00c3ff;
  cursor: pointer;
}
.banner-number > *:hover,
.banner-number > *.on{
  background-color: #ffc300;
}
.banner-progres{
  width: 100%;
  position: absolute;
  bottom: 0;
  height: 3px;
  z-index: 1000;
}
.banner-progres i{
  position: absolute;
  left: 0;
  top: 0;
  border-radius: 3px;
  display: block;
  height: 100%;
  width: 0;
}
</style>
// js的引用
this.obj = {
      container : '#banner1',//选择容器 必选
      imgs : ['https://www.xuanfengge.com/wp-content/themes/lee3.0/dist/img/banner/1.0bd56759.jpg','https://www.xuanfengge.com/wp-content/themes/lee3.0/dist/img/banner/6.c6b4ec87.jpg'],//图片集合 必选
      size : {
        width : 1200,
        height : 300
      },//容器的大小 可选
      //行数与列数 可选
      grid : {
        line : 12,
        list : 14
      },
      index: 0,//图片集合的索引位置 可选
      type : 2,//切换类型 1 , 2 可选
      boxTime : 5000,//小方块来回运动的时长 可选
      fnTime : 10000//banner切换的时长 可选
   }
mounted () {
  FragmentBanner(this.obj );
 }

总结

以上所述是小编给大家介绍的vue自定义js图片碎片轮播图切换效果的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jQuery 源码分析笔记(2) 变量列表
May 28 Javascript
JS 退出系统并跳转到登录界面的实现代码
Jun 29 Javascript
JS中typeof与instanceof之间的区别总结
Nov 14 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
Jan 10 Javascript
jQuery实现带动画效果的二级下拉导航方法
Mar 11 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
利用Angularjs和Bootstrap前端开发案例实战
Aug 27 Javascript
jquery.validate.js 多个相同name的处理方式
Jul 10 jQuery
Angular整合zTree的示例代码
Jan 24 Javascript
vue实现的仿淘宝购物车功能详解
Jan 27 Javascript
ES6 Map结构的应用实例分析
Jun 26 Javascript
微信小程序常用的3种提示弹窗实现详解
Sep 19 Javascript
如何在微信小程序里面退出小程序的方法
Apr 28 #Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
Apr 28 #Javascript
详解小程序退出页面时清除定时器
Apr 28 #Javascript
详解在Javascript中进行面向切面编程
Apr 28 #Javascript
js比较两个单独的数组或对象是否相等的实例代码
Apr 28 #Javascript
详解在HTTPS 项目中使用百度地图 API
Apr 26 #Javascript
vue操作动画的记录animate.css实例代码
Apr 26 #Javascript
You might like
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
关于php开启错误提示的总结
2019/09/24 PHP
jQuery1.6 使用方法一
2011/11/23 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
采用python实现简单QQ单用户机器人的方法
2014/07/03 Python
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
详解python基础之while循环及if判断
2017/08/24 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
英语自荐信常用语句
2013/12/13 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
交通安全横幅标语
2014/10/07 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
公安忠诚教育心得体会
2016/01/23 职场文书
检讨书范文
2019/04/16 职场文书
python3实现常见的排序算法(示例代码)
2021/07/04 Python