测试

test

<!doctype html>
<html lang="en">

<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,minimal-ui" />
<meta charset="UTF-8">
<title>sscroll test</title>
<style>
#out-box{
height:200px;
border:1px solid #0ff;
overflow:hidden;
}
#out {
100px;
height:2000px;
border:5px solid #f00;
}
#scrolla{
height:300px;
border:1px solid #00f;
}

#scrollb{
height:200px;
border:1px solid #0ff;
}
</style>
<script type="text/javascript" src="../src/xscroll.js"></script>
<script>
window.onload = function(){
new xScroll({
el:'#out-box',
onSrcollStart:function(){
console.log('start')
},
onScrollMove:function(){
console.log('move')
},
onScrollEnd:function(){
console.log('end')
}
});
new xScroll({
el:'#tou'
});

new xScroll({
el:'#scrolla'
});
new xScroll({
el:'#scrollb'
});
};
</script>
</head>

<body>
<div id="tou" style="display:inline-block;border:1px solid #f00;height:200px;">
 一:沉稳

  (1)不要随便显露你的情绪。

  (2)不要逢人就诉说你的困难和遭遇。

  (3)在征询别人的意见之前,自己先思考,但不要先讲。

  (4)不要一有机会就唠叨你的不满。

  (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度
 一:沉稳

  (1)不要随便显露你的情绪。

  (2)不要逢人就诉说你的困难和遭遇。

  (3)在征询别人的意见之前,自己先思考,但不要先讲。

  (4)不要一有机会就唠叨你的不满。

  (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。
  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。

  (2)对别人的小过失、小错误不要斤斤计较。

  (3)在金钱上要大方,学习三施(财施、法施、无畏施)

  (4)不要有权力的傲慢和知识的偏见。

  (5)任何成果和成就都应和别人分享。

  (6)必须有人牺牲或奉献的时候,自己走在前面。

  五:诚信

  (1)做不到的事情就不要说.说了就要努力做到.

  (2)虚的口号或标语不要常挂嘴上。

  (3)针对客户提出的“不诚信”问题,拿出改善的方法。

  (4)停止一切“不道德”的手段。

  (5)耍弄小聪明,要不得!

  (6)计算一下产品或服务的诚信代价,那就是品牌成本。

  六:担当

  (1)检讨任何过失的时候,先从自身或自己人开始反省。

  (2)事项结束后,先审查过错,再列述功劳。

  (3)认错从上级开始,表功从下级启动

  (4)着手一个计划,先将权责界定清楚,而且分配得当。

  (5)对“怕事”的人或组织要挑明了说。

  (6)因为勇于承担责任所造成的损失,公司应该承担
 一:沉稳

  (1)不要随便显露你的情绪。

  (2)不要逢人就诉说你的困难和遭遇。

  (3)在征询别人的意见之前,自己先思考,但不要先讲。

  (4)不要一有机会就唠叨你的不满。

  (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。

  (2)对别人的小过失、小错误不要斤斤计较。

  (3)在金钱上要大方,学习三施(财施、法施、无畏施)

  (4)不要有权力的傲慢和知识的偏见。

  (5)任何成果和成就都应和别人分享。

  (6)必须有人牺牲或奉献的时候,自己走在前面。

  五:诚信

  (1)做不到的事情就不要说.说了就要努力做到.

  (2)虚的口号或标语不要常挂嘴上。

  (3)针对客户提出的“不诚信”问题,拿出改善的方法。

  (4)停止一切“不道德”的手段。

  (5)耍弄小聪明,要不得!

  (6)计算一下产品或服务的诚信代价,那就是品牌成本。

  六:担当

  (1)检讨任何过失的时候,先从自身或自己人开始反省。

  (2)事项结束后,先审查过错,再列述功劳。

  (3)认错从上级开始,表功从下级启动

  (4)着手一个计划,先将权责界定清楚,而且分配得当。

  (5)对“怕事”的人或组织要挑明了说。

  (6)因为勇于承担责任所造成的损失,公司应该承担

  (1)不要刻意把有可能是伙伴的人变成对手。

  (2)对别人的小过失、小错误不要斤斤计较。

  (3)在金钱上要大方,学习三施(财施、法施、无畏施)

  (4)不要有权力的傲慢和知识的偏见。

  (5)任何成果和成就都应和别人分享。

  (6)必须有人牺牲或奉献的时候,自己走在前面。

  五:诚信

  (1)做不到的事情就不要说.说了就要努力做到.

  (2)虚的口号或标语不要常挂嘴上。

  (3)针对客户提出的“不诚信”问题,拿出改善的方法。

  (4)停止一切“不道德”的手段。

  (5)耍弄小聪明,要不得!

  (6)计算一下产品或服务的诚信代价,那就是品牌成本。

  六:担当

  (1)检讨任何过失的时候,先从自身或自己人开始反省。

  (2)事项结束后,先审查过错,再列述功劳。

  (3)认错从上级开始,表功从下级启动

  (4)着手一个计划,先将权责界定清楚,而且分配得当。

  (5)对“怕事”的人或组织要挑明了说。

  (6)因为勇于承担责任所造成的损失,公司应该承担
</pre>
</div>
<div id="out-box" style="100%">
<pre>

  (2)不要逢人就诉说你的困难和遭遇。

  (3)在征询别人的意见之前,自己先思考,但不要先讲。

  (4)不要一有机会就唠叨你的不满。

  (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心

  (1)对身边发生的事情,常思考它们的因果关系。

  (2)对做不到位的执行问题,要发掘它们的根本症结。

  (3)对习以为常的做事方法,要有改进或优化的建议。

  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

  四:大度

  (1)不要刻意把有可能是伙伴的人变成对手。

  (2)对别人的小过失、小错误不要斤斤计较。

  (3)在金钱上要大方,学习三施(财施、法施、无畏施)

  (4)不要有权力的傲慢和知识的偏见。


</div>

<div id="scrolla">
<pre>
(4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识
(5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。
(5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。
(5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。
</pre>
<div id="scrollb">
<pre>
  (4)做什么事情都要养成有条不紊和井然有序的习惯。

  (5)经常去找几个别人看不出来的毛病或弊端。

  (6)自己要随时随地对有所不足的地方补位。

  三:胆识

  (1)不要常用缺乏自信的词句

  (2)不要常常反悔,轻易推翻已经决定的事。

  (3)在众人争执不休时,不要没有主见。

  (4)整体氛围低落时,你要乐观、阳光。

  (5)做任何事情都要用心,因为有人在看着你。

  (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

 (5)重要的决定尽量有别人商量,最好隔一天再发布。

  (6)讲话不要有任何慌张,走路也一样.

  二:细心
</pre>
</div>
</div>
</body>

</html>

xscroll.js

/**
* 这是个针对modile端的小型滚动条框架
* 兼容 IE9+,chrome,firefox,safari及所有现代浏览器
* @author ouxingzhi@vip.qq.com
* @createDate 2014/06/01
*/

void function(window,document,undefined){

//utils
var ap = Array.prototype,
slice = ap.slice,
push = ap.push,
regSelector = /^#([a-z][w-]+)|.([a-z][w-]+)|([a-z]+)/i,
regTag = /^[a-z]+$/i,
isIE = !!document.attachEvent;
Function.prototype.bind = Function.prototype.bind || function(self){
var fn = this;
return function(){
return fn.apply(self,arguments);
}
};
//简单选择器
function $(selector,rootNode){
rootNode = rootNode || document;
var rets = [],r;
var matches = regSelector.exec(selector);
if(matches){
if(matches[1] && rootNode.getElementById){
r = rootNode.getElementById(matches[1]);
r && rets.push(r);
return rets;
}else if(matches[2] && rootNode.getElementsByClassName){
r = rootNode.getElementsByClassName(matches[2]);
r && r.length && push.apply(rets,r);
return rets;
}else if(matches[3] && rootNode.getElementsByTagName){
r = rootNode.getElementsByClassName(matches[3]);
r && r.length && push.apply(rets,r);
return rets;
}
}
rootNode.querySelectorAll && push.apply(rets,rootNode.querySelectorAll(selector));
return rets;
}

function getCss(el,styleName){
if(window.getComputedStyle){
return window.getComputedStyle(el)[styleName];
}else if(el.currentStyle){
return el.currentStyle[styleName];
}
}
function css(el,styleName,val){
if(!val){
return getCss(el,styleName);
}else{
el.style[styleName] = val;
}
}
function offset(el){
var left=0,top=0;
do{
left += el.offsetLeft;
top += el.offsetTop;
}while(el = el.offsetParent);
return {
left:left,
top:top
};
}
function isElement(o){
return !!(o && o.addEventListener && o.nodeType === 1);
}
function addEvent(el,type,fn){
if(el.addEventListener){
el.addEventListener(type,fn,false);
}else if(el.attachEvent){
el['__on'+type+'__'] = fn;
el.attachEvent('on'+type,el['__on'+type+'__']);
}
}

function removeEvent(el,type,fn){
if(el.removeEventListener){
el.removeEventListener(type,fn);
}else if(el.detachEvent){
el.detachEvent('on'+type,fn);
}
}

function trigger(el,event){
if(el.dispatchEvent){
el.dispatchEvent(event);
}else if(el.fireEvent){
el.fireEvent(event);
}
}

var C = function(div){
return function(html,attr,events){
var dom = null;
if(regTag.test(html)){
dom = document.createElement(html);
}else{
div.innerHTML = html;
var child = div.firstChild;
loop:do{
if(child && child.nodeType === 1) {
div.removeChild(child);
div.innerHTML = '';
dom = child;
break loop;
}
}while(child = child.nextSibling);
}
attr = attr || {};
var val;
for(var i in attr){
val = attr[i];
if(i === 'class') i = 'className';
if(i === 'style'){
dom[i]['cssText'] = val;
}else{
dom[i] = val;
}
}
events = events || {};
for(var i in events){
addEvent(dom,i,events[i]);
}
return dom;
};
}(document.createElement('div'));
//获得元素大小
function getSize(el,useBorder){
var width,height;
if(useBorder){
width = el.offsetWidth;
height = el.offsetHeight;
}else{
width = el.clientWidth;
height = el.clientHeight;
}
return {
height:height,
width
};
}
//取页面大小
function getPageSize(){
return {
Math.max(document.documentElement.offsetWidth,window.innerWidth),
height:Math.max(document.documentElement.offsetHeight,window.innerHeight)
};
}
//取元素的内部高度
function getScrollInfo(el){
return {
pageWidth:el.scrollWidth,
pageHeight:el.scrollHeight,
height:el.clientHeight,
el.clientWidth,
top:el.scrollTop,
left:el.scrollLeft
};
}
//取视口大小
function getViewPortSize(){
return {
window.innerWidth,
height:window.innerHeight
}
}

//取消默认行为
function preventDefault(e){
if(e.preventDefault){
e.preventDefault();
}
if('returnValue' in e){
e.returnValue = false;
}
}
//停止派发事件
function stopPropagation(e){
if(e.stopPropagation){
e.stopPropagation();
}
if('cancelBubble' in e){
e.cancelBubble = true;
}
}
//判断元素是不是属于或是等于另一元素
function insideElement(el,box){
return el === box || box.compareDocumentPosition && !!(box.compareDocumentPosition(el) & 16) || box.contains && box.contains(el);
}

var requestAnimationFrame = window.requestAnimationFrame
|| window.mozRequestAnimationFrame
|| window.webkitRequestAnimationFrame
|| window.msRequestAnimationFrame
|| window.oRequestAnimationFrame
|| function(callback) {
setTimeout(callback, 1000 / 60);
};
//计算加速度
function Acceleration(){
this.times = [];
this.state = Acceleration.STATE_STOP;
this.timer;
this.curX;
this.curY;
this.resource;
}

Acceleration.STATE_STOP = 0;
Acceleration.STATE_RUNNING = 1;

Acceleration.prototype = {
constructor:Acceleration,
start:function(x,y){
this.add(x,y);
this.state = Acceleration.STATE_RUNNING;
this.loop();
},
loop:function(){
if(this.state === Acceleration.STATE_STOP) return;
this.add(this.curX,this.curY);
this.timer = setTimeout(this.loop.bind(this),1000/40);
},
add:function(x,y){
this.state = Acceleration.STATE_RUNNING;
clearTimeout(this.timer);
this.times.unshift({
time:new Date().valueOf(),
x:x,
y:y
});
this.curX = x;
this.curY = y;
if(this.times.length > 5){
this.times.splice(5,this.times.length - 5);
}
this.timer = setTimeout(this.loop.bind(this),1000/40);
return this.calc();
},
end:function(x,y){
this.add(x,y);
this.state = Acceleration.STATE_STOP;
clearTimeout(this.timer);
return this.calc();
},
calc:function(){
var i = 3;
var t = this.times,
p1 = t[i] || t[i-1] || t[i-2],
p2 = t[0];
if(!p1) return {x:0,y:0};
var diff = p2.time - p1.time,
x = p2.x - p1.x,
y = p2.y - p1.y;
var xs = (1000 / diff) * x,
ys = (1000 / diff) * y;
return {
x:xs,
y:ys
}
}
};

var isSuportTouch = 'ontouchstart' in document,
isIE = 'attachEvent' in document;
function noop(){}

var CLASS_PREFIX = 'xscroll-';

function xScroll(ops){
this.html;
//外部容器
this.container;
//容器
this.el;
//滚动条
//x轴滚动条
this.xScrollBar;
//y轴滚动条
this.yScrollBar;

//x轴滚动条外补丁
this.xScrollBarMargin = 1;
//y轴滚动条外补丁
this.yScrollBarMargin = 1;

//记录touchstart时的开始位置
this.startX = 0;
this.startY = 0;
//记录touchstart时的scroll位置
this.startScrollX = 0;
this.startScrollY = 0;
//加速度计算对象
this.acceleration = new Acceleration();
//滚动状态
this.slide_state = xScroll.SLIDE_STATE_STOP;

//缓动时记录上一次位置
this.lastLeft;
this.lastTop;

//回调函数
this.onScrollStart = noop;
this.onScrollMove = noop;
this.onScrollEnd = noop;

//是否隐藏scroll
this.hideScroller = false;
//当前滚动条比例
this.curXRatio = 1;
this.curYRatio = 1;

this._onTouchStart = this.onTouchStart.bind(this);
this._onTouchMove = this.onTouchMove.bind(this);
this._onTouchEnd = this.onTouchEnd.bind(this);
//兼容ie的mouse事件
this.isLeftBtnDown = false;
this._ieOnTouchStart = function(e){
e = window.event || e;
if(insideElement(e.target || e.srcElement,this.el)){
if(e.button === 0 || isIE && e.button === 1){
this.isLeftBtnDown = true;
this.onTouchStart(e);
}
}
}.bind(this);

this._ieOnTouchMove = function(e){
e = window.event || e;
if( (e.button === 0 || isIE && e.button === 1) && this.isLeftBtnDown){
this.onTouchMove(e);
}
}.bind(this);

this._ieOnTouchEnd = function(e){
e = window.event || e;
if((e.button === 0 || isIE && e.button === 1) && this.isLeftBtnDown){
this.onTouchEnd(e);
this.isLeftBtnDown = false;
}
}.bind(this);
//滚动的线程id
this.curThreadId = 0;

this.events = {};
this.setOption(ops);
this.init();
}
xScroll.SLIDE_STATE_STOP = 0;
xScroll.SLIDE_STATE_RUNNING = 1;

xScroll.prototype = {
constructor:xScroll,

setOption:function(ops){
if(ops.el){
if(typeof ops.el === 'string'){
this.el = $(ops.el)[0];
if(!this.el){
throw "element does not exist!";
}
}else{
this.el = ops.el;
}
}
//设置回调
if(ops.onSrcollStart && typeof ops.onSrcollStart === 'function'){
this.onScrollStart = ops.onSrcollStart;
}
if(ops.onScrollMove && typeof ops.onScrollMove === 'function'){
this.onScrollMove = ops.onScrollMove;
}
if(ops.onScrollEnd && typeof ops.onScrollEnd === 'function'){
this.onScrollEnd = ops.onScrollEnd;
}
//是否显示滚动条
if(typeof ops.hideScroller !== 'undefined'){
this.hideScroller = ops.hideScroller;
}
//滚动条margin
if(typeof ops.xScrollBarMargin !== 'undefined'){
this.xScrollBarMargin = ops.xScrollBarMargin;
}
if(typeof ops.yScrollBarMargin !== 'undefined'){
this.yScrollBarMargin = ops.yScrollBarMargin;
}
},
init:function(){
this.buildEvent();
this.createScrollBar();
this.calcScroll();
this._onScrollEnd();
},
buildEvent:function(){
if(isSuportTouch){
addEvent(this.el,'touchstart',this._onTouchStart);
addEvent(this.el,'touchmove',this._onTouchMove);
addEvent(this.el,'touchend',this._onTouchEnd);
}else{
addEvent(document.documentElement,'mousedown',this._ieOnTouchStart);
addEvent(document.documentElement,'mousemove',this._ieOnTouchMove);
addEvent(document.documentElement,'mouseup',this._ieOnTouchEnd);
}

},
scrollTo:function(x,y){
this.setScroll(x,y);
},
getPointerPos:function(e){
var touch
if(isSuportTouch){
touch = e && e.changedTouches && e.changedTouches[0];
}else{
touch = e;
}
return touch;
},
getTouchPos:function(e){
var touch = this.getPointerPos(e);
if(!touch) return {x:0,y:0};
return {
x:touch.screenX,
y:touch.screenY
};
},
setStartPos:function(e){
var pos = this.getTouchPos(e);
var spos = getScrollInfo(this.container);
this.startX = pos.x;
this.startY = pos.y;
this.startScrollX = spos.left;
this.startScrollY = spos.top;
},
getNewPos:function(e){
var pos = this.getTouchPos(e),
x = this.startScrollX + (this.startX - pos.x),
y = this.startScrollY + (this.startY - pos.y);
return {
x:x,
y:y
};
},
getPageTouchPos:function(e){
var touch = this.getPointerPos(e);
return {
x:touch.screenX,
y:touch.screenY
};
},
onTouchStart:function(e){
//preventDefault(e);
stopPropagation(e)
this.setStartPos(e);
var pos = this.getPageTouchPos(e);
this.acceleration.add(pos.x,pos.y);
this.stopSlideLoop();
this.onScrollStart();
},
onTouchMove:function(e){
this._onScrollMove();
preventDefault(e);
stopPropagation(e)
var pos = this.getNewPos(e);
this.setScroll(pos.x,pos.y);
var p = this.getPageTouchPos(e);
this.acceleration.add(p.x,p.y);

},
onTouchEnd:function(e){
//preventDefault(e);
stopPropagation(e)
var pos = this.getPageTouchPos(e);
var speed = this.acceleration.end(pos.x,pos.y);
if(speed.y || speed.x) this.startSlide(speed);
},
startSlide:function(speed){
this.slide_state = xScroll.SLIDE_STATE_RUNNING;
var len = parseInt(Math.sqrt(Math.pow(speed.x,2)+Math.pow(speed.y,2))*0.03);
this.slideLoop(60+len,60+len,this.curThreadId,speed.x,speed.y);
},
slideLoop:function(num,den,threadid,x,y){
clearTimeout(this.endtimeer);
if(threadid !== this.curThreadId){
return;
}
if(!num || !x && !y){
this.slide_state = xScroll.SLIDE_STATE_STOP;
this.onScrollEnd();
this.endtimeer = setTimeout(this._onScrollEnd.bind(this),400);
return ;
}
//到头了
var spos = getScrollInfo(this.container);
if(spos.left === this.lastLeft && spos.top === this.lastTop){
this.slide_state = xScroll.SLIDE_STATE_STOP;
this.onScrollEnd();
this.endtimeer = setTimeout(this._onScrollEnd.bind(this),400);
return ;
}
var ratio = 0.03 * Math.pow((num / den),3);
var xm = spos.left - x * ratio ,
ym = spos.top - y * ratio;

this.lastLeft = spos.left;
this.lastTop = spos.top;
this.calcSlidePos(xm,ym);
requestAnimationFrame(function(){
this.slideLoop(--num,den,threadid,x,y)
}.bind(this));
},
stopSlideLoop:function(){
this.curThreadId++;
},
calcSlidePos:function(xm,ym){
this.setScroll(xm,ym)
},
setScroll:function(x,y){
this.container.scrollTop = y;
this.container.scrollLeft = x;
this.calcScroll();
},
_onScrollMove:function(){
if(!this.hideScroller){
if(this.curXRatio !== 1){
css(this.xScrollBar,'display','block');
}
if(this.curYRatio !== 1){
css(this.yScrollBar,'display','block');
}
}
this.onScrollMove();
},
_onScrollEnd:function(){
if(this.slide_state === xScroll.SLIDE_STATE_STOP){
css(this.xScrollBar,'display','none');
css(this.yScrollBar,'display','none');
}
},
calcScroll:function(){
var sinfo = getScrollInfo(this.container),
height = sinfo.pageHeight - sinfo.height,
width = sinfo.pageWidth - sinfo.width,
xpos = sinfo.left / width || 0,
ypos = sinfo.top / height || 0,
xratio = sinfo.width / sinfo.pageWidth,
yratio = sinfo.height / sinfo.pageHeight,
xscrollW = xratio * (sinfo.width - this.xScrollBarMargin*2),
yscrollH = yratio * (sinfo.height - this.yScrollBarMargin*2),
xscrollL = this.xScrollBarMargin + xpos * (sinfo.width - this.xScrollBarMargin*2 - xscrollW),
xscrollT = this.yScrollBarMargin + ypos * (sinfo.height - this.yScrollBarMargin*2 - yscrollH);
this.curXRatio = xratio;
this.curYRatio = yratio;
//更新宽度
css(this.xScrollBar,'width',xscrollW+'px');
css(this.yScrollBar,'height',yscrollH+'px');
//更新位置

css(this.xScrollBar,'left',xscrollL+'px');
css(this.yScrollBar,'top',xscrollT+'px');
if(xratio === 1){
css(this.xScrollBar,'display','none');
}
if(yratio === 1){
css(this.yScrollBar,'display','none');
}
},
createScrollBar:function(){
var defaultStyle = 'position:absolute;height:5px;5px;background:#000;opacity:0.5;border-radius:2px; zoom:1;overflow:hidden;';
this.container = C('div',{
'class':CLASS_PREFIX + 'container',
'style':'height:100%;100%;overflow:hidden'
});

this.xScrollBar = C('div',{
'class':CLASS_PREFIX + 'xscrollbar',
'style':defaultStyle + 'left:'+this.xScrollBarMargin+'px;bottom:'+this.xScrollBarMargin+'px;'
});
this.yScrollBar = C('div',{
'class':CLASS_PREFIX + 'yscrollbar',
'style':defaultStyle + 'right:'+this.yScrollBarMargin+'px;top:'+this.yScrollBarMargin+'px;'
});
var tmplist=[];
for(var i=0,len=this.el.childNodes.length;i<len;i++){
tmplist.push(this.el.childNodes[i]);
}
for(i=0,len=tmplist.length;i<len;i++){
this.container.appendChild(tmplist[i]);
}

this.el.appendChild(this.container);
this.el.appendChild(this.xScrollBar);
this.el.appendChild(this.yScrollBar);
var elPosition = css(this.el,'position');
if(!elPosition || elPosition === 'static'){
css(this.el,'position','relative');
}
},
getContent:function(){
return this.container;
}
};

window.xScroll = xScroll;
}(window,document);

原文地址:https://www.cnblogs.com/-Apple/p/4220694.html