viewport-funcs
Version:
A very limited subset of viewport functions I use every day
134 lines (92 loc) • 3.7 kB
Markdown
# viewport-funcs
> A very limited subset of viewport functions I use every day
## Install
```bash
npm i viewport-funcs
```
Package [on npm](https://www.npmjs.com/package/viewport-funcs)
## API
* [contains](#containsel-offset)
* [margins](#margins)
* [rect](#rect)
#### contains(el, [offset], [check])
Check if `el` is in the viewport, return a boolean
| Argument | Action |
| :------ | :------- |
| **el** | the tested **Html Element** `el` |
| **offset** | optional `offset`, default to `0` |
| **check** | optional `check`, default to `false`. If `true` performs multiple tests explained below |
If `check` is `true`, safer but slower tests are performed
* check if `el` is a **Html Element**, with nodeType 1 and landed in the document.body
* check if `el` has no size. An empty or a `display:none` div or an img with no src will always return `false`
```js
const contains = require('viewport-funcs/contains')
var el = document.querySelector('.rect')
// true if the element is fully or partially in the viewport
contains(el)
```
---
#### margins()
Get the viewport size and margins
`left`, `top`, `right` and `bottom` are relative to each side of the document
The object returned contains:
| Key | Value |
| :------ | :------- |
| **width** | the viewport width |
| **height** | the viewport height |
| **left** | the `margin-left`, distance between the left of the document and the left of the viewport |
| **top** | the `margin-top`, distance between the top of the document and the top of the viewport |
| **right** | the `margin-right`, distance between the right of the document and the right of the viewport |
| **bottom** | the `margin-bottom`, distance between the bottom of the document and the bottom of the viewport |
The example below shows:
* how to get the viewport bottom-right corner location
* how to get the document width and height
```js
const margins = require('viewport-funcs/margins')
// {width: 591, height: 328, left: 0, top: 56, right: 0, bottom: 316}
var data = margins()
/*
the viewport bottom-right corner location
{x: 591, y: 384}
*/
var br = {x: data.left + data.width, y: data.top + data.height}
/*
the document width and height
{width: 591, height: 700}
*/
var doc = {
width: data.left + data.width + data.right,
height: data.top + data.height + data.bottom
}
```
The returned object is internally cached to boost performance
---
#### rect()
Get the viewport size and position
`left`, `top`, `right` and `bottom` are relative to the top-left of the document
The object returned contains:
| Key | Value |
| :------ | :------- |
| **width** | the viewport width |
| **height** | the viewport height |
| **left** | the distance between the left of the document and the left of the viewport |
| **top** | the distance between the top of the document and the top of the viewport |
| **right** | the distance between the left of the document and the right of the viewport |
| **bottom** | the distance between the top of the document and the bottom of the viewport |
This means:
* `right` = `left` + `width`
* `bottom` = `top` + `height`
The returned object is internally cached to boost performance
```js
const rect = require('viewport-funcs/rect')
// {width: 800, height: 600, left: 10, top: 10, right: 810, bottom: 610}
rect()
```
## Thanks
Mainly forked / inspired on
- [in-viewport](https://github.com/vvo/in-viewport)
Performance and tips from
- [documentWidth/Height is the max of 3 tested sizes](http://ryanve.com/lab/dimensions/#document)
- [check if the element is visible](https://github.com/jquery/jquery/blob/0402963845be8d71c4e8ddf65e7c055014739b60/src/css/hiddenVisibleSelectors.js#L10)
## License
MIT