做了一个仿照pc端滚动条的功能,用来解决移动端ios下 scroll卡顿的bug。
目前的参数配置只有id,考虑将高度、是否显示隐藏滑块、样式设置加进去,并且兼容到pc中去。
目前只支持touch事件,可打开chrome的移动端模式,进行操作。
<!DOCTYPE html> <html lang="en"> <head> <meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta charset="UTF-8"> <title>移动端滚动条测试</title> <style> .z-scroll{ width: 250px; height: 400px; padding: 10px; background-color: #f0865c; border-radius: 5px; } .z-scroll .z-scroll-box{ background-color: #f2f7f9; border-radius: 5px; height: 100%; margin-right: 25px; overflow: hidden; } .z-scroll .z-scroll-shank{ float: right; width: 20px; height: 100%; text-align: center; } .z-scroll .z-scroll-shank:before{ display: inline-block; content: ''; height: 100%; width: 5px; background-color: #6f2305; } .z-scroll .z-scroll-block{ display: inline-block; width: 20px; height: 40px; border-radius: 4px; background-color: #f7f979; transform:translateY(-100px); cursor:pointer; } .m-doc{ padding: 10px; } .m-doc img{ width: 100%; height: auto; } </style> </head> <body> <div> <h1>我是滚动的插件。</h1> </div> <div class="z-scroll" id="scroll"> <div class="z-scroll-shank"> <span class="z-scroll-block"></span> </div> <div class="z-scroll-box"> <div class="z-scroll-content"> <div class="m-doc"> <p>世人都爱美女,但对美的态度却模棱两可。欣赏艳羡的同时,又不免在内心嘀咕一句:生得一副好皮囊,真是独得上天厚爱,难怪一生顺风顺水花团锦簇呢。说到美女,尤其是民国美女,林徽因便是其中名声最大的了,只是有人奉她为女神,有人觉得她也不过是个“绿茶婊”而已,挽着个梁思成,念念不忘徐志摩,甚至还让人家金岳霖为她终身不嫁。这些评说里,大家都只将她视为女人、长得漂亮的女人,却忽略了她所做的事情。</p> <p>林徽因曾说过:“真讨厌,什么美人、美人,好像女人没有什么事可做似的,我还有好些事要做呢!”在她看来,仅以“美人”来看待她,是对她的轻视。</p> <p>为什么人人视为“福利”的美好容颜,在林徽因这里却成了苦恼呢?因为对林徽因的生命历程来说,姣好的容貌却是她身上最不足称道的东西。</p> <strong>说到不忘初心,没有人比她做得更好</strong> <p>你还记得十几岁时的梦想吗?想必没有多少人能回答:我一直在坚守梦想。但林徽因,十六岁受邻居女建筑师影响,立下投身建筑事业的志愿后,一生都在为这个梦想,不懈耕耘。</p> <p>彼时,梁思成尚未确认志向,曾想子承父业学习西方政治,但被林徽因对建筑的高谈阔论改变了主意。甚至在谈婚论嫁时,她也以对方必须与自己到美国学习建筑为条件,对梁思成的一生的立志起了关键作用。她对自我理想和实现都有着清醒的认识,真让十点君汗颜。</p> <p>不远万里赴美国留学,却得知建筑系不招女生。她便“曲线救国”,在美术系注册,但选修了建筑学的全部课程。她全身心投入课业,优异的成绩使她成为课程助教。在接受美国一家报纸的采访时,她自信地说:“我要带回什么是中西方碰撞的真正含义。”——学成归国,她与梁思成受聘于东北大学,创建建筑系,将留学时的经验用于学校。林徽因还设计了东北大学“白山黑水”的校徽。</p> <img src="./images/img01.jpg" alt=""> <p>林徽因早年患肺疾,抗战期间颠沛流离,病情加剧为肺结核。但哪怕身患重疾(肺结核在当时属于不治之症),她依然与梁思成一路餐风露宿、翻山越岭,走遍中国15个省、200多个县,考察测绘了200多处古建筑。尤其是骑着毛驴寻觅到佛光寺时,身体羸弱的林徽因,亲自爬上长梯测量。</p> <strong>不以诗人的美誉为荣,也不以被人恋爱为辱</strong> <p>十六岁时,林徽因在英国与诗人徐志摩相识,后者很快便陷入了她清亮的眼眸里,甚至不惜为了她与妻子张幼仪离婚。徐志摩坦言,自己是因为林徽因才走上了诗歌的道路,她是落在他心湖里的一朵云,甘愿做她裙边的一株草,哪怕只能在凝望中爱着她。</p> <p>林徽因最终选择了梁思成。她欣赏徐志摩的浪漫与飘逸,但睿智如她,并不任由感性来左右自己选择,就连张幼仪都评价她“是一位思想更复杂、长相更漂亮、双脚更自由的女士”。</p> </div> </div> </div> </div> <script> /** [zScroll description]constructor */ function zScroll(options) { this.options = options || {}; if (this.options.id) { this.container = document.getElementById(this.options.id); //render ... this.swiperPanel = this.container.children[1].children[0]; this.shank = this.container.children[0]; this.swiperBlock = this.shank.children[0]; this.initBlockPosition(); } else { console.log('add the id of element'); } }; /** [initBlockPosition description]初始化滑块位置 */ zScroll.prototype.initBlockPosition = function() { if (this.shank && this.swiperBlock) { var shank_ht = this.shank.offsetHeight; this.swiperBlock.style.webkitTransform = 'translateY(-' + shank_ht + 'px)'; this.swiperPanel.style.webkitTransform = 'translateY(0px)'; this.moveBlock(shank_ht); } }; /** [moveBlock description]移动滑块位置 */ zScroll.prototype.moveBlock = function(shank_ht) { var _this = this; this.startY = 0; this.y = 0; this.startPanelY = 0; this.panelY = 0; this.aboveY = -shank_ht; this.abovePanelY = 0; if (_this.container) { _this.container.addEventListener('touchstart', function(e) { var target = e.target || e.srcElement; if (target.className == _this.swiperBlock.className) { _this.touchStart.call(_this, e); } else if (_this.swiperPanel.contains(target)) { _this.touchStartPanel.call(_this, e); } }); _this.container.addEventListener('touchmove', function(e) { var target = e.target || e.srcElement; if (target.className == _this.swiperBlock.className) { _this.touchMove.call(_this, e); } else if (_this.swiperPanel.contains(target)) { _this.touchMovePanel.call(_this, e); } }); _this.container.addEventListener('touchend', function(e) { var target = e.target || e.srcElement; if (target.className == _this.swiperBlock.className) { _this.touchEnd.call(_this, e); } else if (_this.swiperPanel.contains(target)) { _this.touchEndPanel.call(_this, e); } return true; }); } }; zScroll.prototype.touchStart = function(e) { var touch = e.touches[0]; this.startY = touch.pageY; e.preventDefault(); }; zScroll.prototype.touchMove = function(e) { var touch = e.touches[0], shank_ht = this.shank.offsetHeight, block_ht = this.swiperBlock.offsetHeight; this.y = parseInt(this.aboveY + touch.pageY - this.startY); if (this.y <= -block_ht && this.y >= -shank_ht) { this.swiperBlock.style.webkitTransform = 'translateY(' + this.y + 'px)'; this.moveSwipePanel(); } else { if (this.y < -shank_ht) { this.y = -shank_ht; this.swiperBlock.style.webkitTransform = 'translateY(' + this.y + 'px)'; this.moveSwipePanel(); } else if (this.y > -block_ht) { this.y = -block_ht; this.swiperBlock.style.webkitTransform = 'translateY(' + this.y + 'px)'; this.moveSwipePanel(); } } e.preventDefault(); }; zScroll.prototype.touchEnd = function(e) { var cssPanel = this.swiperPanel.style.webkitTransform, cssBlock = this.swiperBlock.style.webkitTransform; this.aboveY = cssBlock ? parseInt(cssBlock.split('(')[1].split(')')[0].replace('px', '')) : -this.shank.offsetHeight; this.abovePanelY = cssPanel ? parseInt(cssPanel.split('(')[1].split(')')[0].replace('px', '')) : 0; e.preventDefault(); }; /** [moveSwipePanel description]移动内容 */ zScroll.prototype.moveSwipePanel = function() { var shank_ht = this.shank.offsetHeight; var x1 = this.swiperPanel.offsetHeight - shank_ht, x2 = shank_ht - this.swiperBlock.offsetHeight; if (x2 != 0) { var y2 = parseInt(x1 / x2 * (this.y + shank_ht)); this.swiperPanel.style.webkitTransform = 'translateY(' + -y2 + 'px)'; } }; /** [touchStartBlock description]面板滑动事件 */ zScroll.prototype.touchStartPanel = function(e) { var touch = e.touches[0]; this.startPanelY = touch.pageY; e.preventDefault(); }; zScroll.prototype.touchMovePanel = function(e) { var touch = e.touches[0], shank_ht = this.shank.offsetHeight, panel_ht = this.swiperPanel.offsetHeight; this.panelY = parseInt(this.abovePanelY + touch.pageY - this.startPanelY); if (this.panelY <= 0 && this.panelY >= -(panel_ht - shank_ht)) { this.swiperPanel.style.webkitTransform = 'translateY(' + this.panelY + 'px)'; this.moveSwipeBlock(); } else { if (this.panelY > 0) { this.panelY = 0; this.swiperPanel.style.webkitTransform = 'translateY(' + this.panelY + 'px)'; this.moveSwipeBlock(); } else if (this.panelY < -(panel_ht - shank_ht)) { this.panelY = -(panel_ht - shank_ht); this.swiperPanel.style.webkitTransform = 'translateY(' + this.panelY + 'px)'; this.moveSwipeBlock(); } } e.preventDefault(); }; zScroll.prototype.touchEndPanel = function(e) { var cssPanel = this.swiperPanel.style.webkitTransform, cssBlock = this.swiperBlock.style.webkitTransform; this.aboveY = cssBlock ? parseInt(cssBlock.split('(')[1].split(')')[0].replace('px', '')) : -this.shank.offsetHeight; this.abovePanelY = cssPanel ? parseInt(cssPanel.split('(')[1].split(')')[0].replace('px', '')) : 0; e.preventDefault(); }; /** [moveSwipePanel description]移动内容 */ zScroll.prototype.moveSwipeBlock = function() { var shank_ht = this.shank.offsetHeight; var x1 = this.swiperPanel.offsetHeight - shank_ht, x2 = shank_ht - this.swiperBlock.offsetHeight; if (x1 != 0) { var y2 = parseInt(x2 * this.panelY / x1 + shank_ht); this.swiperBlock.style.webkitTransform = 'translateY(' + -y2 + 'px)'; } }; // ---- 其他 -------// /** [addStyle description]添加样式 */ zScroll.prototype.addStyle = function(el, classStyle) { if (typeof classStyle == 'object' && el) { for (var name in classStyle) { el.style[name] = classStyle[name]; } } }; </script> <script> var scroll=new zScroll({ id:'scroll' }); </script> </body> </html>