diff --git a/1.1/base.js b/1.1/base.js
index 841def8..1d47e13 100644
--- a/1.1/base.js
+++ b/1.1/base.js
@@ -38,7 +38,6 @@ KISSY.add('gallery/slide/1.1/base',function(S){
// 构造函数
init:function(selector,config){
-
var self = this;
if(S.isObject(selector)){
@@ -278,7 +277,6 @@ KISSY.add('gallery/slide/1.1/base',function(S){
// 如果是动画效果,则构建Wrap
buildWrap: function(){
var self = this;
-
self.animwrap = S.Node.create('
');
self.animwrap.set('innerHTML', self.animcon.get('innerHTML'));
self.animcon.set('innerHTML', '');
@@ -361,7 +359,6 @@ KISSY.add('gallery/slide/1.1/base',function(S){
});
}
};
-
effectInitFn[self.effect]();
return this;
@@ -403,7 +400,12 @@ KISSY.add('gallery/slide/1.1/base',function(S){
self.hightlightNav(self.getWrappedIndex(self.currentTab));
//是否自动播放
if (self.autoSlide === true) {
- self.play();
+ // 如果设置了invisibleStop为true,还要多判断一下slide是否在可视区
+ // 未设置invisibleStop为true,则直接自动播放
+ if((self.invisibleStop && self.isSlideVisible())||
+ !self.invisibleStop){
+ self.play();
+ }
}
return this;
},
@@ -535,15 +537,21 @@ KISSY.add('gallery/slide/1.1/base',function(S){
self.adaptive_width():
self.animcon.get('region').width;
height = self.pannels.item(index).get('region').height;
+
+ // 修复resize时animwrap尺寸计算有误
+ self.animwrap.setStyles({
+ width:self.pannels.size() * width + 'px'
+ });
width /= self.colspan;
-
+
// pannels的高度是不定的,高度是根据内容
// 来撑开的因此不能设置高度,而宽度则需要设置
self.pannels.setStyles({
width:width+'px',
display:'block'
});
+
self.animcon.setStyles({
width:width * self.colspan +'px',
@@ -563,6 +571,12 @@ KISSY.add('gallery/slide/1.1/base',function(S){
height = self.adaptive_height ?
self.adaptive_height():
self.animcon.get('region').height;
+
+ // 修复resize时animwrap尺寸计算有误
+ self.animwrap.setStyles({
+ height:self.pannels.size() * height + 'px'
+ });
+
height /= self.colspan;
self.pannels.setStyles({
@@ -705,17 +719,19 @@ KISSY.add('gallery/slide/1.1/base',function(S){
if(self.hoverStop){
self.con._delegate('mouseover',function(e){
//e.halt();
+ self.isMouseover = true; // 增加对鼠标状态的标识
if(self.autoSlide)self.stop();
},'.'+self.contentClass+' .'+self.pannelClass);
self.con._delegate('mouseout',function(e){
//e.halt();
+ self.isMouseover = false;
if(self.autoSlide)self.play();
},'.'+self.contentClass+' .'+self.pannelClass);
}
// 绑定窗口resize事件
try {
- S.Event.on('resize',function(e){
+ S.Event.on(window,'resize',function(e){
self.fixSlideSize(self.currentTab);
self.relocateCurrentTab();
},window);
@@ -905,11 +921,75 @@ KISSY.add('gallery/slide/1.1/base',function(S){
}
}
+
+ // slide离开视野,是否暂停滚动
+ if(self.invisibleStop){
+ // 检测是否支持pagevisivility,脱离视野,暂停播放
+ var visProp = S.getHiddenProp();
+ if(visProp){
+ // 拼装visibilitychange事件名,并监听
+ var evtname = visProp.replace(/[H|h]idden/,'') + 'visibilitychange',autoPlayPageVisible;
+ S.Event.on(document,evtname,function(e){
+ // 如果页面离开视野,暂停播放
+ if(S.isHidden()){
+ if(self.timer){
+ autoPlayPageVisible = true;
+ self.stop();
+ //console.info('触发事件:'+e.type+' '+'播放状态:stop');
+ }else{
+ autoPlayPageVisible = false;
+ }
+ }else{
+ // 页面可见 && slide在视野内 && 停止播放前slide播放状态是‘正在播放’ 满足这三个条件继续播放
+ if(self.isSlideVisible()&&autoPlayPageVisible){
+ self.play();
+ //console.info('触发事件:'+e.type+' '+'播放状态:play');
+ }
+ }
+ });
+ }
+ // 监听onscoll,resize事件,通过坐标判断slide是否脱离可视区
+ S.Event.on(window,'scroll resize',function(e){
+ // 边界判断
+ if(self.isSlideVisible()){
+ // 防止与鼠标悬停slide停止播放的设置相冲突,if里要检测鼠标是否在slide上
+ // bug场景:鼠标悬浮在slide上,滚动页面,触发play,与hoverStop设置冲突
+ if(!self.timer&&
+ (!self.hoverStop||(self.hoverStop&&!self.isMouseover))){
+ self.play();
+ //console.info('触发事件:'+e.type+' '+'播放状态:play');
+ }
+ }else{
+ if(self.timer){
+ self.stop();
+ //console.info('触发事件:'+e.type+' '+'播放状态:stop');
+ }
+ }
+
+ });
+ }
return this;
-
},
-
+ // 判断slide是否在可视区内
+ isSlideVisible:function(){
+ var self = this,
+ slideLeft = self.animcon.offset().left,
+ slideTop = self.animcon.offset().top,
+ slideWidth = self.animcon.outerWidth(),
+ slideHeight = self.animcon.outerHeight(),
+ scrollTop = S.DOM.scrollTop(),
+ scrollLeft = S.DOM.scrollLeft();
+ if(scrollTop>slideTop+slideHeight||
+ scrollTop+S.DOM.height(window)slideLeft+slideWidth||
+ scrollLeft+S.DOM.width(window) self.pannels.size()){
index = self.pannels.size() - self.colspan;
}
animFn[self.effect](index);
-
self.currentTab = index;
self.hightlightNav(self.getWrappedIndex(index));
// TODO,讨论switch的发生时机
diff --git a/1.1/demo/d2.html b/1.1/demo/d2.html
index 17b2a5f..0f0ad2c 100644
--- a/1.1/demo/d2.html
+++ b/1.1/demo/d2.html
@@ -75,7 +75,7 @@
selectedClass:'current',
triggerSelector:'a',
effect:'fade',
- autoPlay:true
+ autoSlide:true
});
var ctl = S.one('#JSlide-ctrl');
diff --git a/1.1/demo/fullwidth.html b/1.1/demo/fullwidth.html
new file mode 100755
index 0000000..97d79a5
--- /dev/null
+++ b/1.1/demo/fullwidth.html
@@ -0,0 +1,97 @@
+
+
+
+
+
+Demo
+
+
+
+
+
+
+
+
+width 100% 自适应
+
+
+
+
+
+
diff --git a/1.1/demo/index.html b/1.1/demo/index.html
index 1495611..7bf2158 100644
--- a/1.1/demo/index.html
+++ b/1.1/demo/index.html
@@ -41,6 +41,8 @@ demo
杂项1 杂项
触屏功能Demo 触屏支持
Flipsnap Flipsnap用法
+ 脱离可视区停止播放demo slide脱离可视区,自动停止播放
+ fullwidth slide宽度自适应
diff --git a/1.1/demo/invisibleStop.html b/1.1/demo/invisibleStop.html
new file mode 100755
index 0000000..529e765
--- /dev/null
+++ b/1.1/demo/invisibleStop.html
@@ -0,0 +1,129 @@
+
+
+
+
+Demo
+
+
+
+
+
+
+
+
+
+往下拉,slide在下面
+
+
+
+
+
+

+
+
+

+
+
+

+
+
+

+
+
+

+
+
+

+

+
+
+

+
+
+
+
+
+
+
diff --git a/1.1/guide/index.md b/1.1/guide/index.md
index e9a599f..9e693b1 100644
--- a/1.1/guide/index.md
+++ b/1.1/guide/index.md
@@ -157,6 +157,10 @@ Slide构造器第二个参数用以传入配置项,这些配置项为基础参
鼠标悬停在面板上是否停止自动播放,默认为true
+*invisibleStop* (Boolean)
+
+slide面板脱离可视区是否停止自动播放,默认为false。支持由tab页失去焦点,resize,scroll事件导致的slide脱离视野
+
*selectedClass* (String)
导航选中时的className,默认为'selected'
diff --git a/1.1/index.js b/1.1/index.js
index 3b309bc..c2b47ef 100644
--- a/1.1/index.js
+++ b/1.1/index.js
@@ -16,7 +16,7 @@ KISSY.add('gallery/slide/1.1/index',function(S,BSlide){
* Demo: 配host,访问:http://a.tbcdn.cn/apps/ks/zoo/slide/demo/tab.html
*
* @param 参数列表
- * autoSlide : {boolean} 是否自动播放,默认为false
+ * autoSlide : {Boolean} 是否自动播放,默认为false
* speed: {float} 帧切换的速度,默认为500(ms)
* timeout: {Number} 帧切换的时间间隔,默认为1000(ms)
* effect: {String} 帧切换类型,默认为'none',取值: * none:无特效
@@ -29,7 +29,8 @@ KISSY.add('gallery/slide/1.1/index',function(S,BSlide){
* mouseenter:鼠标进入
* easing: {String} 帧切换的缓动值,默认为'easeBoth',取值请参照KISSY.Anim
* http://docs.kissyui.com/docs/html/api/core/anim/index.html
- * hoverStop: {boolean} 鼠标悬停在面板上是否停止自动播放,默认为true
+ * hoverStop: {Boolean} 鼠标悬停在面板上是否停止自动播放,默认为true
+ * invisibleStop:{Boolean} slide面板脱离可视区是否停止自动播放,默认为false。支持由tab页失去焦点,resize,scroll事件导致的slide脱离视野
* selectedClass:{String} tab选中时的className,默认为't-slide',目前未实现
* navClass: {String} tab容器的className,默认为'tab-nav'
* triggerSelector:{String}tab容器中的触碰元素的选择器,默认为'li'
@@ -38,13 +39,13 @@ KISSY.add('gallery/slide/1.1/index',function(S,BSlide){
* id: {String} hook,直接写id,比如"J_id"(正确),"#J_id"(错误)
* carousel: {Boolean} 是否以跑马灯形式播放,默认为false
* touchmove: {Boolean} 是否支持手指滑动切换,默认为false
- * adaptive_fixed_width:{boolean} 屏幕是否根据控件的宽度改变重新渲染尺寸,默认为false,主要在组件定宽高的场景中,保证resize时tab-pannel尺寸正确
- * adaptive_fixed_height:{boolean} 屏幕是否根据控件的高度改变重新渲染尺寸,默认为false,主要在组件定宽高的场景中,保证resize时tab-pannel尺寸正确
- * adaptive_fixed_size:{boolean} 屏幕是否根据控件的宽度和高度改变重新渲染尺寸,默认为false,主要在组件定宽高的场景中,保证resize时tab-pannel尺寸正确
+ * adaptive_fixed_width:{Boolean} 屏幕是否根据控件的宽度改变重新渲染尺寸,默认为false,主要在组件定宽高的场景中,保证resize时tab-pannel尺寸正确
+ * adaptive_fixed_height:{Boolean} 屏幕是否根据控件的高度改变重新渲染尺寸,默认为false,主要在组件定宽高的场景中,保证resize时tab-pannel尺寸正确
+ * adaptive_fixed_size:{Boolean} 屏幕是否根据控件的宽度和高度改变重新渲染尺寸,默认为false,主要在组件定宽高的场景中,保证resize时tab-pannel尺寸正确
* defaultTab: {Number} 默认定位在某个帧,默认为0,即第一帧
* layerSlide: {Boolean} 是否开启分层动画,默认为false
* layerClass: {String} subLayer的className,未实现,默认用alt="sublayer"来标识
- * reverse: {boolean} "播放下一个"和"播放上一个"对调,默认为false
+ * reverse: {Boolean} "播放下一个"和"播放上一个"对调,默认为false
* adaptive_height:{function},同下
* adaptive_width:{function},如果是百分比设置容器的宽度的话,需要指定这个函数,返回一个宽度值,动态的得到可变化的宽度,默认为false,代码示例:
*
diff --git a/1.1/slide-util.js b/1.1/slide-util.js
index 8374521..731346b 100644
--- a/1.1/slide-util.js
+++ b/1.1/slide-util.js
@@ -101,8 +101,26 @@ KISSY.add('gallery/slide/1.1/slide-util',function(S){
}else{
return false;
}
+ },
+ // 检测浏览器是否支持pagevisivility并读取document的hidden值,不同浏览器可能需要前缀,如webkitHidden
+ getHiddenProp:function(){
+ // 如果支持'hidden'就直接返回
+ if ('hidden' in document) return 'hidden';
+ // 否则检查前缀,看是否有支持属性
+ var prefixes = ['webkit','moz','ms','o'];
+ for (var i = 0; i < prefixes.length; i++){
+ if ((prefixes[i] + 'Hidden') in document)
+ return prefixes[i] + 'Hidden';
+ }
+ // 没有检测到返回null,表示不支持pagevisivility
+ return null;
+ },
+ // 当前页面是否隐藏
+ isHidden:function(){
+ var prop = this.getHiddenProp();
+ if (!prop) return false;
+ return document[prop];
}
-
});
},{