├── test ├── src2.js ├── src.js ├── styles.css ├── index.html ├── index2.html └── dom-autoscroller.js ├── .jshintignore ├── .gitattributes ├── logo.png ├── .gitignore ├── bower.json ├── LICENSE ├── package.json ├── rollit.js ├── logo.svg ├── README.md ├── dist ├── dom-autoscroller.min.js ├── bundle.es.js ├── bundle.js ├── bundle.es.js.map ├── bundle.js.map ├── dom-autoscroller.js └── dom-autoscroller.js.map └── src └── index.js /test/src2.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.jshintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | dist/**/* -diff 2 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hollowdoor/dom_autoscroller/HEAD/logo.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | npm-debug.log 3 | .jshintrc 4 | 5 | # Ignore compiled files 6 | # dist 7 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dom-autoscroller", 3 | "description": "Auto scroll dom elements", 4 | "main": "dist/dom-autoscroller.js", 5 | "keywords": [ 6 | "scroll", 7 | "scroller", 8 | "autoscroll" 9 | ], 10 | "authors": [ 11 | "Quentin Engles" 12 | ], 13 | "license": "MIT", 14 | "homepage": "https://github.com/hollowdoor/dom_autoscroller", 15 | "ignore": [ 16 | ".jshintignore", 17 | ".gitignore", 18 | "README.md" 19 | ] 20 | } 21 | 22 | -------------------------------------------------------------------------------- /test/src.js: -------------------------------------------------------------------------------- 1 | var dragula = require('dragula')//, 2 | autoScroll = require('../'); 3 | 4 | 5 | var drake = dragula([document.querySelector('#list'), document.querySelector('#hlist')]); 6 | 7 | var scroll = autoScroll([ 8 | window, 9 | document.querySelector('#list-container'), 10 | document.querySelector('#container2') 11 | ],{ 12 | margin: 20, 13 | maxSpeed: 20, 14 | syncMove: true, 15 | autoScroll: function(){ 16 | return this.down && drake.dragging; 17 | } 18 | }); 19 | -------------------------------------------------------------------------------- /test/styles.css: -------------------------------------------------------------------------------- 1 | body{ 2 | background-color: #968096; 3 | } 4 | #list-container{ 5 | background-color: green; 6 | cursor: default; 7 | overflow-y: auto; 8 | height: 100px; 9 | padding: 10px; 10 | } 11 | #list{ 12 | padding: 10px; 13 | margin: 10px; 14 | } 15 | #container2{ 16 | background-color: red; 17 | cursor: default; 18 | overflow-x: auto; 19 | width: 250px; 20 | padding: 20px; 21 | white-space: nowrap; 22 | } 23 | #hlist{ 24 | padding: 10px; 25 | margin: 10px; 26 | 27 | } 28 | #hlist li{ 29 | display: inline; 30 | } 31 | .gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)} 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Quentin Engles 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dom-autoscroller", 3 | "version": "2.3.4", 4 | "description": "Auto scroll dom elements", 5 | "main": "dist/bundle.js", 6 | "jsnext:main": "dist/bundle.es.js", 7 | "directories": { 8 | "test": "test" 9 | }, 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1", 12 | "build": "node ./rollit" 13 | }, 14 | "keywords": [ 15 | "scrolling", 16 | "DOM" 17 | ], 18 | "author": "Quentin Engles ", 19 | "license": "MIT", 20 | "dependencies": { 21 | "animation-frame-polyfill": "^1.0.0", 22 | "create-point-cb": "^1.0.0", 23 | "dom-mousemove-dispatcher": "^1.0.1", 24 | "dom-plane": "^1.0.1", 25 | "dom-set": "^1.0.1", 26 | "type-func": "^1.0.1" 27 | }, 28 | "devDependencies": { 29 | "dragula": "^3.7.2", 30 | "minifyify": "^7.3.3", 31 | "rollup": "^0.41.4", 32 | "rollup-plugin-buble": "^0.15.0", 33 | "rollup-plugin-commonjs": "^5.0.5", 34 | "rollup-plugin-node-resolve": "^2.0.0", 35 | "rollup-plugin-uglify": "^1.0.1", 36 | "uglify-js": "^2.7.4" 37 | }, 38 | "repository": { 39 | "type": "git", 40 | "url": "https://github.com/hollowdoor/dom_autoscroller.git" 41 | }, 42 | "files": [ 43 | "dist", 44 | "LICENSE", 45 | "index.js" 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dom list test 5 | 6 | 7 | 8 | 9 | 10 |

A demonstration of using dom-autoscroller with the dragula library.

11 |

Drag the elements in the lists around. Holding the pointer (mouse/touch) near the edge of the element 12 | makes the element scroll.

13 |
14 |
    15 |
  1. zero
  2. 16 |
  3. one
  4. 17 |
  5. two
  6. 18 |
  7. three
  8. 19 |
  9. four
  10. 20 |
  11. five
  12. 21 |
  13. six
  14. 22 |
  15. seven
  16. 23 |
  17. eight
  18. 24 |
  19. nine
  20. 25 |
  21. ten
  22. 26 |
  23. eleven
  24. 27 |
  25. twelve
  26. 28 |
  27. thirteen
  28. 29 |
  29. fourteen
  30. 30 |
  31. fifteen
  32. 31 |
32 |
33 |
34 |
    35 |
  1. zero
  2. 36 |
  3. one
  4. 37 |
  5. two
  6. 38 |
  7. three
  8. 39 |
  9. four
  10. 40 |
  11. five
  12. 41 |
  13. six
  14. 42 |
  15. seven
  16. 43 |
  17. eight
  18. 44 |
  19. nine
  20. 45 |
  21. ten
  22. 46 |
  23. 11
  24. 47 |
  25. 12
  26. 48 |
  27. 13
  28. 49 |
  29. 14
  30. 50 |
  31. 15
  32. 51 |
52 |
53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /rollit.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | //import babel from 'rollup-plugin-babel'; 3 | //const babel = require('rollup-plugin-babel'); 4 | const buble = require('rollup-plugin-buble'); 5 | const rollup = require('rollup'); 6 | const nodeResolve = require('rollup-plugin-node-resolve'); 7 | const commonjs = require('rollup-plugin-commonjs'); 8 | const writeFile = require('fs').writeFile; 9 | const UglifyJS = require('uglify-js'); 10 | const pack = require('./package.json'); 11 | const external = Object.keys(pack.dependencies || {}); 12 | 13 | rollup.rollup({ 14 | entry: 'src/index.js', 15 | plugins: [ 16 | nodeResolve({ 17 | jsnext: true, 18 | main: true, 19 | module: true 20 | }), 21 | commonjs(), 22 | buble() 23 | ], 24 | external: external 25 | }).then((bundle)=>{ 26 | bundle.write({ 27 | dest: 'dist/bundle.js', 28 | format: 'cjs', 29 | moduleName: 'dom-autoscroller', 30 | sourceMap: true 31 | }); 32 | 33 | bundle.write({ 34 | dest: 'dist/bundle.es.js', 35 | format: 'es', 36 | sourceMap: true 37 | }); 38 | }).catch(onErrorCB('bundle')); 39 | 40 | 41 | 42 | rollup.rollup({ 43 | entry: 'src/index.js', 44 | plugins: [ 45 | nodeResolve({ 46 | jsnext: true, 47 | main: true 48 | }), 49 | commonjs(), 50 | buble() 51 | ], 52 | }).then((bundle)=>{ 53 | let b = bundle.write({ 54 | dest: 'dist/dom-autoscroller.js', 55 | format: 'iife', 56 | sourceMap: true, 57 | moduleName: 'autoScroll' 58 | }); 59 | 60 | b.then(what=>{ 61 | 62 | try{ 63 | var result = UglifyJS.minify('dist/dom-autoscroller.js'); 64 | //console.log('result ',result) 65 | writeFile('dist/dom-autoscroller.min.js', result.code, onErrorCB('minify')); 66 | }catch(e){ 67 | console.log('minify error ', e) 68 | } 69 | 70 | }) 71 | }).catch(onErrorCB('script sources')); 72 | 73 | rollup.rollup({ 74 | entry: 'test/src.js', 75 | plugins: [ 76 | nodeResolve({ 77 | main: true 78 | }), 79 | commonjs(), 80 | buble() 81 | ] 82 | }).then(bundle=>{ 83 | //console.log('what') 84 | bundle.write({ 85 | dest: 'test/code.js', 86 | format: 'iife', 87 | sourceMap: true, 88 | moduleName: 'autoScroll' 89 | }); 90 | }).catch(onErrorCB('test code')); 91 | 92 | function onErrorCB(message){ 93 | return function(e){ 94 | if(e){ 95 | if(message) 96 | console.log(message); 97 | console.log(e); 98 | console.log(e.stack); 99 | } 100 | }; 101 | } 102 | -------------------------------------------------------------------------------- /test/index2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dom list test 5 | 6 | 12 | 13 | 14 | 15 |

A demonstration of using dom-autoscroller with the dragula library.

16 |

Drag the elements in the lists around. Holding the pointer (mouse/touch) near the edge of the element 17 | makes the element scroll.

18 |
19 |
    20 |
  1. zero
  2. 21 |
  3. one
  4. 22 |
  5. two
  6. 23 |
  7. three
  8. 24 |
  9. four
  10. 25 |
  11. five
  12. 26 |
  13. six
  14. 27 |
  15. seven
  16. 28 |
  17. eight
  18. 29 |
  19. nine
  20. 30 |
  21. ten
  22. 31 |
  23. eleven
  24. 32 |
  25. twelve
  26. 33 |
  27. thirteen
  28. 34 |
  29. fourteen
  30. 35 |
  31. fifteen
  32. 36 |
37 |
38 |
39 |
    40 |
  1. zero
  2. 41 |
  3. one
  4. 42 |
  5. two
  6. 43 |
  7. three
  8. 44 |
  9. four
  10. 45 |
  11. five
  12. 46 |
  13. six
  14. 47 |
  15. seven
  16. 48 |
  17. eight
  18. 49 |
  19. nine
  20. 50 |
  21. ten
  22. 51 |
  23. 11
  24. 52 |
  25. 12
  26. 53 |
  27. 13
  28. 54 |
  29. 14
  30. 55 |
  31. 15
  32. 56 |
57 |
58 | 59 | 60 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 39 | 41 | 42 | 44 | image/svg+xml 45 | 47 | 48 | 49 | 50 | 51 | 56 | 63 | 68 | 73 | 78 | 85 | 90 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | dom-autoscroller 2 | ================ 3 | 4 | ![dom autoscroller](logo.png) 5 | 6 | The syncMove option and synchronizing move 7 | ------------------------------------------ 8 | 9 | `dom-autoscroller` has a new option named syncMove. 10 | 11 | `syncMove` takes a boolean, or a function that returns a boolean, and the returned value of `syncMove` toggles the event synching of `dom-autoscroller`. 12 | 13 | Why do that? There are some situations where `dom-autoscroller` might be doing what it does, but even though the mouse cursor moves relative to the scroll position `mousemove` events do not get fired. When you set `syncMove` to true that allows `mousemove` events with fresh coordinates to be fired for some other source that might need those events. 14 | 15 | For now the option `syncMove` is set to false. This is for experimental purposes, and because this functionality is likely to be buggy. `touchmove` syncing is also planned, but it's best if the integration of move syncing be taken slow. Please leave plenty of issues to help integrate `syncMove`, and `mousemove` dispatch into `dom-autoscroller`. 16 | 17 | Once movement sync is fully integrated into `dom-autoscroller` the `syncMove` option might be set to default true, or removed entirely. It depends on how things work out down the line. 18 | 19 | Big Announcement! 20 | ----------------- 21 | 22 | Version 2 of dom-autoscroller is out. You can upgrade to version 2. 23 | 24 | Here are the differences. 25 | 26 | - **pixels option removed.** 27 | - maxSpeed option added. 28 | - Slightly different algorithm for scrolling 29 | - Scrolling speed changes dynamically based on distance from element edge 30 | - Compatibility with [rollup](https://github.com/rollup/rollup). 31 | 32 | Scrolling in dom-autoscroller is now much smoother. So you should upgrade to version 2. 33 | 34 | Install 35 | ------- 36 | 37 | **NPM** 38 | 39 | `npm install --save dom-autoscroller` 40 | 41 | **BOWER** 42 | 43 | `bower install --save dom-autoscroller` 44 | 45 | Then use browserify, webpack, or [rollup](https://github.com/rollup/rollup) to build your script. 46 | 47 | Or Download one of these files from the Github repo: 48 | 49 | - *dist/dom-autoscroller.js* 50 | - *dist/dom-autoscroller.min.js* 51 | 52 | If you use one of these prepackaged files the global name is **autoScroll**. 53 | 54 | Demo 55 | --- 56 | 57 | [jsfiddle Demo of dom-autoscroller](http://jsfiddle.net/gh/get/library/pure/hollowdoor/dom_autoscroller_demo/tree/master/Demo) 58 | 59 | 60 | Usage 61 | ----- 62 | 63 | This example uses [link-css](https://www.npmjs.com/package/link-css), and [dragula](https://www.npmjs.com/package/dragula). 64 | 65 | ```javascript 66 | require('link-css')('../node_modules/dragula/dist/dragula.min.css'); 67 | var dragula = require('dragula'), 68 | autoScroll = require('dom-autoscroller'); 69 | 70 | 71 | var drake = dragula([document.querySelector('#list'), document.querySelector('#hlist')]); 72 | var scroll = autoScroll([ 73 | document.querySelector('#list-container'), 74 | document.querySelector('#container2') 75 | ],{ 76 | margin: 20, 77 | maxSpeed: 5, 78 | scrollWhenOutside: true, 79 | autoScroll: function(){ 80 | //Only scroll when the pointer is down, and there is a child being dragged. 81 | return this.down && drake.dragging; 82 | } 83 | }); 84 | ``` 85 | 86 | Keep In Mind 87 | ------------ 88 | 89 | `dom-autoscroller` exploits the simplicity of the single parent, to child relationship. A scrolling element with more than one children will likely not work well with `dom-autoscroller`. 90 | 91 | For clarity here is a more complete example: 92 | 93 | ```html 94 | 95 | 96 | 97 | Drag test 98 | 106 | 107 | 108 |
109 |
    110 |
  1. zero
  2. 111 |
  3. one
  4. 112 |
  5. two
  6. 113 |
  7. three
  8. 114 |
  9. four
  10. 115 |
  11. five
  12. 116 |
  13. six
  14. 117 |
  15. seven
  16. 118 |
  17. eight
  18. 119 |
  19. nine
  20. 120 |
  21. ten
  22. 121 |
  23. eleven
  24. 122 |
  25. twelve
  26. 123 |
  27. thirteen
  28. 124 |
  29. fourteen
  30. 125 |
  31. fifteen
  32. 126 |
127 |
128 |
129 |
    130 |
  1. zero
  2. 131 |
  3. one
  4. 132 |
  5. two
  6. 133 |
  7. three
  8. 134 |
  9. four
  10. 135 |
  11. five
  12. 136 |
  13. six
  14. 137 |
  15. seven
  16. 138 |
  17. eight
  18. 139 |
  19. nine
  20. 140 |
  21. ten
  22. 141 |
  23. 11
  24. 142 |
  25. 12
  26. 143 |
  27. 13
  28. 144 |
  29. 14
  30. 145 |
  31. 15
  32. 146 |
