vue自定义js图片碎片轮播图切换效果的实现代码
作者:阿踏 发布时间:2024-04-29 13:08:08
标签:vue,轮播图
定义一个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


猜你喜欢
- matplotlib官方除了提供了鼠标十字光标的示例,还提供了同一图像内多子图共享光标的示例,其功能主要由widgets模块中的MultiC
- 1. 自己用python写了一个签到脚本经过测试已经可以成功打卡,于是研究了一下windows定时运行程序2. 创建定时任务2.1 打开“控
- 废话不多说了,直接给大家贴代码了,具体代码如下所述: var aLi = document.querySelectorAll('.a
- 本文和大家重点讨论一下Perl split函数的用法,Perl中的一个非常有用的函数是Perl split函数-把字符串进行分割并把分割后的
- 本文实例讲述了Python多层装饰器用法。分享给大家供大家参考,具体如下:前言Python 的装饰器能够在不破坏函数原本结构的基础上,对函数
- 如下所示:<div id="app"> <h1>我是直接写在构造器里的模板1</h1&g
- 大家好,本期给大家带来Python字典11个方法的全面解析,希望对你有所帮助。字典(Dictionary)是Python提供的一种常用的数据
- 学习了Go语言后,打算利用最近比较空一点,写一个前端部署工具,不需要每次都复制粘贴的麻烦,需要完成部署的第一步就需要连接远程服务器打开 ss
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 本文列些处几种去除在Python 列表中(list)可能存在的重复项,这在很多应用程序中都会遇到的需求,作为程序员最好了解其中的
- 这片文章只对本地存储方法做介绍,若要查看本地存储组件使用方法的介绍请稍等。本地数据持久化(或者也叫做浏览器本地存储)是一种在浏览器中长久保存
- 使用定时功能对于我们想要快速获取某个数据来说,是一个非常好的方法。这样我们就不用苦苦守在电脑屏幕前,只为蹲到某个想要的东西。在之前我们已经讲
- 在开发过程中经常碰到在本地环境无法完成联调测试的情况,必须到统一的联机环境对接其他系统测试。往往是出现了BUG难以查找数据记录及时定位到错误
- 在网站建设中,分类算法的应用非常的普遍。在设计一个电子商店时,要涉及到商品分类;在设计发布系统时,要涉及到栏目或者频道分类;在设计软件下载这
- 在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS
- 在python中有不少对于集合迭代的方法,我们把程序运行后的再一次循环叫做迭代,每一次都循环都可以看做是一次迭代。那么在迭代结束后,我们需要
- 前言9月份,开始开发微信小程序,也曾调研过wepy/mpvue,考虑到后期跨端的需求,最终选择使用了uni-app,本文主要介绍如何使用un
- 本文实例讲述了python执行shell获取硬件参数写入mysql的方法。分享给大家供大家参考。具体分析如下:最近要获取服务器各种参数,包括
- 先来看看js中的Null类型表示什么?null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象,一般一个未定义的变量在初次使用
- 本文代码需要正确安装Python扩展库pywin32,建议下载whl文件进行离线安装。然后调用win32api的ShellExecute()