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

作者:阿踏 时间:2024-04-29 13:08:08 

定义一个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图片碎片轮播图切换效果的实现代码,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://www.jianshu.com/p/d7ad0ce9cc39

标签:vue,轮播图
0
投稿

猜你喜欢

  • 网页中英文混排行高不等问题

    2008-08-26 17:03:00
  • asp.net中上传图片文件实现防伪图片水印并写入数据库

    2024-01-17 01:36:49
  • Mysql中错误使用SQL语句Groupby被兼容的情况

    2024-01-16 03:55:10
  • CSS样式表中SPAN和DIV的区别

    2007-10-21 08:47:00
  • Vue.js实现文章评论和回复评论功能

    2024-05-29 22:20:31
  • JavaScript实现动态生成表格

    2024-04-10 10:54:05
  • 从数据行入手保护SQL Server数据安全

    2009-04-13 10:28:00
  • Python爬虫获取豆瓣电影并写入excel

    2022-04-24 06:41:12
  • Mysql数据库中的redo log 写入策略和binlog 写入策略

    2024-01-27 08:21:14
  • 7个流行的Python强化学习算法及代码实现详解

    2021-07-06 08:38:03
  • 在ASP.NET 2.0中操作数据之十六:概述插入、更新和删除数据

    2024-06-05 09:27:08
  • python3 kubernetes api的使用示例

    2021-11-11 00:56:18
  • python实现同时给多个变量赋值的方法

    2021-10-09 07:02:50
  • MySQL中truncate误操作后的数据恢复案例

    2024-01-12 20:45:56
  • SQL Server导入导出数据方法

    2007-08-17 09:50:00
  • MySQL语句中的主键和外键使用说明

    2024-01-28 12:49:33
  • Numpy 三维数组索引与切片的实现

    2021-08-17 22:19:35
  • Git如何恢复到之前版本

    2022-11-26 05:24:21
  • 对django中foreignkey的简单使用详解

    2021-09-04 21:04:20
  • Python Web后端开发中的增查改删处理

    2022-11-21 06:15:42
  • asp之家 网络编程 m.aspxhome.com