147 |
148 | 168 | 169 | 170 | ``` 171 | 172 | If you look at the last example notice the containers have only one child, and that they're different from the containers used by *dragula*. In theory multiple children could work with `dom-autoscroller`, but the children scrolling might interfere with the workings of the library *dragula*. 173 | 174 | 175 | Auto Scroller API 176 | ----------------- 177 | 178 | ### autoScroll(element|elements, options) -> instance 179 | 180 | Create an auto scroller on an **element**, or and **array of elements**. 181 | 182 | **The element should have only one child element to work consistently.** 183 | 184 | #### options.margin = Integer 185 | 186 | An inner area to detect when the pointer is close to the edge. 187 | 188 | #### options.autoScroll = Function 189 | 190 | A callback function used to determine if the element should scroll, or when the element should scroll. 191 | 192 | Return a boolean value from this function to allow scrolling. 193 | 194 | #### options.maxSpeed = Integer 195 | 196 | `maxSpeed` defaults to 4. 197 | 198 | Speed effects in dom-autoscroller: 199 | 200 | 1. Speed adjusts dynamically depending on how close to the edge your pointer is. 201 | 2. Speed is pixels per frame. 202 | 203 | `maxSpeed` limits pixels per frame. 204 | 205 | #### options.pixels = Integer 206 | 207 | **removed in version 2** 208 | 209 | Set how many pixels per second you want to scroll during the auto scrolling action. More is smoother. 210 | 211 | Speed was **pixels/second** in version 1, and in version 2 speed is **pixels/frame**. 212 | 213 | #### options.scrollWhenOutside = Boolean 214 | 215 | Whther or not it should continue to scroll when the pointer is outside the container. Defaults to **false**. 216 | 217 | Auto Scroller Properties 218 | ------------------------ 219 | 220 | ### down = Boolean 221 | 222 | Is the pointer down? 223 | 224 | ### scrolling = Boolean 225 | 226 | Is one of the elements scrolling? 227 | 228 | ### point = Object 229 | 230 | **This reference no longer exists.** 231 | 232 | A reference to the [pointer](https://github.com/hollowdoor/pointer_point) object. 233 | 234 | Auto Scroller Methods 235 | --------------------- 236 | 237 | ### autoScroll 238 | 239 | The function you set in the constructor options for `options.autoScroll`. 240 | 241 | ### destroy(forceCleanAnimation) 242 | 243 | Remove all event listeners needed to be able to track the pointer. If destroy Auto Scroller meanwhile scrolling then just call `.destroy(true)` to force to stop scrolling animation. Call `.destroy()` and `.destroy(false)` is the same behaviours. 244 | 245 | Undocumented methods 246 | -------------------- 247 | 248 | There are undocumented methods in version 2. 249 | 250 | These are: 251 | 252 | 1. add() 253 | 2. remove() 254 | 255 | These methods add, or remove elements from dom-autoscroller. 256 | 257 | Why are these considered undocumented even though there here in the document? :) 258 | 259 | `add`, and `remove` are incomplete, and there is no detailed explanation. Use these methods at your own risk. 260 | 261 | About 262 | ----- 263 | 264 | There are tons of reasons to have auto scrolling. The main one being sometimes a finger can't reach the mouse wheel comfortably. `dom-autoscroller` is a comfort module. 265 | 266 | This is also a nice small module to do this kind of thing when auto scrolling is all you need. 267 | -------------------------------------------------------------------------------- /dist/dom-autoscroller.min.js: -------------------------------------------------------------------------------- 1 | var autoScroll=function(){"use strict";function e(e,n){return void 0===e?void 0===n?e:n:e}function n(n,t){return n=e(n,t),"function"==typeof n?function(){for(var e=arguments,t=arguments.length,r=Array(t),o=0;o0;)t[r]=n[r+1];return t=t.map(u),o(e,t)}function a(e){for(var n=arguments,r=[],o=arguments.length-1;o-- >0;)r[o]=n[o+1];return r.map(u).reduce(function(n,r){var o=t(e,r);return-1!==o?n.concat(e.splice(o,1)):n},[])}function u(e,n){if("string"==typeof e)try{return document.querySelector(e)}catch(e){throw e}if(!x(e)&&!n)throw new TypeError(e+" is not a DOM element.");return e}function c(e,t){t=t||{};var r=n(t.allowUpdate,!0);return function(n){if(n=n||window.event,e.target=n.target||n.srcElement||n.originalTarget,e.element=this,e.type=n.type,r(n)){if(n.targetTouches)e.x=n.targetTouches[0].clientX,e.y=n.targetTouches[0].clientY,e.pageX=n.targetTouches[0].pageX,e.pageY=n.targetTouches[0].pageY,e.screenX=n.targetTouches[0].screenX,e.screenY=n.targetTouches[0].screenY;else{if(null===n.pageX&&null!==n.clientX){var t=n.target&&n.target.ownerDocument||document,o=t.documentElement,i=t.body;e.pageX=n.clientX+(o&&o.scrollLeft||i&&i.scrollLeft||0)-(o&&o.clientLeft||i&&i.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||i&&i.scrollTop||0)-(o&&o.clientTop||i&&i.clientTop||0)}else e.pageX=n.pageX,e.pageY=n.pageY;e.x=n.clientX,e.y=n.clientY,e.screenX=n.screenX,e.screenY=n.screenY}e.clientX=e.x,e.clientY=e.y}}}function l(){var e={top:{value:0,enumerable:!0},left:{value:0,enumerable:!0},right:{value:window.innerWidth,enumerable:!0},bottom:{value:window.innerHeight,enumerable:!0},width:{value:window.innerWidth,enumerable:!0},height:{value:window.innerHeight,enumerable:!0},x:{value:0,enumerable:!0},y:{value:0,enumerable:!0}};if(Object.create)return Object.create({},e);var n={};return Object.defineProperties(n,e),n}function f(e){if(e===window)return l();try{var n=e.getBoundingClientRect();return void 0===n.x&&(n.x=n.left,n.y=n.top),n}catch(n){throw new TypeError("Can't call getBoundingClientRect on "+e)}}function d(e,n){var t=f(n);return e.y>t.top&&e.yt.left&&e.xr.right-X.margin?Math.ceil(Math.min(1,(O.x-r.right)/X.margin+1)*X.maxSpeed):0,t=O.yr.bottom-X.margin?Math.ceil(Math.min(1,(O.y-r.bottom)/X.margin+1)*X.maxSpeed):0,X.syncMove()&&j.dispatch(e,{pageX:O.pageX+n,pageY:O.pageY+t,clientX:O.x+n,clientY:O.y+t}),setTimeout(function(){t&&x(e,t),n&&L(e,n)})}function x(e,n){e===window?window.scrollTo(e.pageXOffset,e.pageYOffset+n):e.scrollTop+=n}function L(e,n){e===window?window.scrollTo(e.pageXOffset+n,e.pageYOffset):e.scrollLeft+=n}void 0===t&&(t={});var X=this,Y=4,A=!1;this.margin=t.margin||-1,this.scrollWhenOutside=t.scrollWhenOutside||!1;var O={},S=c(O),j=s(),M=!1;window.addEventListener("mousemove",S,!1),window.addEventListener("touchmove",S,!1),isNaN(t.maxSpeed)||(Y=t.maxSpeed),this.autoScroll=n(t.autoScroll),this.syncMove=n(t.syncMove,!1),this.destroy=function(n){window.removeEventListener("mousemove",S,!1),window.removeEventListener("touchmove",S,!1),window.removeEventListener("mousedown",u,!1),window.removeEventListener("touchstart",u,!1),window.removeEventListener("mouseup",l,!1),window.removeEventListener("touchend",l,!1),window.removeEventListener("pointerup",l,!1),window.removeEventListener("mouseleave",m,!1),window.removeEventListener("mousemove",p,!1),window.removeEventListener("touchmove",p,!1),window.removeEventListener("scroll",o,!0),e=[],n&&d()},this.add=function(){for(var n=[],t=arguments.length;t--;)n[t]=arguments[t];return i.apply(void 0,[e].concat(n)),this},this.remove=function(){for(var n=[],t=arguments.length;t--;)n[t]=arguments[t];return a.apply(void 0,[e].concat(n))};var F,K=null;"[object Array]"!==Object.prototype.toString.call(e)&&(e=[e]),function(n){e=[],n.forEach(function(e){e===window?K=window:X.add(e)})}(e),Object.defineProperties(this,{down:{get:function(){return M}},maxSpeed:{get:function(){return Y}},point:{get:function(){return O}},scrolling:{get:function(){return A}}});var q,N=null;window.addEventListener("mousedown",u,!1),window.addEventListener("touchstart",u,!1),window.addEventListener("mouseup",l,!1),window.addEventListener("touchend",l,!1),window.addEventListener("pointerup",l,!1),window.addEventListener("mousemove",p,!1),window.addEventListener("touchmove",p,!1),window.addEventListener("mouseleave",m,!1),window.addEventListener("scroll",o,!0)}function p(e,n){return new w(e,n)}function h(e,n,t){return t?e.y>t.top&&e.yt.left&&e.x0?1:-1)*Math.floor(Math.abs(n)):n},t=Math.pow(2,53)-1,r=function(e){var r=n(e);return Math.min(Math.max(r,0),t)},o=function(e){if(null!=e){if(["string","number","boolean","symbol"].indexOf(typeof e)>-1)return Symbol.iterator;if("undefined"!=typeof Symbol&&"iterator"in Symbol&&Symbol.iterator in e)return Symbol.iterator;if("@@iterator"in e)return"@@iterator"}},i=function(n,t){if(null!=n&&null!=t){var r=n[t];if(null==r)return;if(!e(r))throw new TypeError(r+" is not a function");return r}},a=function(e){var n=e.next();return!Boolean(n.done)&&n};return function(n){var t,u=this,c=arguments.length>1?arguments[1]:void 0;if(void 0!==c){if(!e(c))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(t=arguments[2])}var l,f,d=i(n,o(n));if(void 0!==d){l=e(u)?Object(new u):[];var s=d.call(n);if(null==s)throw new TypeError("Array.from requires an array-like or iterable object");f=0;for(var m,v;;){if(!(m=a(s)))return l.length=f,l;v=m.value,l[f]=c?c.call(t,v,f):v,f++}}else{var w=Object(n);if(null==n)throw new TypeError("Array.from requires an array-like object - not null or undefined");var p=r(w.length);l=e(u)?Object(new u(p)):new Array(p),f=0;for(var h;fscrolling = false) 137 | } 138 | } 139 | 140 | function onDown(){ 141 | down = true; 142 | } 143 | 144 | function onUp(){ 145 | down = false; 146 | cleanAnimation(); 147 | } 148 | function cleanAnimation(){ 149 | cancelFrame(animationFrame); 150 | cancelFrame(windowAnimationFrame); 151 | } 152 | function onMouseOut(){ 153 | down = false; 154 | } 155 | 156 | function getTarget(target){ 157 | if(!target){ 158 | return null; 159 | } 160 | 161 | if(current === target){ 162 | return target; 163 | } 164 | 165 | if(hasElement(elements, target)){ 166 | return target; 167 | } 168 | 169 | while(target = target.parentNode){ 170 | if(hasElement(elements, target)){ 171 | return target; 172 | } 173 | } 174 | 175 | return null; 176 | } 177 | 178 | function getElementUnderPoint(){ 179 | let underPoint = null; 180 | 181 | for(var i=0; i rect.right - self.margin){ 264 | scrollx = Math.ceil( 265 | Math.min(1, (point.x - rect.right) / self.margin + 1) * self.maxSpeed 266 | ); 267 | }else{ 268 | scrollx = 0; 269 | } 270 | 271 | if(point.y < rect.top + self.margin){ 272 | scrolly = Math.floor( 273 | Math.max(-1, (point.y - rect.top) / self.margin - 1) * self.maxSpeed 274 | ); 275 | }else if(point.y > rect.bottom - self.margin){ 276 | scrolly = Math.ceil( 277 | Math.min(1, (point.y - rect.bottom) / self.margin + 1) * self.maxSpeed 278 | ); 279 | }else{ 280 | scrolly = 0; 281 | } 282 | 283 | if(self.syncMove()){ 284 | /* 285 | Notes about mousemove event dispatch. 286 | screen(X/Y) should need to be updated. 287 | Some other properties might need to be set. 288 | Keep the syncMove option default false until all inconsistencies are taken care of. 289 | */ 290 | dispatcher.dispatch(el, { 291 | pageX: point.pageX + scrollx, 292 | pageY: point.pageY + scrolly, 293 | clientX: point.x + scrollx, 294 | clientY: point.y + scrolly 295 | }); 296 | } 297 | 298 | setTimeout(()=>{ 299 | 300 | if(scrolly){ 301 | scrollY(el, scrolly); 302 | } 303 | 304 | if(scrollx){ 305 | scrollX(el, scrollx); 306 | } 307 | 308 | }); 309 | } 310 | 311 | function scrollY(el, amount){ 312 | if(el === window){ 313 | window.scrollTo(el.pageXOffset, el.pageYOffset + amount); 314 | }else{ 315 | el.scrollTop += amount; 316 | } 317 | } 318 | 319 | function scrollX(el, amount){ 320 | if(el === window){ 321 | window.scrollTo(el.pageXOffset + amount, el.pageYOffset); 322 | }else{ 323 | el.scrollLeft += amount; 324 | } 325 | } 326 | 327 | } 328 | 329 | export default function AutoScrollerFactory(element, options){ 330 | return new AutoScroller(element, options); 331 | } 332 | 333 | function inside(point, el, rect){ 334 | if(!rect){ 335 | return pointInside(point, el); 336 | }else{ 337 | return (point.y > rect.top && point.y < rect.bottom && 338 | point.x > rect.left && point.x < rect.right); 339 | } 340 | } 341 | 342 | /* 343 | git remote add origin https://github.com/hollowdoor/dom_autoscroller.git 344 | git push -u origin master 345 | */ 346 | -------------------------------------------------------------------------------- /dist/bundle.es.js: -------------------------------------------------------------------------------- 1 | import { boolean } from 'type-func'; 2 | import { cancelAnimationFrame, requestAnimationFrame } from 'animation-frame-polyfill'; 3 | import { addElements, hasElement, removeElements } from 'dom-set'; 4 | import { createPointCB, getClientRect, pointInside } from 'dom-plane'; 5 | import mousemoveDispatcher from 'dom-mousemove-dispatcher'; 6 | 7 | function AutoScroller(elements, options){ 8 | if ( options === void 0 ) options = {}; 9 | 10 | var self = this; 11 | var maxSpeed = 4, scrolling = false; 12 | 13 | this.margin = options.margin || -1; 14 | //this.scrolling = false; 15 | this.scrollWhenOutside = options.scrollWhenOutside || false; 16 | 17 | var point = {}, 18 | pointCB = createPointCB(point), 19 | dispatcher = mousemoveDispatcher(), 20 | down = false; 21 | 22 | window.addEventListener('mousemove', pointCB, false); 23 | window.addEventListener('touchmove', pointCB, false); 24 | 25 | if(!isNaN(options.maxSpeed)){ 26 | maxSpeed = options.maxSpeed; 27 | } 28 | 29 | this.autoScroll = boolean(options.autoScroll); 30 | this.syncMove = boolean(options.syncMove, false); 31 | 32 | this.destroy = function(forceCleanAnimation) { 33 | window.removeEventListener('mousemove', pointCB, false); 34 | window.removeEventListener('touchmove', pointCB, false); 35 | window.removeEventListener('mousedown', onDown, false); 36 | window.removeEventListener('touchstart', onDown, false); 37 | window.removeEventListener('mouseup', onUp, false); 38 | window.removeEventListener('touchend', onUp, false); 39 | window.removeEventListener('pointerup', onUp, false); 40 | window.removeEventListener('mouseleave', onMouseOut, false); 41 | 42 | window.removeEventListener('mousemove', onMove, false); 43 | window.removeEventListener('touchmove', onMove, false); 44 | 45 | window.removeEventListener('scroll', setScroll, true); 46 | elements = []; 47 | if(forceCleanAnimation){ 48 | cleanAnimation(); 49 | } 50 | }; 51 | 52 | this.add = function(){ 53 | var element = [], len = arguments.length; 54 | while ( len-- ) element[ len ] = arguments[ len ]; 55 | 56 | addElements.apply(void 0, [ elements ].concat( element )); 57 | return this; 58 | }; 59 | 60 | this.remove = function(){ 61 | var element = [], len = arguments.length; 62 | while ( len-- ) element[ len ] = arguments[ len ]; 63 | 64 | return removeElements.apply(void 0, [ elements ].concat( element )); 65 | }; 66 | 67 | var hasWindow = null, windowAnimationFrame; 68 | 69 | if(Object.prototype.toString.call(elements) !== '[object Array]'){ 70 | elements = [elements]; 71 | } 72 | 73 | (function(temp){ 74 | elements = []; 75 | temp.forEach(function(element){ 76 | if(element === window){ 77 | hasWindow = window; 78 | }else{ 79 | self.add(element); 80 | } 81 | }); 82 | }(elements)); 83 | 84 | Object.defineProperties(this, { 85 | down: { 86 | get: function(){ return down; } 87 | }, 88 | maxSpeed: { 89 | get: function(){ return maxSpeed; } 90 | }, 91 | point: { 92 | get: function(){ return point; } 93 | }, 94 | scrolling: { 95 | get: function(){ return scrolling; } 96 | } 97 | }); 98 | 99 | var n = 0, current = null, animationFrame; 100 | 101 | window.addEventListener('mousedown', onDown, false); 102 | window.addEventListener('touchstart', onDown, false); 103 | window.addEventListener('mouseup', onUp, false); 104 | window.addEventListener('touchend', onUp, false); 105 | 106 | /* 107 | IE does not trigger mouseup event when scrolling. 108 | It is a known issue that Microsoft won't fix. 109 | https://connect.microsoft.com/IE/feedback/details/783058/scrollbar-trigger-mousedown-but-not-mouseup 110 | IE supports pointer events instead 111 | */ 112 | window.addEventListener('pointerup', onUp, false); 113 | 114 | window.addEventListener('mousemove', onMove, false); 115 | window.addEventListener('touchmove', onMove, false); 116 | 117 | window.addEventListener('mouseleave', onMouseOut, false); 118 | 119 | window.addEventListener('scroll', setScroll, true); 120 | 121 | function setScroll(e){ 122 | 123 | for(var i=0; i rect.right - self.margin){ 259 | scrollx = Math.ceil( 260 | Math.min(1, (point.x - rect.right) / self.margin + 1) * self.maxSpeed 261 | ); 262 | }else{ 263 | scrollx = 0; 264 | } 265 | 266 | if(point.y < rect.top + self.margin){ 267 | scrolly = Math.floor( 268 | Math.max(-1, (point.y - rect.top) / self.margin - 1) * self.maxSpeed 269 | ); 270 | }else if(point.y > rect.bottom - self.margin){ 271 | scrolly = Math.ceil( 272 | Math.min(1, (point.y - rect.bottom) / self.margin + 1) * self.maxSpeed 273 | ); 274 | }else{ 275 | scrolly = 0; 276 | } 277 | 278 | if(self.syncMove()){ 279 | /* 280 | Notes about mousemove event dispatch. 281 | screen(X/Y) should need to be updated. 282 | Some other properties might need to be set. 283 | Keep the syncMove option default false until all inconsistencies are taken care of. 284 | */ 285 | dispatcher.dispatch(el, { 286 | pageX: point.pageX + scrollx, 287 | pageY: point.pageY + scrolly, 288 | clientX: point.x + scrollx, 289 | clientY: point.y + scrolly 290 | }); 291 | } 292 | 293 | setTimeout(function (){ 294 | 295 | if(scrolly){ 296 | scrollY(el, scrolly); 297 | } 298 | 299 | if(scrollx){ 300 | scrollX(el, scrollx); 301 | } 302 | 303 | }); 304 | } 305 | 306 | function scrollY(el, amount){ 307 | if(el === window){ 308 | window.scrollTo(el.pageXOffset, el.pageYOffset + amount); 309 | }else{ 310 | el.scrollTop += amount; 311 | } 312 | } 313 | 314 | function scrollX(el, amount){ 315 | if(el === window){ 316 | window.scrollTo(el.pageXOffset + amount, el.pageYOffset); 317 | }else{ 318 | el.scrollLeft += amount; 319 | } 320 | } 321 | 322 | } 323 | 324 | function AutoScrollerFactory(element, options){ 325 | return new AutoScroller(element, options); 326 | } 327 | 328 | function inside(point, el, rect){ 329 | if(!rect){ 330 | return pointInside(point, el); 331 | }else{ 332 | return (point.y > rect.top && point.y < rect.bottom && 333 | point.x > rect.left && point.x < rect.right); 334 | } 335 | } 336 | 337 | /* 338 | git remote add origin https://github.com/hollowdoor/dom_autoscroller.git 339 | git push -u origin master 340 | */ 341 | 342 | export default AutoScrollerFactory; 343 | //# sourceMappingURL=bundle.es.js.map 344 | -------------------------------------------------------------------------------- /dist/bundle.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } 4 | 5 | var typeFunc = require('type-func'); 6 | var animationFramePolyfill = require('animation-frame-polyfill'); 7 | var domSet = require('dom-set'); 8 | var domPlane = require('dom-plane'); 9 | var mousemoveDispatcher = _interopDefault(require('dom-mousemove-dispatcher')); 10 | 11 | function AutoScroller(elements, options){ 12 | if ( options === void 0 ) options = {}; 13 | 14 | var self = this; 15 | var maxSpeed = 4, scrolling = false; 16 | 17 | this.margin = options.margin || -1; 18 | //this.scrolling = false; 19 | this.scrollWhenOutside = options.scrollWhenOutside || false; 20 | 21 | var point = {}, 22 | pointCB = domPlane.createPointCB(point), 23 | dispatcher = mousemoveDispatcher(), 24 | down = false; 25 | 26 | window.addEventListener('mousemove', pointCB, false); 27 | window.addEventListener('touchmove', pointCB, false); 28 | 29 | if(!isNaN(options.maxSpeed)){ 30 | maxSpeed = options.maxSpeed; 31 | } 32 | 33 | this.autoScroll = typeFunc.boolean(options.autoScroll); 34 | this.syncMove = typeFunc.boolean(options.syncMove, false); 35 | 36 | this.destroy = function(forceCleanAnimation) { 37 | window.removeEventListener('mousemove', pointCB, false); 38 | window.removeEventListener('touchmove', pointCB, false); 39 | window.removeEventListener('mousedown', onDown, false); 40 | window.removeEventListener('touchstart', onDown, false); 41 | window.removeEventListener('mouseup', onUp, false); 42 | window.removeEventListener('touchend', onUp, false); 43 | window.removeEventListener('pointerup', onUp, false); 44 | window.removeEventListener('mouseleave', onMouseOut, false); 45 | 46 | window.removeEventListener('mousemove', onMove, false); 47 | window.removeEventListener('touchmove', onMove, false); 48 | 49 | window.removeEventListener('scroll', setScroll, true); 50 | elements = []; 51 | if(forceCleanAnimation){ 52 | cleanAnimation(); 53 | } 54 | }; 55 | 56 | this.add = function(){ 57 | var element = [], len = arguments.length; 58 | while ( len-- ) element[ len ] = arguments[ len ]; 59 | 60 | domSet.addElements.apply(void 0, [ elements ].concat( element )); 61 | return this; 62 | }; 63 | 64 | this.remove = function(){ 65 | var element = [], len = arguments.length; 66 | while ( len-- ) element[ len ] = arguments[ len ]; 67 | 68 | return domSet.removeElements.apply(void 0, [ elements ].concat( element )); 69 | }; 70 | 71 | var hasWindow = null, windowAnimationFrame; 72 | 73 | if(Object.prototype.toString.call(elements) !== '[object Array]'){ 74 | elements = [elements]; 75 | } 76 | 77 | (function(temp){ 78 | elements = []; 79 | temp.forEach(function(element){ 80 | if(element === window){ 81 | hasWindow = window; 82 | }else{ 83 | self.add(element); 84 | } 85 | }); 86 | }(elements)); 87 | 88 | Object.defineProperties(this, { 89 | down: { 90 | get: function(){ return down; } 91 | }, 92 | maxSpeed: { 93 | get: function(){ return maxSpeed; } 94 | }, 95 | point: { 96 | get: function(){ return point; } 97 | }, 98 | scrolling: { 99 | get: function(){ return scrolling; } 100 | } 101 | }); 102 | 103 | var n = 0, current = null, animationFrame; 104 | 105 | window.addEventListener('mousedown', onDown, false); 106 | window.addEventListener('touchstart', onDown, false); 107 | window.addEventListener('mouseup', onUp, false); 108 | window.addEventListener('touchend', onUp, false); 109 | 110 | /* 111 | IE does not trigger mouseup event when scrolling. 112 | It is a known issue that Microsoft won't fix. 113 | https://connect.microsoft.com/IE/feedback/details/783058/scrollbar-trigger-mousedown-but-not-mouseup 114 | IE supports pointer events instead 115 | */ 116 | window.addEventListener('pointerup', onUp, false); 117 | 118 | window.addEventListener('mousemove', onMove, false); 119 | window.addEventListener('touchmove', onMove, false); 120 | 121 | window.addEventListener('mouseleave', onMouseOut, false); 122 | 123 | window.addEventListener('scroll', setScroll, true); 124 | 125 | function setScroll(e){ 126 | 127 | for(var i=0; i rect.right - self.margin){ 263 | scrollx = Math.ceil( 264 | Math.min(1, (point.x - rect.right) / self.margin + 1) * self.maxSpeed 265 | ); 266 | }else{ 267 | scrollx = 0; 268 | } 269 | 270 | if(point.y < rect.top + self.margin){ 271 | scrolly = Math.floor( 272 | Math.max(-1, (point.y - rect.top) / self.margin - 1) * self.maxSpeed 273 | ); 274 | }else if(point.y > rect.bottom - self.margin){ 275 | scrolly = Math.ceil( 276 | Math.min(1, (point.y - rect.bottom) / self.margin + 1) * self.maxSpeed 277 | ); 278 | }else{ 279 | scrolly = 0; 280 | } 281 | 282 | if(self.syncMove()){ 283 | /* 284 | Notes about mousemove event dispatch. 285 | screen(X/Y) should need to be updated. 286 | Some other properties might need to be set. 287 | Keep the syncMove option default false until all inconsistencies are taken care of. 288 | */ 289 | dispatcher.dispatch(el, { 290 | pageX: point.pageX + scrollx, 291 | pageY: point.pageY + scrolly, 292 | clientX: point.x + scrollx, 293 | clientY: point.y + scrolly 294 | }); 295 | } 296 | 297 | setTimeout(function (){ 298 | 299 | if(scrolly){ 300 | scrollY(el, scrolly); 301 | } 302 | 303 | if(scrollx){ 304 | scrollX(el, scrollx); 305 | } 306 | 307 | }); 308 | } 309 | 310 | function scrollY(el, amount){ 311 | if(el === window){ 312 | window.scrollTo(el.pageXOffset, el.pageYOffset + amount); 313 | }else{ 314 | el.scrollTop += amount; 315 | } 316 | } 317 | 318 | function scrollX(el, amount){ 319 | if(el === window){ 320 | window.scrollTo(el.pageXOffset + amount, el.pageYOffset); 321 | }else{ 322 | el.scrollLeft += amount; 323 | } 324 | } 325 | 326 | } 327 | 328 | function AutoScrollerFactory(element, options){ 329 | return new AutoScroller(element, options); 330 | } 331 | 332 | function inside(point, el, rect){ 333 | if(!rect){ 334 | return domPlane.pointInside(point, el); 335 | }else{ 336 | return (point.y > rect.top && point.y < rect.bottom && 337 | point.x > rect.left && point.x < rect.right); 338 | } 339 | } 340 | 341 | /* 342 | git remote add origin https://github.com/hollowdoor/dom_autoscroller.git 343 | git push -u origin master 344 | */ 345 | 346 | module.exports = AutoScrollerFactory; 347 | //# sourceMappingURL=bundle.js.map 348 | -------------------------------------------------------------------------------- /dist/bundle.es.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"bundle.es.js","sources":["../src/index.js"],"sourcesContent":["import {boolean} from 'type-func';\r\nimport {\r\n requestAnimationFrame as requestFrame,\r\n cancelAnimationFrame as cancelFrame\r\n} from 'animation-frame-polyfill';\r\nimport {\r\n hasElement,\r\n addElements,\r\n removeElements\r\n} from 'dom-set';\r\n\r\nimport {\r\n createPointCB,\r\n getClientRect as getRect,\r\n pointInside\r\n} from 'dom-plane';\r\n\r\nimport mousemoveDispatcher from 'dom-mousemove-dispatcher';\r\n\r\nfunction AutoScroller(elements, options = {}){\r\n const self = this;\r\n let maxSpeed = 4, scrolling = false;\r\n\r\n this.margin = options.margin || -1;\r\n //this.scrolling = false;\r\n this.scrollWhenOutside = options.scrollWhenOutside || false;\r\n\r\n let point = {},\r\n pointCB = createPointCB(point),\r\n dispatcher = mousemoveDispatcher(),\r\n down = false;\r\n\r\n window.addEventListener('mousemove', pointCB, false);\r\n window.addEventListener('touchmove', pointCB, false);\r\n\r\n if(!isNaN(options.maxSpeed)){\r\n maxSpeed = options.maxSpeed;\r\n }\r\n\r\n this.autoScroll = boolean(options.autoScroll);\r\n this.syncMove = boolean(options.syncMove, false);\r\n\r\n this.destroy = function(forceCleanAnimation) {\r\n window.removeEventListener('mousemove', pointCB, false);\r\n window.removeEventListener('touchmove', pointCB, false);\r\n window.removeEventListener('mousedown', onDown, false);\r\n window.removeEventListener('touchstart', onDown, false);\r\n window.removeEventListener('mouseup', onUp, false);\r\n window.removeEventListener('touchend', onUp, false);\r\n window.removeEventListener('pointerup', onUp, false);\r\n window.removeEventListener('mouseleave', onMouseOut, false);\r\n\r\n window.removeEventListener('mousemove', onMove, false);\r\n window.removeEventListener('touchmove', onMove, false);\r\n\r\n window.removeEventListener('scroll', setScroll, true);\r\n elements = [];\r\n if(forceCleanAnimation){\r\n cleanAnimation();\r\n }\r\n };\r\n\r\n this.add = function(...element){\r\n addElements(elements, ...element);\r\n return this;\r\n };\r\n\r\n this.remove = function(...element){\r\n return removeElements(elements, ...element);\r\n };\r\n\r\n let hasWindow = null, windowAnimationFrame;\r\n\r\n if(Object.prototype.toString.call(elements) !== '[object Array]'){\r\n elements = [elements];\r\n }\r\n\r\n (function(temp){\r\n elements = [];\r\n temp.forEach(function(element){\r\n if(element === window){\r\n hasWindow = window;\r\n }else{\r\n self.add(element);\r\n }\r\n })\r\n }(elements));\r\n\r\n Object.defineProperties(this, {\r\n down: {\r\n get: function(){ return down; }\r\n },\r\n maxSpeed: {\r\n get: function(){ return maxSpeed; }\r\n },\r\n point: {\r\n get: function(){ return point; }\r\n },\r\n scrolling: {\r\n get: function(){ return scrolling; }\r\n }\r\n });\r\n\r\n let n = 0, current = null, animationFrame;\r\n\r\n window.addEventListener('mousedown', onDown, false);\r\n window.addEventListener('touchstart', onDown, false);\r\n window.addEventListener('mouseup', onUp, false);\r\n window.addEventListener('touchend', onUp, false);\r\n\r\n /*\r\n IE does not trigger mouseup event when scrolling.\r\n It is a known issue that Microsoft won't fix.\r\n https://connect.microsoft.com/IE/feedback/details/783058/scrollbar-trigger-mousedown-but-not-mouseup\r\n IE supports pointer events instead\r\n */\r\n window.addEventListener('pointerup', onUp, false);\r\n\r\n window.addEventListener('mousemove', onMove, false);\r\n window.addEventListener('touchmove', onMove, false);\r\n\r\n window.addEventListener('mouseleave', onMouseOut, false);\r\n\r\n window.addEventListener('scroll', setScroll, true);\r\n\r\n function setScroll(e){\r\n\r\n for(let i=0; iscrolling = false)\r\n }\r\n }\r\n\r\n function onDown(){\r\n down = true;\r\n }\r\n\r\n function onUp(){\r\n down = false;\r\n cleanAnimation();\r\n }\r\n function cleanAnimation(){\r\n cancelFrame(animationFrame);\r\n cancelFrame(windowAnimationFrame);\r\n }\r\n function onMouseOut(){\r\n down = false;\r\n }\r\n\r\n function getTarget(target){\r\n if(!target){\r\n return null;\r\n }\r\n\r\n if(current === target){\r\n return target;\r\n }\r\n\r\n if(hasElement(elements, target)){\r\n return target;\r\n }\r\n\r\n while(target = target.parentNode){\r\n if(hasElement(elements, target)){\r\n return target;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function getElementUnderPoint(){\r\n let underPoint = null;\r\n\r\n for(var i=0; i rect.right - self.margin){\r\n scrollx = Math.ceil(\r\n Math.min(1, (point.x - rect.right) / self.margin + 1) * self.maxSpeed\r\n );\r\n }else{\r\n scrollx = 0;\r\n }\r\n\r\n if(point.y < rect.top + self.margin){\r\n scrolly = Math.floor(\r\n Math.max(-1, (point.y - rect.top) / self.margin - 1) * self.maxSpeed\r\n );\r\n }else if(point.y > rect.bottom - self.margin){\r\n scrolly = Math.ceil(\r\n Math.min(1, (point.y - rect.bottom) / self.margin + 1) * self.maxSpeed\r\n );\r\n }else{\r\n scrolly = 0;\r\n }\r\n\r\n if(self.syncMove()){\r\n /*\r\n Notes about mousemove event dispatch.\r\n screen(X/Y) should need to be updated.\r\n Some other properties might need to be set.\r\n Keep the syncMove option default false until all inconsistencies are taken care of.\r\n */\r\n dispatcher.dispatch(el, {\r\n pageX: point.pageX + scrollx,\r\n pageY: point.pageY + scrolly,\r\n clientX: point.x + scrollx,\r\n clientY: point.y + scrolly\r\n });\r\n }\r\n\r\n setTimeout(()=>{\r\n\r\n if(scrolly){\r\n scrollY(el, scrolly);\r\n }\r\n\r\n if(scrollx){\r\n scrollX(el, scrollx);\r\n }\r\n\r\n });\r\n }\r\n\r\n function scrollY(el, amount){\r\n if(el === window){\r\n window.scrollTo(el.pageXOffset, el.pageYOffset + amount);\r\n }else{\r\n el.scrollTop += amount;\r\n }\r\n }\r\n\r\n function scrollX(el, amount){\r\n if(el === window){\r\n window.scrollTo(el.pageXOffset + amount, el.pageYOffset);\r\n }else{\r\n el.scrollLeft += amount;\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default function AutoScrollerFactory(element, options){\r\n return new AutoScroller(element, options);\r\n}\r\n\r\nfunction inside(point, el, rect){\r\n if(!rect){\r\n return pointInside(point, el);\r\n }else{\r\n return (point.y > rect.top && point.y < rect.bottom &&\r\n point.x > rect.left && point.x < rect.right);\r\n }\r\n}\r\n\r\n/*\r\ngit remote add origin https://github.com/hollowdoor/dom_autoscroller.git\r\ngit push -u origin master\r\n*/\r\n"],"names":["const","let","requestFrame","cancelFrame","getRect"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/bundle.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"bundle.js","sources":["../src/index.js"],"sourcesContent":["import {boolean} from 'type-func';\r\nimport {\r\n requestAnimationFrame as requestFrame,\r\n cancelAnimationFrame as cancelFrame\r\n} from 'animation-frame-polyfill';\r\nimport {\r\n hasElement,\r\n addElements,\r\n removeElements\r\n} from 'dom-set';\r\n\r\nimport {\r\n createPointCB,\r\n getClientRect as getRect,\r\n pointInside\r\n} from 'dom-plane';\r\n\r\nimport mousemoveDispatcher from 'dom-mousemove-dispatcher';\r\n\r\nfunction AutoScroller(elements, options = {}){\r\n const self = this;\r\n let maxSpeed = 4, scrolling = false;\r\n\r\n this.margin = options.margin || -1;\r\n //this.scrolling = false;\r\n this.scrollWhenOutside = options.scrollWhenOutside || false;\r\n\r\n let point = {},\r\n pointCB = createPointCB(point),\r\n dispatcher = mousemoveDispatcher(),\r\n down = false;\r\n\r\n window.addEventListener('mousemove', pointCB, false);\r\n window.addEventListener('touchmove', pointCB, false);\r\n\r\n if(!isNaN(options.maxSpeed)){\r\n maxSpeed = options.maxSpeed;\r\n }\r\n\r\n this.autoScroll = boolean(options.autoScroll);\r\n this.syncMove = boolean(options.syncMove, false);\r\n\r\n this.destroy = function(forceCleanAnimation) {\r\n window.removeEventListener('mousemove', pointCB, false);\r\n window.removeEventListener('touchmove', pointCB, false);\r\n window.removeEventListener('mousedown', onDown, false);\r\n window.removeEventListener('touchstart', onDown, false);\r\n window.removeEventListener('mouseup', onUp, false);\r\n window.removeEventListener('touchend', onUp, false);\r\n window.removeEventListener('pointerup', onUp, false);\r\n window.removeEventListener('mouseleave', onMouseOut, false);\r\n\r\n window.removeEventListener('mousemove', onMove, false);\r\n window.removeEventListener('touchmove', onMove, false);\r\n\r\n window.removeEventListener('scroll', setScroll, true);\r\n elements = [];\r\n if(forceCleanAnimation){\r\n cleanAnimation();\r\n }\r\n };\r\n\r\n this.add = function(...element){\r\n addElements(elements, ...element);\r\n return this;\r\n };\r\n\r\n this.remove = function(...element){\r\n return removeElements(elements, ...element);\r\n };\r\n\r\n let hasWindow = null, windowAnimationFrame;\r\n\r\n if(Object.prototype.toString.call(elements) !== '[object Array]'){\r\n elements = [elements];\r\n }\r\n\r\n (function(temp){\r\n elements = [];\r\n temp.forEach(function(element){\r\n if(element === window){\r\n hasWindow = window;\r\n }else{\r\n self.add(element);\r\n }\r\n })\r\n }(elements));\r\n\r\n Object.defineProperties(this, {\r\n down: {\r\n get: function(){ return down; }\r\n },\r\n maxSpeed: {\r\n get: function(){ return maxSpeed; }\r\n },\r\n point: {\r\n get: function(){ return point; }\r\n },\r\n scrolling: {\r\n get: function(){ return scrolling; }\r\n }\r\n });\r\n\r\n let n = 0, current = null, animationFrame;\r\n\r\n window.addEventListener('mousedown', onDown, false);\r\n window.addEventListener('touchstart', onDown, false);\r\n window.addEventListener('mouseup', onUp, false);\r\n window.addEventListener('touchend', onUp, false);\r\n\r\n /*\r\n IE does not trigger mouseup event when scrolling.\r\n It is a known issue that Microsoft won't fix.\r\n https://connect.microsoft.com/IE/feedback/details/783058/scrollbar-trigger-mousedown-but-not-mouseup\r\n IE supports pointer events instead\r\n */\r\n window.addEventListener('pointerup', onUp, false);\r\n\r\n window.addEventListener('mousemove', onMove, false);\r\n window.addEventListener('touchmove', onMove, false);\r\n\r\n window.addEventListener('mouseleave', onMouseOut, false);\r\n\r\n window.addEventListener('scroll', setScroll, true);\r\n\r\n function setScroll(e){\r\n\r\n for(let i=0; iscrolling = false)\r\n }\r\n }\r\n\r\n function onDown(){\r\n down = true;\r\n }\r\n\r\n function onUp(){\r\n down = false;\r\n cleanAnimation();\r\n }\r\n function cleanAnimation(){\r\n cancelFrame(animationFrame);\r\n cancelFrame(windowAnimationFrame);\r\n }\r\n function onMouseOut(){\r\n down = false;\r\n }\r\n\r\n function getTarget(target){\r\n if(!target){\r\n return null;\r\n }\r\n\r\n if(current === target){\r\n return target;\r\n }\r\n\r\n if(hasElement(elements, target)){\r\n return target;\r\n }\r\n\r\n while(target = target.parentNode){\r\n if(hasElement(elements, target)){\r\n return target;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function getElementUnderPoint(){\r\n let underPoint = null;\r\n\r\n for(var i=0; i rect.right - self.margin){\r\n scrollx = Math.ceil(\r\n Math.min(1, (point.x - rect.right) / self.margin + 1) * self.maxSpeed\r\n );\r\n }else{\r\n scrollx = 0;\r\n }\r\n\r\n if(point.y < rect.top + self.margin){\r\n scrolly = Math.floor(\r\n Math.max(-1, (point.y - rect.top) / self.margin - 1) * self.maxSpeed\r\n );\r\n }else if(point.y > rect.bottom - self.margin){\r\n scrolly = Math.ceil(\r\n Math.min(1, (point.y - rect.bottom) / self.margin + 1) * self.maxSpeed\r\n );\r\n }else{\r\n scrolly = 0;\r\n }\r\n\r\n if(self.syncMove()){\r\n /*\r\n Notes about mousemove event dispatch.\r\n screen(X/Y) should need to be updated.\r\n Some other properties might need to be set.\r\n Keep the syncMove option default false until all inconsistencies are taken care of.\r\n */\r\n dispatcher.dispatch(el, {\r\n pageX: point.pageX + scrollx,\r\n pageY: point.pageY + scrolly,\r\n clientX: point.x + scrollx,\r\n clientY: point.y + scrolly\r\n });\r\n }\r\n\r\n setTimeout(()=>{\r\n\r\n if(scrolly){\r\n scrollY(el, scrolly);\r\n }\r\n\r\n if(scrollx){\r\n scrollX(el, scrollx);\r\n }\r\n\r\n });\r\n }\r\n\r\n function scrollY(el, amount){\r\n if(el === window){\r\n window.scrollTo(el.pageXOffset, el.pageYOffset + amount);\r\n }else{\r\n el.scrollTop += amount;\r\n }\r\n }\r\n\r\n function scrollX(el, amount){\r\n if(el === window){\r\n window.scrollTo(el.pageXOffset + amount, el.pageYOffset);\r\n }else{\r\n el.scrollLeft += amount;\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default function AutoScrollerFactory(element, options){\r\n return new AutoScroller(element, options);\r\n}\r\n\r\nfunction inside(point, el, rect){\r\n if(!rect){\r\n return pointInside(point, el);\r\n }else{\r\n return (point.y > rect.top && point.y < rect.bottom &&\r\n point.x > rect.left && point.x < rect.right);\r\n }\r\n}\r\n\r\n/*\r\ngit remote add origin https://github.com/hollowdoor/dom_autoscroller.git\r\ngit push -u origin master\r\n*/\r\n"],"names":["const","let","createPointCB","boolean","addElements","removeElements","requestFrame","cancelFrame","hasElement","getRect","pointInside"],"mappings":"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"} -------------------------------------------------------------------------------- /test/dom-autoscroller.js: -------------------------------------------------------------------------------- 1 | var autoScroll = (function () { 2 | 'use strict'; 3 | 4 | function getDef(f, d) { 5 | if (typeof f === 'undefined') { 6 | return typeof d === 'undefined' ? f : d; 7 | } 8 | 9 | return f; 10 | } 11 | function boolean(func, def) { 12 | 13 | func = getDef(func, def); 14 | 15 | if (typeof func === 'function') { 16 | return function f() { 17 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 18 | args[_key] = arguments[_key]; 19 | } 20 | 21 | return !!func.apply(this, args); 22 | }; 23 | } 24 | 25 | return !!func ? function () { 26 | return true; 27 | } : function () { 28 | return false; 29 | }; 30 | } 31 | 32 | var prefix = ['webkit', 'moz', 'ms', 'o']; 33 | 34 | var requestAnimationFrame = function () { 35 | 36 | for (var i = 0, limit = prefix.length; i < limit && !window.requestAnimationFrame; ++i) { 37 | window.requestAnimationFrame = window[prefix[i] + 'RequestAnimationFrame']; 38 | } 39 | 40 | if (!window.requestAnimationFrame) { 41 | (function () { 42 | var lastTime = 0; 43 | 44 | window.requestAnimationFrame = function (callback) { 45 | var now = new Date().getTime(); 46 | var ttc = Math.max(0, 16 - now - lastTime); 47 | var timer = window.setTimeout(function () { 48 | return callback(now + ttc); 49 | }, ttc); 50 | 51 | lastTime = now + ttc; 52 | 53 | return timer; 54 | }; 55 | })(); 56 | } 57 | 58 | return window.requestAnimationFrame.bind(window); 59 | }(); 60 | 61 | var cancelAnimationFrame = function () { 62 | 63 | for (var i = 0, limit = prefix.length; i < limit && !window.cancelAnimationFrame; ++i) { 64 | window.cancelAnimationFrame = window[prefix[i] + 'CancelAnimationFrame'] || window[prefix[i] + 'CancelRequestAnimationFrame']; 65 | } 66 | 67 | if (!window.cancelAnimationFrame) { 68 | window.cancelAnimationFrame = function (timer) { 69 | window.clearTimeout(timer); 70 | }; 71 | } 72 | 73 | return window.cancelAnimationFrame.bind(window); 74 | }(); 75 | 76 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { 77 | return typeof obj; 78 | } : function (obj) { 79 | return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; 80 | }; 81 | 82 | /** 83 | * Returns `true` if provided input is Element. 84 | * @name isElement 85 | * @param {*} [input] 86 | * @returns {boolean} 87 | */ 88 | var isElement = function (input) { 89 | return input != null && (typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object'; 90 | }; 91 | 92 | // Production steps of ECMA-262, Edition 6, 22.1.2.1 93 | // Reference: http://www.ecma-international.org/ecma-262/6.0/#sec-array.from 94 | var polyfill = function () { 95 | var isCallable = function (fn) { 96 | return typeof fn === 'function'; 97 | }; 98 | var toInteger = function (value) { 99 | var number = Number(value); 100 | if (isNaN(number)) { 101 | return 0; 102 | } 103 | if (number === 0 || !isFinite(number)) { 104 | return number; 105 | } 106 | return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); 107 | }; 108 | var maxSafeInteger = Math.pow(2, 53) - 1; 109 | var toLength = function (value) { 110 | var len = toInteger(value); 111 | return Math.min(Math.max(len, 0), maxSafeInteger); 112 | }; 113 | var iteratorProp = function (value) { 114 | if (value != null) { 115 | if (['string', 'number', 'boolean', 'symbol'].indexOf(typeof value) > -1) { 116 | return Symbol.iterator; 117 | } else if (typeof Symbol !== 'undefined' && 'iterator' in Symbol && Symbol.iterator in value) { 118 | return Symbol.iterator; 119 | } 120 | // Support "@@iterator" placeholder, Gecko 27 to Gecko 35 121 | else if ('@@iterator' in value) { 122 | return '@@iterator'; 123 | } 124 | } 125 | }; 126 | var getMethod = function (O, P) { 127 | // Assert: IsPropertyKey(P) is true. 128 | if (O != null && P != null) { 129 | // Let func be GetV(O, P). 130 | var func = O[P]; 131 | // ReturnIfAbrupt(func). 132 | // If func is either undefined or null, return undefined. 133 | if (func == null) { 134 | return void 0; 135 | } 136 | // If IsCallable(func) is false, throw a TypeError exception. 137 | if (!isCallable(func)) { 138 | throw new TypeError(func + ' is not a function'); 139 | } 140 | return func; 141 | } 142 | }; 143 | var iteratorStep = function (iterator) { 144 | // Let result be IteratorNext(iterator). 145 | // ReturnIfAbrupt(result). 146 | var result = iterator.next(); 147 | // Let done be IteratorComplete(result). 148 | // ReturnIfAbrupt(done). 149 | var done = Boolean(result.done); 150 | // If done is true, return false. 151 | if (done) { 152 | return false; 153 | } 154 | // Return result. 155 | return result; 156 | }; 157 | 158 | // The length property of the from method is 1. 159 | return function from(items /*, mapFn, thisArg */) { 160 | 'use strict'; 161 | 162 | // 1. Let C be the this value. 163 | 164 | var C = this; 165 | 166 | // 2. If mapfn is undefined, let mapping be false. 167 | var mapFn = arguments.length > 1 ? arguments[1] : void 0; 168 | 169 | var T; 170 | if (typeof mapFn !== 'undefined') { 171 | // 3. else 172 | // a. If IsCallable(mapfn) is false, throw a TypeError exception. 173 | if (!isCallable(mapFn)) { 174 | throw new TypeError('Array.from: when provided, the second argument must be a function'); 175 | } 176 | 177 | // b. If thisArg was supplied, let T be thisArg; else let T 178 | // be undefined. 179 | if (arguments.length > 2) { 180 | T = arguments[2]; 181 | } 182 | // c. Let mapping be true (implied by mapFn) 183 | } 184 | 185 | var A, k; 186 | 187 | // 4. Let usingIterator be GetMethod(items, @@iterator). 188 | // 5. ReturnIfAbrupt(usingIterator). 189 | var usingIterator = getMethod(items, iteratorProp(items)); 190 | 191 | // 6. If usingIterator is not undefined, then 192 | if (usingIterator !== void 0) { 193 | // a. If IsConstructor(C) is true, then 194 | // i. Let A be the result of calling the [[Construct]] 195 | // internal method of C with an empty argument list. 196 | // b. Else, 197 | // i. Let A be the result of the abstract operation ArrayCreate 198 | // with argument 0. 199 | // c. ReturnIfAbrupt(A). 200 | A = isCallable(C) ? Object(new C()) : []; 201 | 202 | // d. Let iterator be GetIterator(items, usingIterator). 203 | var iterator = usingIterator.call(items); 204 | 205 | // e. ReturnIfAbrupt(iterator). 206 | if (iterator == null) { 207 | throw new TypeError('Array.from requires an array-like or iterable object'); 208 | } 209 | 210 | // f. Let k be 0. 211 | k = 0; 212 | 213 | // g. Repeat 214 | var next, nextValue; 215 | while (true) { 216 | // i. Let Pk be ToString(k). 217 | // ii. Let next be IteratorStep(iterator). 218 | // iii. ReturnIfAbrupt(next). 219 | next = iteratorStep(iterator); 220 | 221 | // iv. If next is false, then 222 | if (!next) { 223 | 224 | // 1. Let setStatus be Set(A, "length", k, true). 225 | // 2. ReturnIfAbrupt(setStatus). 226 | A.length = k; 227 | 228 | // 3. Return A. 229 | return A; 230 | } 231 | // v. Let nextValue be IteratorValue(next). 232 | // vi. ReturnIfAbrupt(nextValue) 233 | nextValue = next.value; 234 | 235 | // vii. If mapping is true, then 236 | // 1. Let mappedValue be Call(mapfn, T, «nextValue, k»). 237 | // 2. If mappedValue is an abrupt completion, return 238 | // IteratorClose(iterator, mappedValue). 239 | // 3. Let mappedValue be mappedValue.[[value]]. 240 | // viii. Else, let mappedValue be nextValue. 241 | // ix. Let defineStatus be the result of 242 | // CreateDataPropertyOrThrow(A, Pk, mappedValue). 243 | // x. [TODO] If defineStatus is an abrupt completion, return 244 | // IteratorClose(iterator, defineStatus). 245 | if (mapFn) { 246 | A[k] = mapFn.call(T, nextValue, k); 247 | } else { 248 | A[k] = nextValue; 249 | } 250 | // xi. Increase k by 1. 251 | k++; 252 | } 253 | // 7. Assert: items is not an Iterable so assume it is 254 | // an array-like object. 255 | } else { 256 | 257 | // 8. Let arrayLike be ToObject(items). 258 | var arrayLike = Object(items); 259 | 260 | // 9. ReturnIfAbrupt(items). 261 | if (items == null) { 262 | throw new TypeError('Array.from requires an array-like object - not null or undefined'); 263 | } 264 | 265 | // 10. Let len be ToLength(Get(arrayLike, "length")). 266 | // 11. ReturnIfAbrupt(len). 267 | var len = toLength(arrayLike.length); 268 | 269 | // 12. If IsConstructor(C) is true, then 270 | // a. Let A be Construct(C, «len»). 271 | // 13. Else 272 | // a. Let A be ArrayCreate(len). 273 | // 14. ReturnIfAbrupt(A). 274 | A = isCallable(C) ? Object(new C(len)) : new Array(len); 275 | 276 | // 15. Let k be 0. 277 | k = 0; 278 | // 16. Repeat, while k < len… (also steps a - h) 279 | var kValue; 280 | while (k < len) { 281 | kValue = arrayLike[k]; 282 | if (mapFn) { 283 | A[k] = mapFn.call(T, kValue, k); 284 | } else { 285 | A[k] = kValue; 286 | } 287 | k++; 288 | } 289 | // 17. Let setStatus be Set(A, "length", len, true). 290 | // 18. ReturnIfAbrupt(setStatus). 291 | A.length = len; 292 | // 19. Return A. 293 | } 294 | return A; 295 | }; 296 | }(); 297 | 298 | var index$1 = typeof Array.from === 'function' ? Array.from : polyfill; 299 | 300 | /** 301 | * isArray 302 | */ 303 | 304 | var isArray = Array.isArray; 305 | 306 | /** 307 | * toString 308 | */ 309 | 310 | var str = Object.prototype.toString; 311 | 312 | /** 313 | * Whether or not the given `val` 314 | * is an array. 315 | * 316 | * example: 317 | * 318 | * isArray([]); 319 | * // > true 320 | * isArray(arguments); 321 | * // > false 322 | * isArray(''); 323 | * // > false 324 | * 325 | * @param {mixed} val 326 | * @return {bool} 327 | */ 328 | 329 | var index$2 = isArray || function (val) { 330 | return !!val && '[object Array]' == str.call(val); 331 | }; 332 | 333 | function indexOfElement(elements, element) { 334 | element = resolveElement(element, true); 335 | if (!isElement(element)) return -1; 336 | for (var i = 0; i < elements.length; i++) { 337 | if (elements[i] === element) { 338 | return i; 339 | } 340 | } 341 | return -1; 342 | } 343 | 344 | function hasElement(elements, element) { 345 | return -1 !== indexOfElement(elements, element); 346 | } 347 | 348 | function domListOf(arr) { 349 | 350 | if (!arr) return []; 351 | 352 | try { 353 | if (typeof arr === 'string') { 354 | return index$1(document.querySelectorAll(arr)); 355 | } else if (index$2(arr)) { 356 | return arr.map(resolveElement); 357 | } else { 358 | if (typeof arr.length === 'undefined') { 359 | return [resolveElement(arr)]; 360 | } 361 | 362 | return index$1(arr, resolveElement); 363 | } 364 | } catch (e) { 365 | throw new Error(e); 366 | } 367 | } 368 | 369 | function pushElements(elements, toAdd) { 370 | 371 | for (var i = 0; i < toAdd.length; i++) { 372 | if (!hasElement(elements, toAdd[i])) elements.push(toAdd[i]); 373 | } 374 | 375 | return toAdd; 376 | } 377 | 378 | function addElements(elements) { 379 | for (var _len2 = arguments.length, toAdd = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { 380 | toAdd[_key2 - 1] = arguments[_key2]; 381 | } 382 | 383 | toAdd = toAdd.map(resolveElement); 384 | return pushElements(elements, toAdd); 385 | } 386 | 387 | function removeElements(elements) { 388 | for (var _len3 = arguments.length, toRemove = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { 389 | toRemove[_key3 - 1] = arguments[_key3]; 390 | } 391 | 392 | return toRemove.map(resolveElement).reduce(function (last, e) { 393 | 394 | var index = indexOfElement(elements, e); 395 | 396 | if (index !== -1) return last.concat(elements.splice(index, 1)); 397 | return last; 398 | }, []); 399 | } 400 | 401 | function resolveElement(element, noThrow) { 402 | if (typeof element === 'string') { 403 | try { 404 | return document.querySelector(element); 405 | } catch (e) { 406 | throw e; 407 | } 408 | } 409 | 410 | if (!isElement(element) && !noThrow) { 411 | throw new TypeError(element + ' is not a DOM element.'); 412 | } 413 | return element; 414 | } 415 | 416 | var index$3 = function createPointCB(object, options) { 417 | 418 | // A persistent object (as opposed to returned object) is used to save memory 419 | // This is good to prevent layout thrashing, or for games, and such 420 | 421 | // NOTE 422 | // This uses IE fixes which should be OK to remove some day. :) 423 | // Some speed will be gained by removal of these. 424 | 425 | // pointCB should be saved in a variable on return 426 | // This allows the usage of element.removeEventListener 427 | 428 | options = options || {}; 429 | 430 | var allowUpdate; 431 | 432 | if (typeof options.allowUpdate === 'function') { 433 | allowUpdate = options.allowUpdate; 434 | } else { 435 | allowUpdate = function () { 436 | return true; 437 | }; 438 | } 439 | 440 | return function pointCB(event) { 441 | 442 | event = event || window.event; // IE-ism 443 | object.target = event.target || event.srcElement || event.originalTarget; 444 | object.element = this; 445 | object.type = event.type; 446 | 447 | if (!allowUpdate(event)) { 448 | return; 449 | } 450 | 451 | // Support touch 452 | // http://www.creativebloq.com/javascript/make-your-site-work-touch-devices-51411644 453 | 454 | if (event.targetTouches) { 455 | object.x = event.targetTouches[0].clientX; 456 | object.y = event.targetTouches[0].clientY; 457 | object.pageX = event.pageX; 458 | object.pageY = event.pageY; 459 | } else { 460 | 461 | // If pageX/Y aren't available and clientX/Y are, 462 | // calculate pageX/Y - logic taken from jQuery. 463 | // (This is to support old IE) 464 | // NOTE Hopefully this can be removed soon. 465 | 466 | if (event.pageX === null && event.clientX !== null) { 467 | var eventDoc = event.target && event.target.ownerDocument || document; 468 | var doc = eventDoc.documentElement; 469 | var body = eventDoc.body; 470 | 471 | object.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); 472 | object.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); 473 | } else { 474 | object.pageX = event.pageX; 475 | object.pageY = event.pageY; 476 | } 477 | 478 | // pageX, and pageY change with page scroll 479 | // so we're not going to use those for x, and y. 480 | // NOTE Most browsers also alias clientX/Y with x/y 481 | // so that's something to consider down the road. 482 | 483 | object.x = event.clientX; 484 | object.y = event.clientY; 485 | } 486 | }; 487 | 488 | //NOTE Remember accessibility, Aria roles, and labels. 489 | }; 490 | 491 | function createWindowRect() { 492 | var props = { 493 | top: { value: 0, enumerable: true }, 494 | left: { value: 0, enumerable: true }, 495 | right: { value: window.innerWidth, enumerable: true }, 496 | bottom: { value: window.innerHeight, enumerable: true }, 497 | width: { value: window.innerWidth, enumerable: true }, 498 | height: { value: window.innerHeight, enumerable: true }, 499 | x: { value: 0, enumerable: true }, 500 | y: { value: 0, enumerable: true } 501 | }; 502 | 503 | if (Object.create) { 504 | return Object.create({}, props); 505 | } else { 506 | var rect = {}; 507 | Object.defineProperties(rect, props); 508 | return rect; 509 | } 510 | } 511 | 512 | function getClientRect(el) { 513 | if (el === window) { 514 | return createWindowRect(); 515 | } else { 516 | try { 517 | var rect = el.getBoundingClientRect(); 518 | if (rect.x === undefined) { 519 | rext.x = rect.left; 520 | rect.y = rect.top; 521 | } 522 | return rect; 523 | } catch (e) { 524 | throw new TypeError("Can't call getBoundingClientRect on " + el); 525 | } 526 | } 527 | } 528 | 529 | function pointInside(point, el) { 530 | var rect = getClientRect(el); 531 | return point.y > rect.top && point.y < rect.bottom && point.x > rect.left && point.x < rect.right; 532 | } 533 | 534 | var objectCreate = void 0; 535 | if (typeof Object.create != 'function') { 536 | objectCreate = function (undefined) { 537 | var Temp = function Temp() {}; 538 | return function (prototype, propertiesObject) { 539 | if (prototype !== Object(prototype) && prototype !== null) { 540 | throw TypeError('Argument must be an object, or null'); 541 | } 542 | Temp.prototype = prototype || {}; 543 | var result = new Temp(); 544 | Temp.prototype = null; 545 | if (propertiesObject !== undefined) { 546 | Object.defineProperties(result, propertiesObject); 547 | } 548 | 549 | // to imitate the case of Object.create(null) 550 | if (prototype === null) { 551 | result.__proto__ = null; 552 | } 553 | return result; 554 | }; 555 | }(); 556 | } else { 557 | objectCreate = Object.create; 558 | } 559 | 560 | var objectCreate$1 = objectCreate; 561 | 562 | var mouseEventProps = ['altKey', 'button', 'buttons', 'clientX', 'clientY', 'ctrlKey', 'metaKey', 'movementX', 'movementY', 'offsetX', 'offsetY', 'pageX', 'pageY', 'region', 'relatedTarget', 'screenX', 'screenY', 'shiftKey', 'which', 'x', 'y']; 563 | 564 | function createDispatcher(element) { 565 | 566 | var defaultSettings = { 567 | screenX: 0, 568 | screenY: 0, 569 | clientX: 0, 570 | clientY: 0, 571 | ctrlKey: false, 572 | shiftKey: false, 573 | altKey: false, 574 | metaKey: false, 575 | button: 0, 576 | buttons: 1, 577 | relatedTarget: null, 578 | region: null 579 | }; 580 | 581 | if (element !== undefined) { 582 | element.addEventListener('mousemove', onMove); 583 | } 584 | 585 | function onMove(e) { 586 | for (var i = 0; i < mouseEventProps.length; i++) { 587 | defaultSettings[mouseEventProps[i]] = e[mouseEventProps[i]]; 588 | } 589 | } 590 | 591 | var dispatch = function () { 592 | if (MouseEvent) { 593 | return function m1(element, initMove, data) { 594 | var evt = new MouseEvent('mousemove', createMoveInit(defaultSettings, initMove)); 595 | 596 | //evt.dispatched = 'mousemove'; 597 | setSpecial(evt, data); 598 | 599 | return element.dispatchEvent(evt); 600 | }; 601 | } else if (typeof document.createEvent === 'function') { 602 | return function m2(element, initMove, data) { 603 | var settings = createMoveInit(defaultSettings, initMove); 604 | var evt = document.createEvent('MouseEvents'); 605 | 606 | evt.initMouseEvent("mousemove", true, //can bubble 607 | true, //cancelable 608 | window, //view 609 | 0, //detail 610 | settings.screenX, //0, //screenX 611 | settings.screenY, //0, //screenY 612 | settings.clientX, //80, //clientX 613 | settings.clientY, //20, //clientY 614 | settings.ctrlKey, //false, //ctrlKey 615 | settings.altKey, //false, //altKey 616 | settings.shiftKey, //false, //shiftKey 617 | settings.metaKey, //false, //metaKey 618 | settings.button, //0, //button 619 | settings.relatedTarget //null //relatedTarget 620 | ); 621 | 622 | //evt.dispatched = 'mousemove'; 623 | setSpecial(evt, data); 624 | 625 | return element.dispatchEvent(evt); 626 | }; 627 | } else if (typeof document.createEventObject === 'function') { 628 | return function m3(element, initMove, data) { 629 | var evt = document.createEventObject(); 630 | var settings = createMoveInit(defaultSettings, initMove); 631 | for (var name in settings) { 632 | evt[name] = settings[name]; 633 | } 634 | 635 | //evt.dispatched = 'mousemove'; 636 | setSpecial(evt, data); 637 | 638 | return element.dispatchEvent(evt); 639 | }; 640 | } 641 | }(); 642 | 643 | function destroy() { 644 | if (element) element.removeEventListener('mousemove', onMove, false); 645 | defaultSettings = null; 646 | } 647 | 648 | return { 649 | destroy: destroy, 650 | dispatch: dispatch 651 | }; 652 | } 653 | 654 | function createMoveInit(defaultSettings, initMove) { 655 | initMove = initMove || {}; 656 | var settings = objectCreate$1(defaultSettings); 657 | for (var i = 0; i < mouseEventProps.length; i++) { 658 | if (initMove[mouseEventProps[i]] !== undefined) settings[mouseEventProps[i]] = initMove[mouseEventProps[i]]; 659 | } 660 | 661 | return settings; 662 | } 663 | 664 | function setSpecial(e, data) { 665 | console.log('data ', data); 666 | e.data = data || {}; 667 | e.dispatched = 'mousemove'; 668 | } 669 | 670 | function AutoScroller(elements) { 671 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 672 | 673 | var self = this; 674 | var maxSpeed = 4, 675 | scrolling = false; 676 | 677 | this.margin = options.margin || -1; 678 | //this.scrolling = false; 679 | this.scrollWhenOutside = options.scrollWhenOutside || false; 680 | 681 | var point = {}, 682 | down = false; 683 | 684 | var pointCB = index$3(point, { 685 | allowUpdate: function allowUpdate(event) { 686 | return !event.dispatched; 687 | } 688 | }); 689 | 690 | window.addEventListener('mousemove', pointCB, false); 691 | window.addEventListener('touchmove', pointCB, false); 692 | 693 | if (!isNaN(options.maxSpeed)) { 694 | maxSpeed = options.maxSpeed; 695 | } 696 | 697 | this.autoScroll = boolean(options.autoScroll); 698 | this.sync = boolean(options.sync, false); 699 | 700 | this.destroy = function () { 701 | window.removeEventListener('mousemove', pointCB, false); 702 | window.removeEventListener('touchmove', pointCB, false); 703 | window.removeEventListener('mousedown', onDown, false); 704 | window.removeEventListener('touchstart', onDown, false); 705 | window.removeEventListener('mouseup', onUp, false); 706 | window.removeEventListener('touchend', onUp, false); 707 | 708 | window.removeEventListener('scroll', setScroll, true); 709 | elements = []; 710 | }; 711 | 712 | this.add = function () { 713 | for (var _len = arguments.length, element = Array(_len), _key = 0; _key < _len; _key++) { 714 | element[_key] = arguments[_key]; 715 | } 716 | 717 | addElements.apply(undefined, [elements].concat(element)); 718 | return this; 719 | }; 720 | 721 | this.remove = function () { 722 | for (var _len2 = arguments.length, element = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 723 | element[_key2] = arguments[_key2]; 724 | } 725 | 726 | return removeElements.apply(undefined, [elements].concat(element)); 727 | }; 728 | 729 | var hasWindow = null, 730 | windowAnimationFrame = void 0; 731 | 732 | if (Object.prototype.toString.call(elements) !== '[object Array]') { 733 | elements = [elements]; 734 | } 735 | 736 | (function (temp) { 737 | elements = []; 738 | temp.forEach(function (element) { 739 | if (element === window) { 740 | hasWindow = window; 741 | } else { 742 | self.add(element); 743 | } 744 | }); 745 | })(elements); 746 | 747 | Object.defineProperties(this, { 748 | down: { 749 | get: function get() { 750 | return down; 751 | } 752 | }, 753 | maxSpeed: { 754 | get: function get() { 755 | return maxSpeed; 756 | } 757 | }, 758 | point: { 759 | get: function get() { 760 | return point; 761 | } 762 | }, 763 | scrolling: { 764 | get: function get() { 765 | return scrolling; 766 | } 767 | } 768 | }); 769 | 770 | var n = 0, 771 | current = null, 772 | animationFrame = void 0; 773 | 774 | var dispatcher = createDispatcher(); 775 | 776 | window.addEventListener('mousedown', onDown, false); 777 | window.addEventListener('touchstart', onDown, false); 778 | window.addEventListener('mouseup', onUp, false); 779 | window.addEventListener('touchend', onUp, false); 780 | 781 | window.addEventListener('mousemove', onMove, false); 782 | window.addEventListener('touchmove', onMove, false); 783 | 784 | window.addEventListener('mouseleave', onMouseOut, false); 785 | 786 | window.addEventListener('scroll', setScroll, true); 787 | 788 | function setScroll(e) { 789 | 790 | for (var i = 0; i < elements.length; i++) { 791 | if (elements[i] === e.target) { 792 | scrolling = true; 793 | break; 794 | } 795 | } 796 | 797 | if (scrolling) { 798 | requestAnimationFrame(function () { 799 | return scrolling = false; 800 | }); 801 | } 802 | } 803 | 804 | function onDown() { 805 | down = true; 806 | } 807 | 808 | function onUp() { 809 | down = false; 810 | cancelAnimationFrame(animationFrame); 811 | cancelAnimationFrame(windowAnimationFrame); 812 | } 813 | 814 | function onMouseOut() { 815 | down = false; 816 | } 817 | 818 | function getTarget(target) { 819 | if (!target) { 820 | return null; 821 | } 822 | 823 | if (current === target) { 824 | return target; 825 | } 826 | 827 | if (hasElement(elements, target)) { 828 | return target; 829 | } 830 | 831 | while (target = target.parentNode) { 832 | if (hasElement(elements, target)) { 833 | return target; 834 | } 835 | } 836 | 837 | return null; 838 | } 839 | 840 | function getElementUnderPoint() { 841 | var underPoint = null; 842 | 843 | for (var i = 0; i < elements.length; i++) { 844 | if (inside(point, elements[i])) { 845 | underPoint = elements[i]; 846 | } 847 | } 848 | 849 | return underPoint; 850 | } 851 | 852 | function onMove(event) { 853 | 854 | if (event.dispatched) { 855 | return false; 856 | } 857 | 858 | if (!self.autoScroll()) return; 859 | var target = event.target, 860 | body = document.body; 861 | 862 | if (current && !inside(point, current)) { 863 | if (!self.scrollWhenOutside) { 864 | current = null; 865 | } 866 | } 867 | 868 | if (target && target.parentNode === body) { 869 | //The special condition to improve speed. 870 | target = getElementUnderPoint(); 871 | } else { 872 | target = getTarget(target); 873 | 874 | if (!target) { 875 | target = getElementUnderPoint(); 876 | } 877 | } 878 | 879 | if (target && target !== current) { 880 | current = target; 881 | } 882 | 883 | if (hasWindow) { 884 | cancelAnimationFrame(windowAnimationFrame); 885 | windowAnimationFrame = requestAnimationFrame(scrollWindow); 886 | } 887 | 888 | if (!current) { 889 | return; 890 | } 891 | 892 | cancelAnimationFrame(animationFrame); 893 | animationFrame = requestAnimationFrame(scrollTick); 894 | } 895 | 896 | function scrollWindow() { 897 | autoScroll(hasWindow); 898 | 899 | cancelAnimationFrame(windowAnimationFrame); 900 | windowAnimationFrame = requestAnimationFrame(scrollWindow); 901 | } 902 | 903 | function scrollTick() { 904 | 905 | if (!current) { 906 | return; 907 | } 908 | 909 | autoScroll(current); 910 | 911 | cancelAnimationFrame(animationFrame); 912 | animationFrame = requestAnimationFrame(scrollTick); 913 | } 914 | 915 | console.log('self.sync() ', self.sync()); 916 | 917 | function autoScroll(el) { 918 | var rect = getClientRect(el), 919 | scrollx = void 0, 920 | scrolly = void 0; 921 | 922 | if (point.x < rect.left + self.margin) { 923 | scrollx = Math.floor(Math.max(-1, (point.x - rect.left) / self.margin - 1) * self.maxSpeed); 924 | } else if (point.x > rect.right - self.margin) { 925 | scrollx = Math.ceil(Math.min(1, (point.x - rect.right) / self.margin + 1) * self.maxSpeed); 926 | } else { 927 | scrollx = 0; 928 | } 929 | 930 | if (point.y < rect.top + self.margin) { 931 | scrolly = Math.floor(Math.max(-1, (point.y - rect.top) / self.margin - 1) * self.maxSpeed); 932 | } else if (point.y > rect.bottom - self.margin) { 933 | scrolly = Math.ceil(Math.min(1, (point.y - rect.bottom) / self.margin + 1) * self.maxSpeed); 934 | } else { 935 | scrolly = 0; 936 | } 937 | 938 | //console.log('el.pageX ',el.pageX) 939 | //console.log('el.pageX + scrollx ',el.pageX + scrollx) 940 | //console.log('el.clientX ',el.clientX) 941 | 942 | if (self.sync()) { 943 | console.log('do sync'); 944 | dispatcher.dispatch(el, { 945 | clientX: point.x + scrollx, 946 | clientY: point.y + scrolly, 947 | pageX: point.pageX + scrollx, 948 | pageY: point.pageY + scrolly 949 | }); 950 | } 951 | 952 | setTimeout(function () { 953 | 954 | if (scrolly) { 955 | scrollY(el, scrolly); 956 | } 957 | 958 | if (scrollx) { 959 | scrollX(el, scrollx); 960 | } 961 | }); 962 | } 963 | 964 | function scrollY(el, amount) { 965 | if (el === window) { 966 | window.scrollTo(el.pageXOffset, el.pageYOffset + amount); 967 | } else { 968 | el.scrollTop += amount; 969 | } 970 | } 971 | 972 | function scrollX(el, amount) { 973 | if (el === window) { 974 | window.scrollTo(el.pageXOffset + amount, el.pageYOffset); 975 | } else { 976 | el.scrollLeft += amount; 977 | } 978 | } 979 | } 980 | 981 | function AutoScrollerFactory(element, options) { 982 | return new AutoScroller(element, options); 983 | } 984 | function inside(point, el, rect) { 985 | if (!rect) { 986 | return pointInside(point, el); 987 | } else { 988 | return point.y > rect.top && point.y < rect.bottom && point.x > rect.left && point.x < rect.right; 989 | } 990 | } 991 | 992 | /* 993 | git remote add origin https://github.com/hollowdoor/dom_autoscroller.git 994 | git push -u origin master 995 | */ 996 | 997 | return AutoScrollerFactory; 998 | 999 | }()); 1000 | //# sourceMappingURL=dom-autoscroller.js.map 1001 | -------------------------------------------------------------------------------- /dist/dom-autoscroller.js: -------------------------------------------------------------------------------- 1 | var autoScroll = (function () { 2 | 'use strict'; 3 | 4 | function getDef(f, d) { 5 | if (typeof f === 'undefined') { 6 | return typeof d === 'undefined' ? f : d; 7 | } 8 | 9 | return f; 10 | } 11 | function boolean(func, def) { 12 | 13 | func = getDef(func, def); 14 | 15 | if (typeof func === 'function') { 16 | return function f() { 17 | var arguments$1 = arguments; 18 | 19 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 20 | args[_key] = arguments$1[_key]; 21 | } 22 | 23 | return !!func.apply(this, args); 24 | }; 25 | } 26 | 27 | return !!func ? function () { 28 | return true; 29 | } : function () { 30 | return false; 31 | }; 32 | } 33 | 34 | var prefix = ['webkit', 'moz', 'ms', 'o']; 35 | 36 | var requestAnimationFrame = function () { 37 | 38 | for (var i = 0, limit = prefix.length; i < limit && !window.requestAnimationFrame; ++i) { 39 | window.requestAnimationFrame = window[prefix[i] + 'RequestAnimationFrame']; 40 | } 41 | 42 | if (!window.requestAnimationFrame) { 43 | (function () { 44 | var lastTime = 0; 45 | 46 | window.requestAnimationFrame = function (callback) { 47 | var now = new Date().getTime(); 48 | var ttc = Math.max(0, 16 - now - lastTime); 49 | var timer = window.setTimeout(function () { 50 | return callback(now + ttc); 51 | }, ttc); 52 | 53 | lastTime = now + ttc; 54 | 55 | return timer; 56 | }; 57 | })(); 58 | } 59 | 60 | return window.requestAnimationFrame.bind(window); 61 | }(); 62 | 63 | var cancelAnimationFrame = function () { 64 | 65 | for (var i = 0, limit = prefix.length; i < limit && !window.cancelAnimationFrame; ++i) { 66 | window.cancelAnimationFrame = window[prefix[i] + 'CancelAnimationFrame'] || window[prefix[i] + 'CancelRequestAnimationFrame']; 67 | } 68 | 69 | if (!window.cancelAnimationFrame) { 70 | window.cancelAnimationFrame = function (timer) { 71 | window.clearTimeout(timer); 72 | }; 73 | } 74 | 75 | return window.cancelAnimationFrame.bind(window); 76 | }(); 77 | 78 | // Production steps of ECMA-262, Edition 6, 22.1.2.1 79 | // Reference: http://www.ecma-international.org/ecma-262/6.0/#sec-array.from 80 | var polyfill = (function() { 81 | var isCallable = function(fn) { 82 | return typeof fn === 'function'; 83 | }; 84 | var toInteger = function (value) { 85 | var number = Number(value); 86 | if (isNaN(number)) { return 0; } 87 | if (number === 0 || !isFinite(number)) { return number; } 88 | return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); 89 | }; 90 | var maxSafeInteger = Math.pow(2, 53) - 1; 91 | var toLength = function (value) { 92 | var len = toInteger(value); 93 | return Math.min(Math.max(len, 0), maxSafeInteger); 94 | }; 95 | var iteratorProp = function(value) { 96 | if(value != null) { 97 | if(['string','number','boolean','symbol'].indexOf(typeof value) > -1){ 98 | return Symbol.iterator; 99 | } else if ( 100 | (typeof Symbol !== 'undefined') && 101 | ('iterator' in Symbol) && 102 | (Symbol.iterator in value) 103 | ) { 104 | return Symbol.iterator; 105 | } 106 | // Support "@@iterator" placeholder, Gecko 27 to Gecko 35 107 | else if ('@@iterator' in value) { 108 | return '@@iterator'; 109 | } 110 | } 111 | }; 112 | var getMethod = function(O, P) { 113 | // Assert: IsPropertyKey(P) is true. 114 | if (O != null && P != null) { 115 | // Let func be GetV(O, P). 116 | var func = O[P]; 117 | // ReturnIfAbrupt(func). 118 | // If func is either undefined or null, return undefined. 119 | if(func == null) { 120 | return void 0; 121 | } 122 | // If IsCallable(func) is false, throw a TypeError exception. 123 | if (!isCallable(func)) { 124 | throw new TypeError(func + ' is not a function'); 125 | } 126 | return func; 127 | } 128 | }; 129 | var iteratorStep = function(iterator) { 130 | // Let result be IteratorNext(iterator). 131 | // ReturnIfAbrupt(result). 132 | var result = iterator.next(); 133 | // Let done be IteratorComplete(result). 134 | // ReturnIfAbrupt(done). 135 | var done = Boolean(result.done); 136 | // If done is true, return false. 137 | if(done) { 138 | return false; 139 | } 140 | // Return result. 141 | return result; 142 | }; 143 | 144 | // The length property of the from method is 1. 145 | return function from(items /*, mapFn, thisArg */ ) { 146 | 'use strict'; 147 | 148 | // 1. Let C be the this value. 149 | var C = this; 150 | 151 | // 2. If mapfn is undefined, let mapping be false. 152 | var mapFn = arguments.length > 1 ? arguments[1] : void 0; 153 | 154 | var T; 155 | if (typeof mapFn !== 'undefined') { 156 | // 3. else 157 | // a. If IsCallable(mapfn) is false, throw a TypeError exception. 158 | if (!isCallable(mapFn)) { 159 | throw new TypeError( 160 | 'Array.from: when provided, the second argument must be a function' 161 | ); 162 | } 163 | 164 | // b. If thisArg was supplied, let T be thisArg; else let T 165 | // be undefined. 166 | if (arguments.length > 2) { 167 | T = arguments[2]; 168 | } 169 | // c. Let mapping be true (implied by mapFn) 170 | } 171 | 172 | var A, k; 173 | 174 | // 4. Let usingIterator be GetMethod(items, @@iterator). 175 | // 5. ReturnIfAbrupt(usingIterator). 176 | var usingIterator = getMethod(items, iteratorProp(items)); 177 | 178 | // 6. If usingIterator is not undefined, then 179 | if (usingIterator !== void 0) { 180 | // a. If IsConstructor(C) is true, then 181 | // i. Let A be the result of calling the [[Construct]] 182 | // internal method of C with an empty argument list. 183 | // b. Else, 184 | // i. Let A be the result of the abstract operation ArrayCreate 185 | // with argument 0. 186 | // c. ReturnIfAbrupt(A). 187 | A = isCallable(C) ? Object(new C()) : []; 188 | 189 | // d. Let iterator be GetIterator(items, usingIterator). 190 | var iterator = usingIterator.call(items); 191 | 192 | // e. ReturnIfAbrupt(iterator). 193 | if (iterator == null) { 194 | throw new TypeError( 195 | 'Array.from requires an array-like or iterable object' 196 | ); 197 | } 198 | 199 | // f. Let k be 0. 200 | k = 0; 201 | 202 | // g. Repeat 203 | var next, nextValue; 204 | while (true) { 205 | // i. Let Pk be ToString(k). 206 | // ii. Let next be IteratorStep(iterator). 207 | // iii. ReturnIfAbrupt(next). 208 | next = iteratorStep(iterator); 209 | 210 | // iv. If next is false, then 211 | if (!next) { 212 | 213 | // 1. Let setStatus be Set(A, "length", k, true). 214 | // 2. ReturnIfAbrupt(setStatus). 215 | A.length = k; 216 | 217 | // 3. Return A. 218 | return A; 219 | } 220 | // v. Let nextValue be IteratorValue(next). 221 | // vi. ReturnIfAbrupt(nextValue) 222 | nextValue = next.value; 223 | 224 | // vii. If mapping is true, then 225 | // 1. Let mappedValue be Call(mapfn, T, «nextValue, k»). 226 | // 2. If mappedValue is an abrupt completion, return 227 | // IteratorClose(iterator, mappedValue). 228 | // 3. Let mappedValue be mappedValue.[[value]]. 229 | // viii. Else, let mappedValue be nextValue. 230 | // ix. Let defineStatus be the result of 231 | // CreateDataPropertyOrThrow(A, Pk, mappedValue). 232 | // x. [TODO] If defineStatus is an abrupt completion, return 233 | // IteratorClose(iterator, defineStatus). 234 | if (mapFn) { 235 | A[k] = mapFn.call(T, nextValue, k); 236 | } 237 | else { 238 | A[k] = nextValue; 239 | } 240 | // xi. Increase k by 1. 241 | k++; 242 | } 243 | // 7. Assert: items is not an Iterable so assume it is 244 | // an array-like object. 245 | } else { 246 | 247 | // 8. Let arrayLike be ToObject(items). 248 | var arrayLike = Object(items); 249 | 250 | // 9. ReturnIfAbrupt(items). 251 | if (items == null) { 252 | throw new TypeError( 253 | 'Array.from requires an array-like object - not null or undefined' 254 | ); 255 | } 256 | 257 | // 10. Let len be ToLength(Get(arrayLike, "length")). 258 | // 11. ReturnIfAbrupt(len). 259 | var len = toLength(arrayLike.length); 260 | 261 | // 12. If IsConstructor(C) is true, then 262 | // a. Let A be Construct(C, «len»). 263 | // 13. Else 264 | // a. Let A be ArrayCreate(len). 265 | // 14. ReturnIfAbrupt(A). 266 | A = isCallable(C) ? Object(new C(len)) : new Array(len); 267 | 268 | // 15. Let k be 0. 269 | k = 0; 270 | // 16. Repeat, while k < len… (also steps a - h) 271 | var kValue; 272 | while (k < len) { 273 | kValue = arrayLike[k]; 274 | if (mapFn) { 275 | A[k] = mapFn.call(T, kValue, k); 276 | } 277 | else { 278 | A[k] = kValue; 279 | } 280 | k++; 281 | } 282 | // 17. Let setStatus be Set(A, "length", len, true). 283 | // 18. ReturnIfAbrupt(setStatus). 284 | A.length = len; 285 | // 19. Return A. 286 | } 287 | return A; 288 | }; 289 | })(); 290 | 291 | var index = (typeof Array.from === 'function' ? 292 | Array.from : 293 | polyfill 294 | ); 295 | 296 | /** 297 | * isArray 298 | */ 299 | 300 | var isArray = Array.isArray; 301 | 302 | /** 303 | * toString 304 | */ 305 | 306 | var str = Object.prototype.toString; 307 | 308 | /** 309 | * Whether or not the given `val` 310 | * is an array. 311 | * 312 | * example: 313 | * 314 | * isArray([]); 315 | * // > true 316 | * isArray(arguments); 317 | * // > false 318 | * isArray(''); 319 | * // > false 320 | * 321 | * @param {mixed} val 322 | * @return {bool} 323 | */ 324 | 325 | var index$1 = isArray || function (val) { 326 | return !! val && '[object Array]' == str.call(val); 327 | }; 328 | 329 | /** 330 | * Returns `true` if provided input is Element. 331 | * @name isElement 332 | * @param {*} [input] 333 | * @returns {boolean} 334 | */ 335 | 336 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; 337 | 338 | /** 339 | * Returns `true` if provided input is Element. 340 | * @name isElement 341 | * @param {*} [input] 342 | * @returns {boolean} 343 | */ 344 | var isElement$1 = function (input) { 345 | return input != null && (typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object'; 346 | }; 347 | 348 | function indexOfElement(elements, element){ 349 | element = resolveElement(element, true); 350 | if(!isElement$1(element)) { return -1; } 351 | for(var i=0; i 0 ) { toAdd[ len ] = arguments$1[ len + 1 ]; } 401 | 402 | toAdd = toAdd.map(resolveElement); 403 | return pushElements(elements, toAdd); 404 | } 405 | 406 | function removeElements(elements){ 407 | var arguments$1 = arguments; 408 | 409 | var toRemove = [], len = arguments.length - 1; 410 | while ( len-- > 0 ) { toRemove[ len ] = arguments$1[ len + 1 ]; } 411 | 412 | return toRemove.map(resolveElement).reduce(function (last, e){ 413 | 414 | var index$$1 = indexOfElement(elements, e); 415 | 416 | if(index$$1 !== -1) 417 | { return last.concat(elements.splice(index$$1, 1)); } 418 | return last; 419 | }, []); 420 | } 421 | 422 | function resolveElement(element, noThrow){ 423 | if(typeof element === 'string'){ 424 | try{ 425 | return document.querySelector(element); 426 | }catch(e){ 427 | throw e; 428 | } 429 | 430 | } 431 | 432 | if(!isElement$1(element) && !noThrow){ 433 | throw new TypeError((element + " is not a DOM element.")); 434 | } 435 | return element; 436 | } 437 | 438 | function createPointCB(object, options) { 439 | 440 | // A persistent object (as opposed to returned object) is used to save memory 441 | // This is good to prevent layout thrashing, or for games, and such 442 | 443 | // NOTE 444 | // This uses IE fixes which should be OK to remove some day. :) 445 | // Some speed will be gained by removal of these. 446 | 447 | // pointCB should be saved in a variable on return 448 | // This allows the usage of element.removeEventListener 449 | 450 | options = options || {}; 451 | 452 | var allowUpdate = boolean(options.allowUpdate, true); 453 | 454 | /*if(typeof options.allowUpdate === 'function'){ 455 | allowUpdate = options.allowUpdate; 456 | }else{ 457 | allowUpdate = function(){return true;}; 458 | }*/ 459 | 460 | return function pointCB(event) { 461 | 462 | event = event || window.event; // IE-ism 463 | object.target = event.target || event.srcElement || event.originalTarget; 464 | object.element = this; 465 | object.type = event.type; 466 | 467 | if (!allowUpdate(event)) { 468 | return; 469 | } 470 | 471 | // Support touch 472 | // http://www.creativebloq.com/javascript/make-your-site-work-touch-devices-51411644 473 | 474 | if (event.targetTouches) { 475 | object.x = event.targetTouches[0].clientX; 476 | object.y = event.targetTouches[0].clientY; 477 | object.pageX = event.targetTouches[0].pageX; 478 | object.pageY = event.targetTouches[0].pageY; 479 | object.screenX = event.targetTouches[0].screenX; 480 | object.screenY = event.targetTouches[0].screenY; 481 | } else { 482 | 483 | // If pageX/Y aren't available and clientX/Y are, 484 | // calculate pageX/Y - logic taken from jQuery. 485 | // (This is to support old IE) 486 | // NOTE Hopefully this can be removed soon. 487 | 488 | if (event.pageX === null && event.clientX !== null) { 489 | var eventDoc = event.target && event.target.ownerDocument || document; 490 | var doc = eventDoc.documentElement; 491 | var body = eventDoc.body; 492 | 493 | object.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); 494 | object.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); 495 | } else { 496 | object.pageX = event.pageX; 497 | object.pageY = event.pageY; 498 | } 499 | 500 | // pageX, and pageY change with page scroll 501 | // so we're not going to use those for x, and y. 502 | // NOTE Most browsers also alias clientX/Y with x/y 503 | // so that's something to consider down the road. 504 | 505 | object.x = event.clientX; 506 | object.y = event.clientY; 507 | 508 | object.screenX = event.screenX; 509 | object.screenY = event.screenY; 510 | } 511 | 512 | object.clientX = object.x; 513 | object.clientY = object.y; 514 | }; 515 | 516 | //NOTE Remember accessibility, Aria roles, and labels. 517 | } 518 | 519 | function createWindowRect() { 520 | var props = { 521 | top: { value: 0, enumerable: true }, 522 | left: { value: 0, enumerable: true }, 523 | right: { value: window.innerWidth, enumerable: true }, 524 | bottom: { value: window.innerHeight, enumerable: true }, 525 | width: { value: window.innerWidth, enumerable: true }, 526 | height: { value: window.innerHeight, enumerable: true }, 527 | x: { value: 0, enumerable: true }, 528 | y: { value: 0, enumerable: true } 529 | }; 530 | 531 | if (Object.create) { 532 | return Object.create({}, props); 533 | } else { 534 | var rect = {}; 535 | Object.defineProperties(rect, props); 536 | return rect; 537 | } 538 | } 539 | 540 | function getClientRect(el) { 541 | if (el === window) { 542 | return createWindowRect(); 543 | } else { 544 | try { 545 | var rect = el.getBoundingClientRect(); 546 | if (rect.x === undefined) { 547 | rect.x = rect.left; 548 | rect.y = rect.top; 549 | } 550 | return rect; 551 | } catch (e) { 552 | throw new TypeError("Can't call getBoundingClientRect on " + el); 553 | } 554 | } 555 | } 556 | 557 | function pointInside(point, el) { 558 | var rect = getClientRect(el); 559 | return point.y > rect.top && point.y < rect.bottom && point.x > rect.left && point.x < rect.right; 560 | } 561 | 562 | var objectCreate = void 0; 563 | if (typeof Object.create != 'function') { 564 | objectCreate = function (undefined) { 565 | var Temp = function Temp() {}; 566 | return function (prototype, propertiesObject) { 567 | if (prototype !== Object(prototype) && prototype !== null) { 568 | throw TypeError('Argument must be an object, or null'); 569 | } 570 | Temp.prototype = prototype || {}; 571 | var result = new Temp(); 572 | Temp.prototype = null; 573 | if (propertiesObject !== undefined) { 574 | Object.defineProperties(result, propertiesObject); 575 | } 576 | 577 | // to imitate the case of Object.create(null) 578 | if (prototype === null) { 579 | result.__proto__ = null; 580 | } 581 | return result; 582 | }; 583 | }(); 584 | } else { 585 | objectCreate = Object.create; 586 | } 587 | 588 | var objectCreate$1 = objectCreate; 589 | 590 | var mouseEventProps = ['altKey', 'button', 'buttons', 'clientX', 'clientY', 'ctrlKey', 'metaKey', 'movementX', 'movementY', 'offsetX', 'offsetY', 'pageX', 'pageY', 'region', 'relatedTarget', 'screenX', 'screenY', 'shiftKey', 'which', 'x', 'y']; 591 | 592 | function createDispatcher(element) { 593 | 594 | var defaultSettings = { 595 | screenX: 0, 596 | screenY: 0, 597 | clientX: 0, 598 | clientY: 0, 599 | ctrlKey: false, 600 | shiftKey: false, 601 | altKey: false, 602 | metaKey: false, 603 | button: 0, 604 | buttons: 1, 605 | relatedTarget: null, 606 | region: null 607 | }; 608 | 609 | if (element !== undefined) { 610 | element.addEventListener('mousemove', onMove); 611 | } 612 | 613 | function onMove(e) { 614 | for (var i = 0; i < mouseEventProps.length; i++) { 615 | defaultSettings[mouseEventProps[i]] = e[mouseEventProps[i]]; 616 | } 617 | } 618 | 619 | var dispatch = function () { 620 | if (MouseEvent) { 621 | return function m1(element, initMove, data) { 622 | var evt = new MouseEvent('mousemove', createMoveInit(defaultSettings, initMove)); 623 | 624 | //evt.dispatched = 'mousemove'; 625 | setSpecial(evt, data); 626 | 627 | return element.dispatchEvent(evt); 628 | }; 629 | } else if (typeof document.createEvent === 'function') { 630 | return function m2(element, initMove, data) { 631 | var settings = createMoveInit(defaultSettings, initMove); 632 | var evt = document.createEvent('MouseEvents'); 633 | 634 | evt.initMouseEvent("mousemove", true, //can bubble 635 | true, //cancelable 636 | window, //view 637 | 0, //detail 638 | settings.screenX, //0, //screenX 639 | settings.screenY, //0, //screenY 640 | settings.clientX, //80, //clientX 641 | settings.clientY, //20, //clientY 642 | settings.ctrlKey, //false, //ctrlKey 643 | settings.altKey, //false, //altKey 644 | settings.shiftKey, //false, //shiftKey 645 | settings.metaKey, //false, //metaKey 646 | settings.button, //0, //button 647 | settings.relatedTarget //null //relatedTarget 648 | ); 649 | 650 | //evt.dispatched = 'mousemove'; 651 | setSpecial(evt, data); 652 | 653 | return element.dispatchEvent(evt); 654 | }; 655 | } else if (typeof document.createEventObject === 'function') { 656 | return function m3(element, initMove, data) { 657 | var evt = document.createEventObject(); 658 | var settings = createMoveInit(defaultSettings, initMove); 659 | for (var name in settings) { 660 | evt[name] = settings[name]; 661 | } 662 | 663 | //evt.dispatched = 'mousemove'; 664 | setSpecial(evt, data); 665 | 666 | return element.dispatchEvent(evt); 667 | }; 668 | } 669 | }(); 670 | 671 | function destroy() { 672 | if (element) { element.removeEventListener('mousemove', onMove, false); } 673 | defaultSettings = null; 674 | } 675 | 676 | return { 677 | destroy: destroy, 678 | dispatch: dispatch 679 | }; 680 | } 681 | 682 | function createMoveInit(defaultSettings, initMove) { 683 | initMove = initMove || {}; 684 | var settings = objectCreate$1(defaultSettings); 685 | for (var i = 0; i < mouseEventProps.length; i++) { 686 | if (initMove[mouseEventProps[i]] !== undefined) { settings[mouseEventProps[i]] = initMove[mouseEventProps[i]]; } 687 | } 688 | 689 | return settings; 690 | } 691 | 692 | function setSpecial(e, data) { 693 | console.log('data ', data); 694 | e.data = data || {}; 695 | e.dispatched = 'mousemove'; 696 | } 697 | 698 | function AutoScroller(elements, options){ 699 | if ( options === void 0 ) options = {}; 700 | 701 | var self = this; 702 | var maxSpeed = 4, scrolling = false; 703 | 704 | this.margin = options.margin || -1; 705 | //this.scrolling = false; 706 | this.scrollWhenOutside = options.scrollWhenOutside || false; 707 | 708 | var point = {}, 709 | pointCB = createPointCB(point), 710 | dispatcher = createDispatcher(), 711 | down = false; 712 | 713 | window.addEventListener('mousemove', pointCB, false); 714 | window.addEventListener('touchmove', pointCB, false); 715 | 716 | if(!isNaN(options.maxSpeed)){ 717 | maxSpeed = options.maxSpeed; 718 | } 719 | 720 | this.autoScroll = boolean(options.autoScroll); 721 | this.syncMove = boolean(options.syncMove, false); 722 | 723 | this.destroy = function(forceCleanAnimation) { 724 | window.removeEventListener('mousemove', pointCB, false); 725 | window.removeEventListener('touchmove', pointCB, false); 726 | window.removeEventListener('mousedown', onDown, false); 727 | window.removeEventListener('touchstart', onDown, false); 728 | window.removeEventListener('mouseup', onUp, false); 729 | window.removeEventListener('touchend', onUp, false); 730 | window.removeEventListener('pointerup', onUp, false); 731 | window.removeEventListener('mouseleave', onMouseOut, false); 732 | 733 | window.removeEventListener('mousemove', onMove, false); 734 | window.removeEventListener('touchmove', onMove, false); 735 | 736 | window.removeEventListener('scroll', setScroll, true); 737 | elements = []; 738 | if(forceCleanAnimation){ 739 | cleanAnimation(); 740 | } 741 | }; 742 | 743 | this.add = function(){ 744 | var element = [], len = arguments.length; 745 | while ( len-- ) element[ len ] = arguments[ len ]; 746 | 747 | addElements.apply(void 0, [ elements ].concat( element )); 748 | return this; 749 | }; 750 | 751 | this.remove = function(){ 752 | var element = [], len = arguments.length; 753 | while ( len-- ) element[ len ] = arguments[ len ]; 754 | 755 | return removeElements.apply(void 0, [ elements ].concat( element )); 756 | }; 757 | 758 | var hasWindow = null, windowAnimationFrame; 759 | 760 | if(Object.prototype.toString.call(elements) !== '[object Array]'){ 761 | elements = [elements]; 762 | } 763 | 764 | (function(temp){ 765 | elements = []; 766 | temp.forEach(function(element){ 767 | if(element === window){ 768 | hasWindow = window; 769 | }else{ 770 | self.add(element); 771 | } 772 | }); 773 | }(elements)); 774 | 775 | Object.defineProperties(this, { 776 | down: { 777 | get: function(){ return down; } 778 | }, 779 | maxSpeed: { 780 | get: function(){ return maxSpeed; } 781 | }, 782 | point: { 783 | get: function(){ return point; } 784 | }, 785 | scrolling: { 786 | get: function(){ return scrolling; } 787 | } 788 | }); 789 | 790 | var n = 0, current = null, animationFrame; 791 | 792 | window.addEventListener('mousedown', onDown, false); 793 | window.addEventListener('touchstart', onDown, false); 794 | window.addEventListener('mouseup', onUp, false); 795 | window.addEventListener('touchend', onUp, false); 796 | 797 | /* 798 | IE does not trigger mouseup event when scrolling. 799 | It is a known issue that Microsoft won't fix. 800 | https://connect.microsoft.com/IE/feedback/details/783058/scrollbar-trigger-mousedown-but-not-mouseup 801 | IE supports pointer events instead 802 | */ 803 | window.addEventListener('pointerup', onUp, false); 804 | 805 | window.addEventListener('mousemove', onMove, false); 806 | window.addEventListener('touchmove', onMove, false); 807 | 808 | window.addEventListener('mouseleave', onMouseOut, false); 809 | 810 | window.addEventListener('scroll', setScroll, true); 811 | 812 | function setScroll(e){ 813 | 814 | for(var i=0; i rect.right - self.margin){ 950 | scrollx = Math.ceil( 951 | Math.min(1, (point.x - rect.right) / self.margin + 1) * self.maxSpeed 952 | ); 953 | }else{ 954 | scrollx = 0; 955 | } 956 | 957 | if(point.y < rect.top + self.margin){ 958 | scrolly = Math.floor( 959 | Math.max(-1, (point.y - rect.top) / self.margin - 1) * self.maxSpeed 960 | ); 961 | }else if(point.y > rect.bottom - self.margin){ 962 | scrolly = Math.ceil( 963 | Math.min(1, (point.y - rect.bottom) / self.margin + 1) * self.maxSpeed 964 | ); 965 | }else{ 966 | scrolly = 0; 967 | } 968 | 969 | if(self.syncMove()){ 970 | /* 971 | Notes about mousemove event dispatch. 972 | screen(X/Y) should need to be updated. 973 | Some other properties might need to be set. 974 | Keep the syncMove option default false until all inconsistencies are taken care of. 975 | */ 976 | dispatcher.dispatch(el, { 977 | pageX: point.pageX + scrollx, 978 | pageY: point.pageY + scrolly, 979 | clientX: point.x + scrollx, 980 | clientY: point.y + scrolly 981 | }); 982 | } 983 | 984 | setTimeout(function (){ 985 | 986 | if(scrolly){ 987 | scrollY(el, scrolly); 988 | } 989 | 990 | if(scrollx){ 991 | scrollX(el, scrollx); 992 | } 993 | 994 | }); 995 | } 996 | 997 | function scrollY(el, amount){ 998 | if(el === window){ 999 | window.scrollTo(el.pageXOffset, el.pageYOffset + amount); 1000 | }else{ 1001 | el.scrollTop += amount; 1002 | } 1003 | } 1004 | 1005 | function scrollX(el, amount){ 1006 | if(el === window){ 1007 | window.scrollTo(el.pageXOffset + amount, el.pageYOffset); 1008 | }else{ 1009 | el.scrollLeft += amount; 1010 | } 1011 | } 1012 | 1013 | } 1014 | 1015 | function AutoScrollerFactory(element, options){ 1016 | return new AutoScroller(element, options); 1017 | } 1018 | 1019 | function inside(point, el, rect){ 1020 | if(!rect){ 1021 | return pointInside(point, el); 1022 | }else{ 1023 | return (point.y > rect.top && point.y < rect.bottom && 1024 | point.x > rect.left && point.x < rect.right); 1025 | } 1026 | } 1027 | 1028 | /* 1029 | git remote add origin https://github.com/hollowdoor/dom_autoscroller.git 1030 | git push -u origin master 1031 | */ 1032 | 1033 | return AutoScrollerFactory; 1034 | 1035 | }()); 1036 | //# sourceMappingURL=dom-autoscroller.js.map 1037 | -------------------------------------------------------------------------------- /dist/dom-autoscroller.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"dom-autoscroller.js","sources":["../node_modules/type-func/dist/bundle.es.js","../node_modules/animation-frame-polyfill/lib/animation-frame-polyfill.module.js","../node_modules/array-from/polyfill.js","../node_modules/array-from/index.js","../node_modules/is-array/index.js","../node_modules/iselement/module/index.js","../node_modules/dom-set/dist/bundle.es.js","../node_modules/create-point-cb/dist/bundle.es.js","../node_modules/dom-plane/dist/bundle.es.js","../node_modules/dom-mousemove-dispatcher/dist/bundle.es.js","../src/index.js"],"sourcesContent":["function getDef(f, d) {\n if (typeof f === 'undefined') {\n return typeof d === 'undefined' ? f : d;\n }\n\n return f;\n}\nfunction boolean(func, def) {\n\n func = getDef(func, def);\n\n if (typeof func === 'function') {\n return function f() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !!func.apply(this, args);\n };\n }\n\n return !!func ? function () {\n return true;\n } : function () {\n return false;\n };\n}\n\nfunction integer(func, def) {\n\n func = getDef(func, def);\n\n if (typeof func === 'function') {\n return function f() {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var n = parseInt(func.apply(this, args), 10);\n return n != n ? 0 : n;\n };\n }\n\n func = parseInt(func, 10);\n\n return func != func ? function () {\n return 0;\n } : function () {\n return func;\n };\n}\n\nfunction string(func, def) {\n\n func = getDef(func, def);\n\n if (typeof func === 'function') {\n return function f() {\n for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return '' + func.apply(this, args);\n };\n }\n\n func = '' + func;\n\n return function () {\n return func;\n };\n}\n\nexport { boolean, integer, string };\n//# sourceMappingURL=bundle.es.js.map\n","var prefix = ['webkit', 'moz', 'ms', 'o'];\n\nexport var requestAnimationFrame = function () {\n\n for (var i = 0, limit = prefix.length; i < limit && !window.requestAnimationFrame; ++i) {\n window.requestAnimationFrame = window[prefix[i] + 'RequestAnimationFrame'];\n }\n\n if (!window.requestAnimationFrame) {\n (function () {\n var lastTime = 0;\n\n window.requestAnimationFrame = function (callback) {\n var now = new Date().getTime();\n var ttc = Math.max(0, 16 - now - lastTime);\n var timer = window.setTimeout(function () {\n return callback(now + ttc);\n }, ttc);\n\n lastTime = now + ttc;\n\n return timer;\n };\n })();\n }\n\n return window.requestAnimationFrame.bind(window);\n}();\n\nexport var cancelAnimationFrame = function () {\n\n for (var i = 0, limit = prefix.length; i < limit && !window.cancelAnimationFrame; ++i) {\n window.cancelAnimationFrame = window[prefix[i] + 'CancelAnimationFrame'] || window[prefix[i] + 'CancelRequestAnimationFrame'];\n }\n\n if (!window.cancelAnimationFrame) {\n window.cancelAnimationFrame = function (timer) {\n window.clearTimeout(timer);\n };\n }\n\n return window.cancelAnimationFrame.bind(window);\n}();\n","// Production steps of ECMA-262, Edition 6, 22.1.2.1\n// Reference: http://www.ecma-international.org/ecma-262/6.0/#sec-array.from\nmodule.exports = (function() {\n var isCallable = function(fn) {\n return typeof fn === 'function';\n };\n var toInteger = function (value) {\n var number = Number(value);\n if (isNaN(number)) { return 0; }\n if (number === 0 || !isFinite(number)) { return number; }\n return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n };\n var maxSafeInteger = Math.pow(2, 53) - 1;\n var toLength = function (value) {\n var len = toInteger(value);\n return Math.min(Math.max(len, 0), maxSafeInteger);\n };\n var iteratorProp = function(value) {\n if(value != null) {\n if(['string','number','boolean','symbol'].indexOf(typeof value) > -1){\n return Symbol.iterator;\n } else if (\n (typeof Symbol !== 'undefined') &&\n ('iterator' in Symbol) &&\n (Symbol.iterator in value)\n ) {\n return Symbol.iterator;\n }\n // Support \"@@iterator\" placeholder, Gecko 27 to Gecko 35\n else if ('@@iterator' in value) {\n return '@@iterator';\n }\n }\n };\n var getMethod = function(O, P) {\n // Assert: IsPropertyKey(P) is true.\n if (O != null && P != null) {\n // Let func be GetV(O, P).\n var func = O[P];\n // ReturnIfAbrupt(func).\n // If func is either undefined or null, return undefined.\n if(func == null) {\n return void 0;\n }\n // If IsCallable(func) is false, throw a TypeError exception.\n if (!isCallable(func)) {\n throw new TypeError(func + ' is not a function');\n }\n return func;\n }\n };\n var iteratorStep = function(iterator) {\n // Let result be IteratorNext(iterator).\n // ReturnIfAbrupt(result).\n var result = iterator.next();\n // Let done be IteratorComplete(result).\n // ReturnIfAbrupt(done).\n var done = Boolean(result.done);\n // If done is true, return false.\n if(done) {\n return false;\n }\n // Return result.\n return result;\n };\n\n // The length property of the from method is 1.\n return function from(items /*, mapFn, thisArg */ ) {\n 'use strict';\n\n // 1. Let C be the this value.\n var C = this;\n\n // 2. If mapfn is undefined, let mapping be false.\n var mapFn = arguments.length > 1 ? arguments[1] : void 0;\n\n var T;\n if (typeof mapFn !== 'undefined') {\n // 3. else\n // a. If IsCallable(mapfn) is false, throw a TypeError exception.\n if (!isCallable(mapFn)) {\n throw new TypeError(\n 'Array.from: when provided, the second argument must be a function'\n );\n }\n\n // b. If thisArg was supplied, let T be thisArg; else let T\n // be undefined.\n if (arguments.length > 2) {\n T = arguments[2];\n }\n // c. Let mapping be true (implied by mapFn)\n }\n\n var A, k;\n\n // 4. Let usingIterator be GetMethod(items, @@iterator).\n // 5. ReturnIfAbrupt(usingIterator).\n var usingIterator = getMethod(items, iteratorProp(items));\n\n // 6. If usingIterator is not undefined, then\n if (usingIterator !== void 0) {\n // a. If IsConstructor(C) is true, then\n // i. Let A be the result of calling the [[Construct]]\n // internal method of C with an empty argument list.\n // b. Else,\n // i. Let A be the result of the abstract operation ArrayCreate\n // with argument 0.\n // c. ReturnIfAbrupt(A).\n A = isCallable(C) ? Object(new C()) : [];\n\n // d. Let iterator be GetIterator(items, usingIterator).\n var iterator = usingIterator.call(items);\n\n // e. ReturnIfAbrupt(iterator).\n if (iterator == null) {\n throw new TypeError(\n 'Array.from requires an array-like or iterable object'\n );\n }\n\n // f. Let k be 0.\n k = 0;\n\n // g. Repeat\n var next, nextValue;\n while (true) {\n // i. Let Pk be ToString(k).\n // ii. Let next be IteratorStep(iterator).\n // iii. ReturnIfAbrupt(next).\n next = iteratorStep(iterator);\n\n // iv. If next is false, then\n if (!next) {\n\n // 1. Let setStatus be Set(A, \"length\", k, true).\n // 2. ReturnIfAbrupt(setStatus).\n A.length = k;\n\n // 3. Return A.\n return A;\n }\n // v. Let nextValue be IteratorValue(next).\n // vi. ReturnIfAbrupt(nextValue)\n nextValue = next.value;\n\n // vii. If mapping is true, then\n // 1. Let mappedValue be Call(mapfn, T, «nextValue, k»).\n // 2. If mappedValue is an abrupt completion, return\n // IteratorClose(iterator, mappedValue).\n // 3. Let mappedValue be mappedValue.[[value]].\n // viii. Else, let mappedValue be nextValue.\n // ix. Let defineStatus be the result of\n // CreateDataPropertyOrThrow(A, Pk, mappedValue).\n // x. [TODO] If defineStatus is an abrupt completion, return\n // IteratorClose(iterator, defineStatus).\n if (mapFn) {\n A[k] = mapFn.call(T, nextValue, k);\n }\n else {\n A[k] = nextValue;\n }\n // xi. Increase k by 1.\n k++;\n }\n // 7. Assert: items is not an Iterable so assume it is\n // an array-like object.\n } else {\n\n // 8. Let arrayLike be ToObject(items).\n var arrayLike = Object(items);\n\n // 9. ReturnIfAbrupt(items).\n if (items == null) {\n throw new TypeError(\n 'Array.from requires an array-like object - not null or undefined'\n );\n }\n\n // 10. Let len be ToLength(Get(arrayLike, \"length\")).\n // 11. ReturnIfAbrupt(len).\n var len = toLength(arrayLike.length);\n\n // 12. If IsConstructor(C) is true, then\n // a. Let A be Construct(C, «len»).\n // 13. Else\n // a. Let A be ArrayCreate(len).\n // 14. ReturnIfAbrupt(A).\n A = isCallable(C) ? Object(new C(len)) : new Array(len);\n\n // 15. Let k be 0.\n k = 0;\n // 16. Repeat, while k < len… (also steps a - h)\n var kValue;\n while (k < len) {\n kValue = arrayLike[k];\n if (mapFn) {\n A[k] = mapFn.call(T, kValue, k);\n }\n else {\n A[k] = kValue;\n }\n k++;\n }\n // 17. Let setStatus be Set(A, \"length\", len, true).\n // 18. ReturnIfAbrupt(setStatus).\n A.length = len;\n // 19. Return A.\n }\n return A;\n };\n})();\n","module.exports = (typeof Array.from === 'function' ?\n Array.from :\n require('./polyfill')\n);\n","\n/**\n * isArray\n */\n\nvar isArray = Array.isArray;\n\n/**\n * toString\n */\n\nvar str = Object.prototype.toString;\n\n/**\n * Whether or not the given `val`\n * is an array.\n *\n * example:\n *\n * isArray([]);\n * // > true\n * isArray(arguments);\n * // > false\n * isArray('');\n * // > false\n *\n * @param {mixed} val\n * @return {bool}\n */\n\nmodule.exports = isArray || function (val) {\n return !! val && '[object Array]' == str.call(val);\n};\n","var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n/**\n * Returns `true` if provided input is Element.\n * @name isElement\n * @param {*} [input]\n * @returns {boolean}\n */\nexport default function (input) {\n return input != null && (typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';\n}","import arrayFrom from 'array-from';\nimport isArray from 'is-array';\nimport isElement from 'iselement';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n/**\n * Returns `true` if provided input is Element.\n * @name isElement\n * @param {*} [input]\n * @returns {boolean}\n */\nvar isElement$1 = function (input) {\n return input != null && (typeof input === 'undefined' ? 'undefined' : _typeof(input)) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';\n};\n\nfunction select(selector){\n if(typeof selector === 'string'){\n try{\n return document.querySelector(selector);\n }catch(e){\n throw e;\n }\n }else if(isElement(selector)){\n return selector;\n }\n}\n\nfunction selectAll(selector){\n if(typeof selector === 'string'){\n return Array.prototype.slice.apply(\n document.querySelectorAll(selector)\n );\n }else if(isArray(selector)){\n return selector.map(select);\n }else if('length' in selector){\n return arrayFrom(selector).map(select);\n }\n}\n\nfunction indexOfElement(elements, element){\n element = resolveElement(element, true);\n if(!isElement$1(element)) { return -1; }\n for(var i=0; i 0 ) toAdd[ len ] = arguments[ len + 1 ];\n\n toAdd = toAdd.map(resolveElement);\n return pushElements(elements, toAdd);\n}\n\nfunction removeElements(elements){\n var toRemove = [], len = arguments.length - 1;\n while ( len-- > 0 ) toRemove[ len ] = arguments[ len + 1 ];\n\n return toRemove.map(resolveElement).reduce(function (last, e){\n\n var index = indexOfElement(elements, e);\n\n if(index !== -1)\n { return last.concat(elements.splice(index, 1)); }\n return last;\n }, []);\n}\n\nfunction resolveElement(element, noThrow){\n if(typeof element === 'string'){\n try{\n return document.querySelector(element);\n }catch(e){\n throw e;\n }\n\n }\n\n if(!isElement$1(element) && !noThrow){\n throw new TypeError((element + \" is not a DOM element.\"));\n }\n return element;\n}\n\nexport { indexOfElement, hasElement, domListOf, concatElementLists, addElements, removeElements, resolveElement, select, selectAll };\n//# sourceMappingURL=bundle.es.js.map\n","import { boolean } from 'type-func';\n\nfunction createPointCB(object, options) {\n\n // A persistent object (as opposed to returned object) is used to save memory\n // This is good to prevent layout thrashing, or for games, and such\n\n // NOTE\n // This uses IE fixes which should be OK to remove some day. :)\n // Some speed will be gained by removal of these.\n\n // pointCB should be saved in a variable on return\n // This allows the usage of element.removeEventListener\n\n options = options || {};\n\n var allowUpdate = boolean(options.allowUpdate, true);\n\n /*if(typeof options.allowUpdate === 'function'){\n allowUpdate = options.allowUpdate;\n }else{\n allowUpdate = function(){return true;};\n }*/\n\n return function pointCB(event) {\n\n event = event || window.event; // IE-ism\n object.target = event.target || event.srcElement || event.originalTarget;\n object.element = this;\n object.type = event.type;\n\n if (!allowUpdate(event)) {\n return;\n }\n\n // Support touch\n // http://www.creativebloq.com/javascript/make-your-site-work-touch-devices-51411644\n\n if (event.targetTouches) {\n object.x = event.targetTouches[0].clientX;\n object.y = event.targetTouches[0].clientY;\n object.pageX = event.targetTouches[0].pageX;\n object.pageY = event.targetTouches[0].pageY;\n object.screenX = event.targetTouches[0].screenX;\n object.screenY = event.targetTouches[0].screenY;\n } else {\n\n // If pageX/Y aren't available and clientX/Y are,\n // calculate pageX/Y - logic taken from jQuery.\n // (This is to support old IE)\n // NOTE Hopefully this can be removed soon.\n\n if (event.pageX === null && event.clientX !== null) {\n var eventDoc = event.target && event.target.ownerDocument || document;\n var doc = eventDoc.documentElement;\n var body = eventDoc.body;\n\n object.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n object.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);\n } else {\n object.pageX = event.pageX;\n object.pageY = event.pageY;\n }\n\n // pageX, and pageY change with page scroll\n // so we're not going to use those for x, and y.\n // NOTE Most browsers also alias clientX/Y with x/y\n // so that's something to consider down the road.\n\n object.x = event.clientX;\n object.y = event.clientY;\n\n object.screenX = event.screenX;\n object.screenY = event.screenY;\n }\n\n object.clientX = object.x;\n object.clientY = object.y;\n };\n\n //NOTE Remember accessibility, Aria roles, and labels.\n}\n\n/*\ngit remote add origin https://github.com/hollowdoor/create_point_cb.git\ngit push -u origin master\n*/\n\nexport default createPointCB;\n//# sourceMappingURL=bundle.es.js.map\n","import createPointCb from 'create-point-cb';\n\nfunction createWindowRect() {\n var props = {\n top: { value: 0, enumerable: true },\n left: { value: 0, enumerable: true },\n right: { value: window.innerWidth, enumerable: true },\n bottom: { value: window.innerHeight, enumerable: true },\n width: { value: window.innerWidth, enumerable: true },\n height: { value: window.innerHeight, enumerable: true },\n x: { value: 0, enumerable: true },\n y: { value: 0, enumerable: true }\n };\n\n if (Object.create) {\n return Object.create({}, props);\n } else {\n var rect = {};\n Object.defineProperties(rect, props);\n return rect;\n }\n}\n\nfunction getClientRect(el) {\n if (el === window) {\n return createWindowRect();\n } else {\n try {\n var rect = el.getBoundingClientRect();\n if (rect.x === undefined) {\n rect.x = rect.left;\n rect.y = rect.top;\n }\n return rect;\n } catch (e) {\n throw new TypeError(\"Can't call getBoundingClientRect on \" + el);\n }\n }\n}\n\nfunction pointInside(point, el) {\n var rect = getClientRect(el);\n return point.y > rect.top && point.y < rect.bottom && point.x > rect.left && point.x < rect.right;\n}\n\nexport { createPointCb as createPointCB, getClientRect, pointInside };\n//# sourceMappingURL=bundle.es.js.map\n","var objectCreate = void 0;\nif (typeof Object.create != 'function') {\n objectCreate = function (undefined) {\n var Temp = function Temp() {};\n return function (prototype, propertiesObject) {\n if (prototype !== Object(prototype) && prototype !== null) {\n throw TypeError('Argument must be an object, or null');\n }\n Temp.prototype = prototype || {};\n var result = new Temp();\n Temp.prototype = null;\n if (propertiesObject !== undefined) {\n Object.defineProperties(result, propertiesObject);\n }\n\n // to imitate the case of Object.create(null)\n if (prototype === null) {\n result.__proto__ = null;\n }\n return result;\n };\n }();\n} else {\n objectCreate = Object.create;\n}\n\nvar objectCreate$1 = objectCreate;\n\nvar mouseEventProps = ['altKey', 'button', 'buttons', 'clientX', 'clientY', 'ctrlKey', 'metaKey', 'movementX', 'movementY', 'offsetX', 'offsetY', 'pageX', 'pageY', 'region', 'relatedTarget', 'screenX', 'screenY', 'shiftKey', 'which', 'x', 'y'];\n\nfunction createDispatcher(element) {\n\n var defaultSettings = {\n screenX: 0,\n screenY: 0,\n clientX: 0,\n clientY: 0,\n ctrlKey: false,\n shiftKey: false,\n altKey: false,\n metaKey: false,\n button: 0,\n buttons: 1,\n relatedTarget: null,\n region: null\n };\n\n if (element !== undefined) {\n element.addEventListener('mousemove', onMove);\n }\n\n function onMove(e) {\n for (var i = 0; i < mouseEventProps.length; i++) {\n defaultSettings[mouseEventProps[i]] = e[mouseEventProps[i]];\n }\n }\n\n var dispatch = function () {\n if (MouseEvent) {\n return function m1(element, initMove, data) {\n var evt = new MouseEvent('mousemove', createMoveInit(defaultSettings, initMove));\n\n //evt.dispatched = 'mousemove';\n setSpecial(evt, data);\n\n return element.dispatchEvent(evt);\n };\n } else if (typeof document.createEvent === 'function') {\n return function m2(element, initMove, data) {\n var settings = createMoveInit(defaultSettings, initMove);\n var evt = document.createEvent('MouseEvents');\n\n evt.initMouseEvent(\"mousemove\", true, //can bubble\n true, //cancelable\n window, //view\n 0, //detail\n settings.screenX, //0, //screenX\n settings.screenY, //0, //screenY\n settings.clientX, //80, //clientX\n settings.clientY, //20, //clientY\n settings.ctrlKey, //false, //ctrlKey\n settings.altKey, //false, //altKey\n settings.shiftKey, //false, //shiftKey\n settings.metaKey, //false, //metaKey\n settings.button, //0, //button\n settings.relatedTarget //null //relatedTarget\n );\n\n //evt.dispatched = 'mousemove';\n setSpecial(evt, data);\n\n return element.dispatchEvent(evt);\n };\n } else if (typeof document.createEventObject === 'function') {\n return function m3(element, initMove, data) {\n var evt = document.createEventObject();\n var settings = createMoveInit(defaultSettings, initMove);\n for (var name in settings) {\n evt[name] = settings[name];\n }\n\n //evt.dispatched = 'mousemove';\n setSpecial(evt, data);\n\n return element.dispatchEvent(evt);\n };\n }\n }();\n\n function destroy() {\n if (element) element.removeEventListener('mousemove', onMove, false);\n defaultSettings = null;\n }\n\n return {\n destroy: destroy,\n dispatch: dispatch\n };\n}\n\nfunction createMoveInit(defaultSettings, initMove) {\n initMove = initMove || {};\n var settings = objectCreate$1(defaultSettings);\n for (var i = 0; i < mouseEventProps.length; i++) {\n if (initMove[mouseEventProps[i]] !== undefined) settings[mouseEventProps[i]] = initMove[mouseEventProps[i]];\n }\n\n return settings;\n}\n\nfunction setSpecial(e, data) {\n console.log('data ', data);\n e.data = data || {};\n e.dispatched = 'mousemove';\n}\n\n/*\nhttp://marcgrabanski.com/simulating-mouse-click-events-in-javascript/\n*/\n\nexport default createDispatcher;\n//# sourceMappingURL=bundle.es.js.map\n","import {boolean} from 'type-func';\r\nimport {\r\n requestAnimationFrame as requestFrame,\r\n cancelAnimationFrame as cancelFrame\r\n} from 'animation-frame-polyfill';\r\nimport {\r\n hasElement,\r\n addElements,\r\n removeElements\r\n} from 'dom-set';\r\n\r\nimport {\r\n createPointCB,\r\n getClientRect as getRect,\r\n pointInside\r\n} from 'dom-plane';\r\n\r\nimport mousemoveDispatcher from 'dom-mousemove-dispatcher';\r\n\r\nfunction AutoScroller(elements, options = {}){\r\n const self = this;\r\n let maxSpeed = 4, scrolling = false;\r\n\r\n this.margin = options.margin || -1;\r\n //this.scrolling = false;\r\n this.scrollWhenOutside = options.scrollWhenOutside || false;\r\n\r\n let point = {},\r\n pointCB = createPointCB(point),\r\n dispatcher = mousemoveDispatcher(),\r\n down = false;\r\n\r\n window.addEventListener('mousemove', pointCB, false);\r\n window.addEventListener('touchmove', pointCB, false);\r\n\r\n if(!isNaN(options.maxSpeed)){\r\n maxSpeed = options.maxSpeed;\r\n }\r\n\r\n this.autoScroll = boolean(options.autoScroll);\r\n this.syncMove = boolean(options.syncMove, false);\r\n\r\n this.destroy = function(forceCleanAnimation) {\r\n window.removeEventListener('mousemove', pointCB, false);\r\n window.removeEventListener('touchmove', pointCB, false);\r\n window.removeEventListener('mousedown', onDown, false);\r\n window.removeEventListener('touchstart', onDown, false);\r\n window.removeEventListener('mouseup', onUp, false);\r\n window.removeEventListener('touchend', onUp, false);\r\n window.removeEventListener('pointerup', onUp, false);\r\n window.removeEventListener('mouseleave', onMouseOut, false);\r\n\r\n window.removeEventListener('mousemove', onMove, false);\r\n window.removeEventListener('touchmove', onMove, false);\r\n\r\n window.removeEventListener('scroll', setScroll, true);\r\n elements = [];\r\n if(forceCleanAnimation){\r\n cleanAnimation();\r\n }\r\n };\r\n\r\n this.add = function(...element){\r\n addElements(elements, ...element);\r\n return this;\r\n };\r\n\r\n this.remove = function(...element){\r\n return removeElements(elements, ...element);\r\n };\r\n\r\n let hasWindow = null, windowAnimationFrame;\r\n\r\n if(Object.prototype.toString.call(elements) !== '[object Array]'){\r\n elements = [elements];\r\n }\r\n\r\n (function(temp){\r\n elements = [];\r\n temp.forEach(function(element){\r\n if(element === window){\r\n hasWindow = window;\r\n }else{\r\n self.add(element);\r\n }\r\n })\r\n }(elements));\r\n\r\n Object.defineProperties(this, {\r\n down: {\r\n get: function(){ return down; }\r\n },\r\n maxSpeed: {\r\n get: function(){ return maxSpeed; }\r\n },\r\n point: {\r\n get: function(){ return point; }\r\n },\r\n scrolling: {\r\n get: function(){ return scrolling; }\r\n }\r\n });\r\n\r\n let n = 0, current = null, animationFrame;\r\n\r\n window.addEventListener('mousedown', onDown, false);\r\n window.addEventListener('touchstart', onDown, false);\r\n window.addEventListener('mouseup', onUp, false);\r\n window.addEventListener('touchend', onUp, false);\r\n\r\n /*\r\n IE does not trigger mouseup event when scrolling.\r\n It is a known issue that Microsoft won't fix.\r\n https://connect.microsoft.com/IE/feedback/details/783058/scrollbar-trigger-mousedown-but-not-mouseup\r\n IE supports pointer events instead\r\n */\r\n window.addEventListener('pointerup', onUp, false);\r\n\r\n window.addEventListener('mousemove', onMove, false);\r\n window.addEventListener('touchmove', onMove, false);\r\n\r\n window.addEventListener('mouseleave', onMouseOut, false);\r\n\r\n window.addEventListener('scroll', setScroll, true);\r\n\r\n function setScroll(e){\r\n\r\n for(let i=0; iscrolling = false)\r\n }\r\n }\r\n\r\n function onDown(){\r\n down = true;\r\n }\r\n\r\n function onUp(){\r\n down = false;\r\n cleanAnimation();\r\n }\r\n function cleanAnimation(){\r\n cancelFrame(animationFrame);\r\n cancelFrame(windowAnimationFrame);\r\n }\r\n function onMouseOut(){\r\n down = false;\r\n }\r\n\r\n function getTarget(target){\r\n if(!target){\r\n return null;\r\n }\r\n\r\n if(current === target){\r\n return target;\r\n }\r\n\r\n if(hasElement(elements, target)){\r\n return target;\r\n }\r\n\r\n while(target = target.parentNode){\r\n if(hasElement(elements, target)){\r\n return target;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function getElementUnderPoint(){\r\n let underPoint = null;\r\n\r\n for(var i=0; i rect.right - self.margin){\r\n scrollx = Math.ceil(\r\n Math.min(1, (point.x - rect.right) / self.margin + 1) * self.maxSpeed\r\n );\r\n }else{\r\n scrollx = 0;\r\n }\r\n\r\n if(point.y < rect.top + self.margin){\r\n scrolly = Math.floor(\r\n Math.max(-1, (point.y - rect.top) / self.margin - 1) * self.maxSpeed\r\n );\r\n }else if(point.y > rect.bottom - self.margin){\r\n scrolly = Math.ceil(\r\n Math.min(1, (point.y - rect.bottom) / self.margin + 1) * self.maxSpeed\r\n );\r\n }else{\r\n scrolly = 0;\r\n }\r\n\r\n if(self.syncMove()){\r\n /*\r\n Notes about mousemove event dispatch.\r\n screen(X/Y) should need to be updated.\r\n Some other properties might need to be set.\r\n Keep the syncMove option default false until all inconsistencies are taken care of.\r\n */\r\n dispatcher.dispatch(el, {\r\n pageX: point.pageX + scrollx,\r\n pageY: point.pageY + scrolly,\r\n clientX: point.x + scrollx,\r\n clientY: point.y + scrolly\r\n });\r\n }\r\n\r\n setTimeout(()=>{\r\n\r\n if(scrolly){\r\n scrollY(el, scrolly);\r\n }\r\n\r\n if(scrollx){\r\n scrollX(el, scrollx);\r\n }\r\n\r\n });\r\n }\r\n\r\n function scrollY(el, amount){\r\n if(el === window){\r\n window.scrollTo(el.pageXOffset, el.pageYOffset + amount);\r\n }else{\r\n el.scrollTop += amount;\r\n }\r\n }\r\n\r\n function scrollX(el, amount){\r\n if(el === window){\r\n window.scrollTo(el.pageXOffset + amount, el.pageYOffset);\r\n }else{\r\n el.scrollLeft += amount;\r\n }\r\n }\r\n\r\n}\r\n\r\nexport default function AutoScrollerFactory(element, options){\r\n return new AutoScroller(element, options);\r\n}\r\n\r\nfunction inside(point, el, rect){\r\n if(!rect){\r\n return pointInside(point, el);\r\n }else{\r\n return (point.y > rect.top && point.y < rect.bottom &&\r\n point.x > rect.left && point.x < rect.right);\r\n }\r\n}\r\n\r\n/*\r\ngit remote add origin https://github.com/hollowdoor/dom_autoscroller.git\r\ngit push -u origin master\r\n*/\r\n"],"names":["arguments","require$$0","arrayFrom","isArray","index","const","let","mousemoveDispatcher","requestFrame","cancelFrame","getRect"],"mappings":"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"} --------------------------------------------------------------------------------