https://www.imooc.com/learn/374
如何实现jQuery插件框架
1、闭包的作用
$是形参,实参是jQuery对象
2、开发方式有两种:
3、链式调用,jQuery最大的优势就是链式调用
4、单例模式
采用动态的开发方式,就需要创建实例,可以使用单例模式
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<link rel="stylesheet" type="text/css" href="style.css">
<script src="jquery-3.2.1.min.js"></script>
<script src="pageSwitch.js"></script>
<title>Document</title>
</head>
<body>
<div id="container" data-PageSwitch>
<div class="sections">
<div id="section0" class="section active">
<div class="intro">
<h1 class="title">switchPage</h1>
<p>Create Beautiful Fullscreen Scrolling Websites</p>
</div>
</div>
<div id="section1" class="section">
<div class="intro">
<h1 class="title">Example</h1>
<p>HTML markup example to define 4 sections</p>
<img src="images/example.png"/>
</div>
</div>
<div id="section2" class="section">
<div class="intro">
<h1 class="title">Example</h1>
<p>The plug-in configuration parameters</p>
<img src="images/example2.png"/>
</div>
</div>
<div id="section3" class="section">
<div class="intro">
<h1 class="title">THE END</h1>
<p>Everything will be okay in the end. If it's not okay, it's not the end.</p>
</div>
</div>
</div>
</div>
<script>
//应用
$("#container").PageSwitch({
index:6,
easing:"linear",
duration:800,
loop:true,
direction:"herizontal"
});
</script>
</body>
</html>
*{ padding:0; margin:0;}
html,body{ height:100%; overflow:hidden; font-family:Arial,"Microsoft YaHei",sans-serif;}
#container,.sections,.section{ height:100%; position:relative;}
#section0,#section1,#section2,#section3{ background-color:#000; background-size:cover; background-position:50% 50%; }
#section0{ background-image:url(images/1.jpg); color:#FFF; text-shadow:1px 1px 1px #333;}
#section1{ background-image:url(images/2.jpg); color:#FFF; text-shadow:1px 1px 1px #333;}
#section2{ background-image:url(images/3.jpg); color:#FFF; text-shadow:1px 1px 1px #666;}
#section3{ background-image:url(images/4.jpg); color:#008283; text-shadow:1px 1px 1px #fff;}
#section0 p{ color:#F1FF00;}
#section3 p{ color:#00A3AF;}
.left{ float:left; }
h1{ font-size:6em; font-weight:normal;}
p{ font-size:2em; margin:0.5em 0 2em 0;}
.intro{ position:absolute; top:50%; width:100%; -webkit-transform:translateY(-50%); transform:translateY(-50%); text-align:center;}
.pages{ position:fixed; list-style:none;}
.vertical.pages{ right:10px; top:50%;}
.horizontal.pages{ bottom:10px; left:50%;}
.pages li{ width:8px; height:8px; border-radius:50%; background:#FFF; margin:10px 5px; cursor:pointer;}
.horizontal.pages li{ display:inline-block; vertical-align:middle;}
.pages li.active{ width: 14px; height: 14px; border: 2px solid #FFFE00; background: none; margin-left: 0; }
#section0 .title{
-webkit-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-animation: sectitle0 1s ease-in-out 100ms forwards;
animation: sectitle0 1s ease-in-out 100ms forwards;
}
#section0 p{
-webkit-transform: translateX(100%);
transform: translateX(100%);
-webkit-animation: sec0 1s ease-in-out 100ms forwards;
animation: sec0 1s ease-in-out 100ms forwards;
}
@-webkit-keyframes sectitle0{
0%{
-webkit-transform: translateX(-100%);
transform: translateX(-100%);
}
100%{
-webkit-transform: translateX(0);
transform: translateX(0);
}
}
@keyframes sectitle0{
0%{
-webkit-transform: translateX(-100%);
transform: translateX(-100%);
}
100%{
-webkit-transform: translateX(0);
transform: translateX(0);
}
}
@-webkit-keyframes sec0{
0%{
-webkit-transform: translateX(100%);
transform: translateX(100%);
}
100%{
-webkit-transform: translateX(0);
transform: translateX(0);
}
}
@keyframes sec0{
0%{
-webkit-transform: translateX(100%);
transform: translateX(100%);
}
100%{
-webkit-transform: translateX(0);
transform: translateX(0);
}
}
(function($){
//获取浏览器的前缀
var _prefix=function(temp){
var aPrefix=["webkit","Moz","o","ms"];
var props="";
for(var i in aPrefix){
props=aPrefix[i]+"Transition";
if(temp.style[props]!==undefined){
return "-"+aPrefix[i].toLowerCase()+"-";
}
}
return false;
}(document.createElement(PageSwitch))
var PageSwitch=(function(){
function PageSwitch(element,options){
this.settings=$.extend(true,$.fn.PageSwitch.defaults,options||{});
this.element=element;
this.init();
}
PageSwitch.prototype={
//说明:初始化插件
//实现:初始化dom结构。布局分页及绑定事件
init:function(){
var me=this;
me.selectors=me.settings.selectors;
me.sections=me.element.find(me.selectors.sections);
me.section=me.sections.find(me.selectors.section);
me.direction=me.settings.direction=="vertical"?true:false;
me.pagesCount=me.pagesCount();
me.index=(me.settings.index>=0 && me.settings.index<me.pagesCount)?me.settings.index:0;
me.canScroll=true;
if(!me.direction || me.index){
me._initLayout();
}
if(me.settings.pagination){
me._initPaging();
}
me._initEvent();
},
//说明:获取滑动页面数量
pagesCount:function(){
return this.section.length;
},
//说明:获取活动的宽度(横屏滑动)或高度(竖屏滑动)
switchLength:function(){
return this.direction?this.element.height():this.element.width();
},
//上一页
prev:function(){
var me=this;
if(me.index>0){
me.index--;
}else if(me.settings.loop){
me.index=me.pagesCount-1;
}
me._scrollPage();
},
//下一页
next:function(){
var me=this;
if(me.index<me.pagesCount){
me.index++;
}else if(me.settings.loop){
me.index=0;
}
me._scrollPage();
},
//说明:针对横屏情况进行页面布局
_initLayout:function(){
var me = this;
if(!me.direction){
var width = (me.pagesCount * 100) + "%",
cellWidth = (100 / me.pagesCount).toFixed(2) + "%";
me.sections.width(width);
me.section.width(cellWidth).css("float", "left");
}
if(me.index){
me._scrollPage(true);
}
},
//实现分页的dom结构及css样式
_initPaging:function(){
var me=this;
var pagesClass=me.selectors.page.substring(1);
me.activeClass=me.selectors.active.substring(1);
var pageHtml="<ul class="+pagesClass+">";
for(var i=0;i<me.pagesCount;i++){
pageHtml+="<li></li>";
}
pageHtml+="</ul>";
me.element.append(pageHtml);
var pages=me.element.find(me.selectors.page);
me.pageItem=pages.find("li");
console.log(me.pageItem);
me.pageItem.eq(me.index).addClass(me.activeClass);
if(me.direction){
pages.addClass("vertical");
}else{
pages.addClass("horizontal");
}
},
//初始化插件时间
_initEvent:function(){
var me=this;
me.element.on("click",me.selectors.page+" li",function(){
me.index=$(this).index();
me._scrollPage();
});
me.element.on("mousewheel DOMMouseScroll",function(e){
e.preventDefault();
if(me.canScroll){
var delta=e.originalEvent.wheelDelta || -e.originalEvent.detail;//火狐滑动与其他浏览器正负相反
if(delta>0 && (me.index && !me.settings.loop || me.settings.loop)){ //鼠标向上滑动
me.prev(); //上一页
}else if(delta<0 && (me.index<(me.pagesCount-1) && !me.settings.loop || me.settings.loop)){//向下滑动
me.next(); //下一页
}
}
});
if (me.settings.keyBoard){
$(window).on("keydown",function(e){
var keyCode=e.keyCode;
if(keyCode==37 || keyCode==38){
me.prev();
}else if(keyCode==39 || keyCode==40){
me.next();
}
});
}
$(window).resize(function(){
var currentLength=me.switchLength();
var offset=me.settings.direction ? me.section.eq(me.index).offset().top : me.section.eq(me.index).offset().left;
if (Math.abs(offset)>currentLength/2 && me.index<(me.pagesCount-1)){
me.index++;
}
if (me.index){
me._scrollPage();
}
});
//动画结束
me.sections.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend",function(){
me.canScroll=true;
if(me.settings.callback && $.type(me.settings.callback)=="function"){
me.settings.callback();
}
})
},
//滑动动画
_scrollPage:function(init){
var me=this;
var dest=me.section.eq(me.index).position();
if(!dest) return;
me.canScroll=false;
if(_prefix){
me.sections.css(_prefix+"transition","all "+me.settings.duration+"ms "+me.settings.easing);
var translate=me.direction ? "translateY(-"+dest.top+"px)" : "translateX(-"+dest.left+"px)";
me.sections.css(_prefix+"transform",translate);
}else{
var animateCss=me.direction ? {top:-dest.top} : {left:-dest.left};
me.sections.animate(animateCss,me.settings.duration,function(){
me.canScroll=true;
if(me.settings.callback && $.type(me.settings.callback)=="function"){
me.settings.callback();
}
});
}
if(me.settings.pagination){
me.pageItem.eq(me.index).addClass(me.activeClass).siblings("li").removeClass(me.activeClass);
}
}
};
return PageSwitch;
})();
$.fn.PageSwitch=function(options){
return this.each(function(){
var me=$(this);
var instance=me.data("PageSwitch");
if(!instance){
instance=new PageSwitch(me,options);
me.data("PageSwitch",instance);
}
if($.type(options)==="string") return instance[options]();
});
}
$.fn.PageSwitch.defaults={
selectors:{
sections:".sections",
section:".section",
page:".pages",
active:".active",
},
index:0, //页面开始的索引
easing:"ease", //动画效果
duration:500, //动画执行时间
loop:false, //false图片不循环,true图片循环
pagination:true, //是否进行分页
keyBoard:true, //是否支持键盘事件,true支持
direction:"vertical", //horizontal
callback:"" //回调函数
}
$(function(){
$("[data-PageSwitch]").PageSwitch();
})
})(jQuery);