这篇文章主要是总结最近开发过程当中遇到的问题。有几个问题又是不容易发现缘由的问题,可是最后的结果又是很简单的。javascript
对于我本身开发的版原本说仍是集成了这个操做的。可是参考了京东,天猫,淘宝电商网站首页的 slider 图片轮播插件都没有支持点按操做。那么是为何呢?css
我想到的答案可能以下:html
对于移动端来讲,屏幕过小,轮播图上的显示当前图片状态的圆点,人的手指不容易选中。java
JavaScript 中this
在使用过程当中比较容易出错的。那么this
究竟是指向谁呢?我看到最多的一句话是:css3
this的指向在函数定义的时候是肯定不了的,只有函数执行的时候才能肯定this到底指向谁,实际上this的最终指向的是那个调用它的对象;git
来看两段代码:github
var a = { m: 12, b: { m: 13, func: function() { console.log(this.m); //result: 13 } } }; a.b.func();
经过输出的结果,咱们这个知道,当调用this
的时候,this
指向的是对象b
;chrome
var a = { m: 12, b: { m: 13, func: function() { console.log(this.m); //undefined console.log(this); //window } } }; var cc=a.b.func; cc(); //至关于 window.cc();
由以上代码的输出结果是当this
被调用的时候 this
指向的是当前的 window 至关于window.cc()
,这个时候其实是 window
调用了 this
;数组
上面的代码也印证了小结开头提到的那句话。可是不少时候根据实际状况咱们须要改变this
的指向,那咱们该怎么作呢?浏览器
好比下面这样,我有一个公共的 js 对象来保存一些公用的 DOM 操做的方法,好比:
var Doing.prototype={ likeSport:function(){ //这里使用原型的方式定义对象,就是想要这里的 this 始终指向送的都是 Doing console.log(this.test2()'like speak'); }, getName:function(){ // console.log('zhiqiang'); return 'zhiqiang' } }
个人应用场景以下,当我单击 test 节点的时候,打印出我喜欢的运动。
<div class="father"> <div class="test">我喜欢的运动是什么?</div> </div>
new Dong(); var Dong = function(){ var _this = this; $('.father').on('click','.test',function(){ console.log(this); //this 指向的是 test 节点对象 _this.likeSport(); //这时 likeSport方法中的 this 指向的是 .test 节点对象 }); };
根据以上的代码,虽然我使用了 _this
缓存了 this
的只想,以使在单击函数的回掉中可使用,可是这样直接调用 Dong 对象的方法,会改变 likeSport
中 this
的指向。
那么咱们怎么让咱们在单击函数的回掉中调用 likeSport
的方法时,likeSport
的方法中的this
仍然指向的是Dong
呢?
这个时候就要用到 call
或者 apply
来解决问题了。
call 和 apply 都是能够指定 function函数运行时,this 的值。二者惟一的区别就是 call 第二个参数接受的是参数列表,而 apply 接受的是一个参数数组。
fun.call(this,tp1,tp2); fun.apply(this,[tp1,tp2]);
按照以上的知识点来修改咱们的代码
$('.father').on('click','.test',function(){ console.log(this); //this 指向的是 test 节点对象 _this.likeSport().call(_this); //这时 likeSport方法中的 this 指向的是 Dong });
为何使用 css3属性来作动画?使用 css 3作动画有什么好处呢?
咱们先借助 chrome 开发者工具对动画渲染作一个检测,先来看使用margin-left
来作动画发生了什么
再来看使用 translate3d
作动画发生了什么
咱们能够很明显的看到,在使用 margin-left
作动画的过程当中,浏览器每时每刻都在发生渲染操做,而使用 translate3d
只是在开始和结束的时候发生渲染操做。
来看看 csstrigger 网站上对 margin-left 和 transform 的区别:
由上面能够知道,咱们在使用 margin-left 这样的属性的时候,会触发页面的重排和重绘,而使用 transform 的时候,能够调用 gpu 对渲染进行帮助。
1. 在使用 jQuery 或者 Zepto 的 animate 方法作动画的时候,个人代码多是这样的
test.animate({left:'15px'},1000); test.animate({transform:'translate3d(0,15px,0)'},1000);
可是根据 API 文档,咱们能够直接这样写
test.animate({translate3d:'0,15px,0'},1000);
这种写法比上面的写法简洁一些。
2. 在使用 CSS3 属性作动画的时候,数值要加单位,否则会没有效果,好比下面的代码
var size = 150; test.animate({'translate3d': '-' + size + ',0,0'},1000)
这样写是正确的:
var size = 150; test.animate({'translate3d': '-' + size + 'px,0,0'},1000)
咱们会有这样的业务场景,须要从页面的最低部返回页面的头部,或者是返回到页面的某个部分。
可以想到的解决方案有两种:
使用锚点没有什么能够多说的,也很简单,可是滚动效果比较生硬。使用 js 来滚动页面的话,能够设置滚动动画,来使页面的滚动的效果更加友好。
在网上若是搜索scroll
动画最多的答案就是使用下面这样的代码:
$('.body1').animate({scrollTop:200},2000);
可是我在使用这样代码的时候,却没有出现我想要的效果,最后经过各类尝试仍是找到缘由的。就是的父级元素没有设置overflow:auto
overflow 这个属性仍是颇有用的。好比:触发盒子的 BFC
还有就是禁止元素在水平或者竖直方向滚动。
注意:
jQuery
支持这样的滚动动画,可是 Zepto
不支持这个操做滚动动画;