Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 1x 1x 1x 1x 1x 1x 1x | /** * 显示滚动区域滑动滚动事件不再穿透到底部 * - ios 需要给滚动区域添加样式属性: -webkit-overflow-scrolling: touch; * - 仅支持单方向滑动禁用 * @method dom/scrollLimit * @param {Object} el 要限制滚动穿透的滚动区域元素 * @param {Object} options 限制滚动穿透的选项 * @param {String} [options.direction='y'] 限制滚动的方向,取值: ['x', 'y'] * @return {Boolean} 是否为dom元素 * @example * var $scrollLimit = require('@spore-ui/kit/packages/dom/scrollLimit'); * var scroller = document.getElementById('scroller'); * var limiter = $scrollLimit(scroller, { direction: 'y' }); * // 初始化时 * limiter.attach(); * // 卸载组件时 * limiter.detach(); */ var $assign = require('../obj/assign'); function scrollLimit(el, options) { var inst = {}; var conf = $assign({ direction: 'y', }, options); var scrollTop = 0; var scrollLeft = 0; var clientHeight = 0; var clientWidth = 0; var scrollHeight = 0; var scrollWidth = 0; var toTop = false; var toBottom = false; var toLeft = false; var toRight = false; var moveStartX = 0; var moveStartY = 0; var updateState = function () { scrollTop = el.scrollTop; scrollLeft = el.scrollLeft; clientHeight = el.clientHeight; scrollHeight = el.scrollHeight; scrollWidth = el.scrollWidth; toTop = scrollTop <= 0; toBottom = scrollTop + clientHeight >= scrollHeight; toLeft = scrollLeft <= 0; toRight = scrollLeft + clientWidth >= scrollWidth; }; var getEvent = function (evt) { var tev = evt; if (evt.touches && evt.touches.length) { tev = evt.touches[0]; } return tev; }; inst.checkScroll = function (evt) { evt.stopPropagation(); updateState(); }; inst.checkStart = function (evt) { var tev = getEvent(evt); moveStartX = tev.clientX; moveStartY = tev.clientY; }; inst.checkMove = function (evt) { updateState(); var tev = getEvent(evt); if (conf.direction === 'x') { if (toLeft && (tev.clientX > moveStartX)) { evt.preventDefault(); } if (toRight && (tev.clientX < moveStartX)) { evt.preventDefault(); } } else { if (toTop && (tev.clientY > moveStartY)) { evt.preventDefault(); } if (toBottom && (tev.clientY < moveStartY)) { evt.preventDefault(); } } }; var setEvents = function (type) { var prefix = type === 'on' ? 'add' : 'remove'; var method = prefix + 'EventListener'; Eif (typeof el[method] === 'function') { el[method]('scroll', inst.checkScroll); el[method]('touchmove', inst.checkMove); el[method]('touchstart', inst.checkStart); } }; inst.attach = function () { updateState(); setEvents('on'); }; inst.detach = function () { setEvents('off'); }; return inst; } module.exports = scrollLimit; |