├── .gitignore ├── README.md ├── index.js ├── package-lock.json ├── package.json └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.map 3 | node_modules/ 4 | dist 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # srraf 2 | Monitor scrolling and resizing without event listeners. **300 bytes gzipped.** 3 | 4 | ## Install 5 | ```bash 6 | npm i srraf --save 7 | ``` 8 | 9 | # Usage 10 | ```javascript 11 | import srraf from 'srraf' 12 | 13 | const scroller = srraf(({ x, px, y, py, vh, pvh, vw, pvw }, timestamp) => { 14 | // ... 15 | }) 16 | 17 | scroller.update() // check position 18 | scroller.destroy() // destroy listener 19 | ``` 20 | 21 | Note: values prefixed with `p` denote *previous* values. 22 | 23 | ## License 24 | MIT License © [Eric Bailey](https://estrattonbailey.com) 25 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | let frame 2 | 3 | let x 4 | let px 5 | let y 6 | let py 7 | let vh 8 | let pvh 9 | let vw 10 | let pvw 11 | 12 | const fns = [] 13 | 14 | function raf (t, force) { 15 | x = window.pageXOffset 16 | y = window.pageYOffset 17 | vh = window.innerHeight 18 | vw = window.innerWidth 19 | 20 | if (px === undefined) px = x 21 | if (py === undefined) py = y 22 | if (pvw === undefined) pvw = vw 23 | if (pvh === undefined) pvh = vh 24 | 25 | if ( 26 | force || 27 | y !== py || 28 | x !== px || 29 | vh !== pvh || 30 | vw !== pvw 31 | ) { 32 | run(t) 33 | 34 | px = x 35 | py = y 36 | pvh = vh 37 | pvw = vw 38 | } 39 | 40 | return requestAnimationFrame(raf) 41 | } 42 | 43 | function run (t) { 44 | for (let i = 0; i < fns.length; i++) { 45 | fns[i]({ x, y, px, py, vh, pvh, vw, pvw }, t) 46 | } 47 | } 48 | 49 | export default function srraf (fn) { 50 | fns.indexOf(fn) < 0 && fns.push(fn) 51 | frame = frame || raf(performance.now()) 52 | return { 53 | update () { 54 | raf(performance.now(), true) 55 | return this 56 | }, 57 | destroy () { 58 | fns.splice(fns.indexOf(fn), 1) 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "srraf", 3 | "version": "3.2.0", 4 | "description": "Better scroll and resize handling", 5 | "source": "index.js", 6 | "module": "dist/srraf.es.js", 7 | "main": "dist/srraf.js", 8 | "umd:main": "dist/srraf.umd.js", 9 | "files": [ 10 | "dist" 11 | ], 12 | "scripts": { 13 | "build": "microbundle build", 14 | "watch": "microbundle watch --compress false", 15 | "test": "ava", 16 | "postbuild": "npm run test" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+ssh://git@github.com/estrattonbailey/srraf.git" 21 | }, 22 | "author": "estrattonbailey", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/estrattonbailey/srraf/issues" 26 | }, 27 | "homepage": "https://github.com/estrattonbailey/srraf#readme", 28 | "devDependencies": { 29 | "ava": "^1.4.1", 30 | "microbundle": "^0.9.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | import test from 'ava' 2 | import srraf from './dist/srraf.js' 3 | 4 | global.performance = { 5 | now () {} 6 | } 7 | global.requestAnimationFrame = () => {} 8 | global.window = {} 9 | 10 | test('init', t => { 11 | t.plan(2) 12 | 13 | // calls update AND returns this 14 | const scroller = srraf(() => { 15 | t.pass() 16 | }).update() 17 | 18 | scroller.update() // fires again 19 | scroller.destroy() // kill it 20 | scroller.update() // shouldn't fire 21 | }) 22 | --------------------------------------------------------------------------------