This commit is contained in:
2025-02-20 14:59:35 +08:00
rodzic d7be84fac6
commit d4a3bb8ffc
2541 zmienionych plików z 336536 dodań i 0 usunięć
+413
Wyświetl plik
@@ -0,0 +1,413 @@
/*
* 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。
*
* 指定登记&发行网站: https://www.zhiqim.com/ 欢迎加盟知启蒙,[编程有你,知启蒙一路随行]。
*
* 本文采用《知启蒙登记发行许可证》,除非符合许可证,否则不可使用该文件!
* 1、您可以免费使用、修改、合并、出版发行和分发,再授权软件、软件副本及衍生软件;
* 2、您用于商业用途时,必须在原作者指定的登记网站,按原作者要求进行登记;
* 3、您在使用、修改、合并、出版发行和分发时,必须包含版权声明、许可声明,及保留原作者的著作权、商标和专利等知识产权;
* 4、您在互联网、移动互联网等大众网络下发行和分发再授权软件、软件副本及衍生软件时,必须在原作者指定的发行网站进行发行和分发;
* 5、您可以在以下链接获取一个完整的许可证副本。
*
* 许可证链接:http://zhiqim.org/licenses/zhiqim_register_publish_license.htm
*
* 除非法律需要或书面同意,软件由原始码方式提供,无任何明示或暗示的保证和条件。详见完整许可证的权限和限制。
*/
+(function(Z)
{
/****************************************/
//“轮播图”
/****************************************/
// 1、配置举例:
// <ul id="zoomSlider">
// <li><img src="https://www.zhiqim.com/document/inc/www/tutorial/guest.jpg"></li>
// <li><img src="https://www.zhiqim.com/document/inc/www/tutorial/guest.jpg"></li>
// <li><img src="https://www.zhiqim.com/document/inc/www/tutorial/guest.jpg"></li>
// <li><img src="https://www.zhiqim.com/document/inc/www/tutorial/guest.jpg"></li>
// </ul>
//
// <script>
// var newZslider = new Z.Zslider();
// newZslider.elem = Z("#zoomSlider"); // 列表对象
// newZslider.width = -1; // 容器宽度,默认为 -1,动态计算
// newZslider.hasBtn = true; // 左右按钮是否显示,默认为 true
// newZslider.slideStyle = "slide"; // 播放类型:slide(滑动)fade(渐显),默认为 slide
// newZslider.tabStyle = "disc"; // tab 菜单类型:disc(实心圆点)circle(空心圆)square(实心方块),默认为 disc
// newZslider.tabEvent = "click"; // tab 菜单触发方式:click(点击)hover(悬浮),默认为 click
// newZslider.execute();
// </script>
Z.Zslider = Z.Class.newInstance();
Z.Zslider.prototype =
{
//start of Z.Zslider.prototype
defaults:
{//定义
elem: null, // 列表对象
width: 0, // 容器宽度
height: 300, // 容器高度
hasBtn: true, // 左右按钮是否显示,默认为 true
doResize: false, // 是否自适应缩放
slideStyle: "slide", // 播放类型:slide(滑动)fade(渐显),默认为 slide
tabStyle: "disc", // tab 菜单类型:disc(实心圆点)circle(空心圆)square(实心方块),默认为 disc
tabEvent: "click", // tab 菜单触发方式:click(点击)hover(悬浮)
playGapless: true, // 无缝轮播
playAuto: true, // 设定自动滚动
playSpeed: 4000, // 播放间隔
playDuration: 800, // 动画时长
},
init: function()
{//初始化
},
validate: function()
{//验证参数
this.$ul = Z.$elem(this.elem, "Z.Zslider");
if (!Z.AR.contains(["slide", "fade"], this.slideStyle))
return false;
if (!Z.AR.contains(["disc", "circle", "square"], this.tabStyle))
return false;
if (!Z.AR.contains(["click", "hover"], this.tabEvent))
return false;
return true;
},
execute: function()
{//执行
//1:检验、设置参数
if (!this.validate())
return;
this.height = this.getRectSize(this.height, this.$ul.offsetHeight());
if (this.width)
{
this.doResize = false;
this.width = this.getRectSize(this.width, this.$ul.offsetWidth());
} else {
this.width = Math.round(this.$ul.offsetWidth());
}
if (this.playSpeed < this.playDuration){
this.playSpeed = this.playDuration;
}
if (!this.width || !this.height)
return Z.alert("[Z.Zslider]参数[width][height]设置有误!");
//2:重新组装排版
var wrapHtml = '<div class="z-slider z-relative" style="width:'+this.width+'px;height:'+this.height+'px;">';
wrapHtml += '<div class="z-sliderList z-absolute z-w100p z-h100p z-overflow-hidden"></div>';
wrapHtml += '<div class="z-sliderTab z-sliderTab-'+this.tabStyle+' z-w100p z-h0 z-absolute z-l0 z-b0 z-text-center"></div>';
wrapHtml += '</div>';
this.$wrap = Z(wrapHtml).insertAfter(this.$ul);
this.$list = this.$wrap.find(".z-sliderList").append(this.$ul);
this.$$items = this.$ul.find("li");
this.$tab = this.$wrap.find(".z-sliderTab");
this.length = this.$$items.length;
//3:左右操作按钮
if (this.hasBtn){
var btnHtml = '<div class="z-sliderBtn z-w100p z-h0 z-absolute z-l0 z-text-center">';
btnHtml += '<div class="z-sliderBtn-prev z-absolute z-l0 z-t0 z-w60 z-h100 z-pointer">';
btnHtml += '<i class="z-font z-text-gray z-arrowhead-left z-absolute z-l0 z-r0 z-mg-lr-auto"></i>';
btnHtml += '</div>';
btnHtml += '<div class="z-sliderBtn-next z-absolute z-r0 z-t0 z-w60 z-h100 z-pointer">';
btnHtml += '<i class="z-font z-text-gray z-arrowhead-right z-absolute z-l0 z-r0 z-mg-lr-auto"></i>';
btnHtml += '</div>';
btnHtml += '</div>';
this.$btn = Z(btnHtml).appendTo(this.$wrap);
this.$btn.find(".z-sliderBtn-prev").on("click", this.sliderPrev, this);
this.$btn.find(".z-sliderBtn-next").on("click", this.sliderNext, this);
}
//4:底部导航 tab 按钮
var tabsHtml = "";
var i = 0;
for (i;i < this.length;i++){
tabsHtml += '<div></div>';
}
this.$tab[0].insertAdjacentHTML("beforeend",tabsHtml);
this.$$tabs = this.$tab.find("div");
Z(this.$$tabs[0]).addClass("z-active");
//5list 样式
if (this.slideStyle === "slide")
{//滑动处理
this.$ul.css("width", this.length * this.width).css("transition-duration",this.playDuration+"ms");
var $item;
for (i = 0;i < this.length;i++)
{
$item = this.$$items[i];
Z($item).css({
"width": this.width,
"transform": "translate3d(" + i * this.width + "px,0,0)"
});
if (i === 0){
this.$firstClone = Z($item.cloneNode("deep")).css("transform","translate3d(" + this.length * this.width + "px,0,0)");
}
if (i === this.length - 1){
this.$lastClone = Z($item.cloneNode("deep")).css("transform","translate3d(-" + this.width + "px,0,0)");
}
}
//插入克隆体
this.$firstClone.appendTo(this.$ul);
this.$lastClone.appendTo(this.$ul);
//滑动结束,判断是否可滑动
this.$ul.on(this.transitionFixed(), this.slideEnd, this);
}
else if (this.slideStyle === "fade")
{//渐显处理
this.$$items.css("top","0").css("transition-property","opacity,top");
Z(this.$$items[0]).css("opacity",1).siblings("li").css("opacity",0).addClass("z-hide");
//渐隐结束,隐藏该元素
this.$$items.on(this.transitionFixed(), this.fadeEnd, this);
}
this.$$items.css("transition-duration",this.playDuration+"ms");
Z(this.$$items[0]).addClass("z-active");
//6:绑定事件
var tabEvent = (this.tabEvent === "click")?"click":"mouseenter";
this.$$tabs.on(tabEvent, this.tabTrigger, this);
this.$wrap.on("mouseenter", this.wrapEnter, this);
this.$wrap.on("mouseleave", this.wrapLeave, this);
if (this.doResize)
Z(window).on('resize', this.resize, this);
//7:开始执行动画
this.autoPlay();
},
autoPlay: function()
{//自动播放
if(this.playAuto && !this.playAutoTimer)
this.playAutoTimer = setInterval(this.sliderNext, this.playSpeed, null, this);
},
wrapEnter: function()
{
if(this.$btn){
this.$btn.addClass("z-active");
}
//清除自动
clearInterval(this.playAutoTimer);
this.playAutoTimer = null;
},
wrapLeave: function()
{
if(this.$btn){
this.$btn.removeClass("z-active");
}
this.autoPlay();
},
sliderNext: function(event, thisObj)
{//后一个展示
thisObj = thisObj || this;
thisObj.sliderPlay(1);
},
sliderStay: function ()
{//保持展示
this.sliderPlay(0);
},
sliderPrev: function()
{//前一个展示
this.sliderPlay(-1);
},
sliderPlay: function(step)
{//播放方法
if (this.sliding){
return;
}
this[this.slideStyle+"ToPlay"](step);
},
slideToPlay: function(step)
{//滑动方法
this.sliding = true;
step = +step;
var $activeItem = this.$ul.find(".z-active");
var activeIndex = Z.AR.indexOf(this.$$items, $activeItem[0]);
$activeItem.removeClass("z-active");
//即将展示对象的索引值
var shouldIndex = activeIndex + step;
if (shouldIndex >= this.length) shouldIndex = 0;
if (shouldIndex <= -1) shouldIndex = this.length - 1;
//定义定位
var $shouldActive = Z(this.$$items[shouldIndex]);
var ulTrans = -shouldIndex * this.width;
//逐步滚动 |step| = 1 到边缘时,实现无缝滚动
if (this.playGapless)
{
if (step === 1 && shouldIndex === 0) {
$shouldActive = this.$firstClone;
ulTrans = -this.length * this.width;
}
if (step === -1 && shouldIndex === this.length - 1) {
$shouldActive = this.$lastClone;
ulTrans = this.width;
}
}
// 新定位
this.$ul.css("transform", "translate3d("+ulTrans+"px,0,0)");
if (this.$ul.css("transition-property") === "none"){
this.$ul.css("transition-property", "transform");
}
$shouldActive.addClass("z-active");
//tab 展示
Z(this.$$tabs[shouldIndex]).addClass("z-active").siblings("div").removeClass("z-active");
},
fadeToPlay: function(step)
{//渐显方法
step = +step;
var $activeItem = this.$ul.find(".z-active");
var activeIndex = Z.AR.indexOf(this.$$items, $activeItem[0]);
$activeItem.removeClass("z-active").css("opacity",0).css("top",-10);
var shouldIndex = activeIndex + step;
if (shouldIndex >= this.length) shouldIndex = 0;
if (shouldIndex <= -1) shouldIndex = this.length - 1;
var $shouldActive = Z(this.$$items[shouldIndex]);
$shouldActive.removeClass("z-hide").addClass("z-active").css("opacity",1);
//tab 展示
Z(this.$$tabs[shouldIndex]).addClass("z-active").siblings("div").removeClass("z-active");
},
fadeEnd: function(ev)
{
var $thisItem = Z(Z.E.current(ev));
if (!$thisItem.hasClass("z-active")){
$thisItem.addClass("z-hide").css("top",0);
}
},
slideEnd: function(ev)
{
//判断是否处于 list 边缘
var $activeItem = this.$ul.find(".z-active");
var activeIndex = Z.AR.indexOf(this.$$items, $activeItem[0]);
if (activeIndex > -1){
return this.sliding = false;
}
$activeItem.removeClass("z-active");
//无缝播放
if (this.playGapless)
{
this.$ul.css("transition-property","none");
if ($activeItem[0] === this.$firstClone[0]){
this.$ul.css("transform","translate3d(0,0,0)");
Z(this.$$items[0]).addClass("z-active");
}
if ($activeItem[0] === this.$lastClone[0]){
this.$ul.css("transform","translate3d(-"+(this.length - 1) * this.width+"px,0,0)");
Z(this.$$items[this.length - 1]).addClass("z-active");
}
}
this.sliding = false;
},
tabTrigger: function(ev)
{//tab 触发
var $activeTab = this.$tab.find(".z-active");
var activeIndex = Z.AR.indexOf(this.$$tabs, $activeTab[0]);
var $shouldTab = Z(Z.E.current(ev));
var shouldIndex = Z.AR.indexOf(this.$$tabs, $shouldTab[0]);
var step = shouldIndex - activeIndex;
this.sliderPlay(step);
},
resize: function()
{
// 停止自动播放
this.sliding = true;
if (this.playAutoTimer)
{
clearInterval(this.playAutoTimer);
this.playAutoTimer = null;
}
// 设置延迟,自动播放
if (!this.resizeStep)
this.resizeStep = 0;
this.resizeStep++;
if (this.delayAutoPlay)
clearTimeout(this.delayAutoPlay);
this.delayAutoPlay = setTimeout(this.delayResize, this.playDuration, this, this.resizeStep);
// 重置大小
this.$wrap.css('width', 'auto');
this.width = this.$wrap.offsetWidth();
this.$wrap.css({
"width": this.width,
});
this.$ul.css("width", this.length * this.width);
this.$ul.find('li').css('width', this.width);
for (var i = 0;i < this.length;i++) {
Z(this.$$items[i]).css({"transform": "translate3d(" + i * this.width + "px,0,0)"});
}
this.$firstClone.css({"transform": "translate3d(" + this.length * this.width + "px,0,0)"});
this.$lastClone.css({"transform":"translate3d(-" + this.width + "px,0,0)"});
// 定位当前
var $activeItem = this.$ul.find(".z-active");
var activeIndex = Z.AR.indexOf(this.$$items, $activeItem[0]);
var ulTrans = -activeIndex * this.width;
this.$ul.css("transform", "translate3d("+ ulTrans +"px,0,0)");
},
delayResize: function(thisObj, resizeStep)
{
clearTimeout(thisObj.delayAutoPlay);
if (resizeStep !== thisObj.resizeStep)
return;
thisObj.resizeStep = null;
thisObj.autoPlay();
},
transitionFixed: function()
{//兼容写法
var $div = document.createElement('div');
if ($div.style["transition"] !== undefined ){
$div = null;
return "transitionend";
}
if ($div.style["OTransition"] !== undefined ){
$div = null;
return "oTransitionEnd";
}
if ($div.style["WebkitTransition"] !== undefined ){
$div = null;
return "webkitTransitionEnd";
}
},
getRectSize: function(val, all)
{
if (/^\d+(\.\d+)?%$/.test(val))
{
val = parseFloat(val) / 100 * all;
}
else
{
val = parseFloat(val) || all;
if (val < 0)
val = all;
}
return Math.round(val);
},
//end of Z.Zslider.prototype
}
//END
})(zhiqim);