https://github.com/lbrian/content-visibility
Web Component uses CSS content-visibility and fallback Intersection Observer
https://github.com/lbrian/content-visibility
css intersection-observer intersectionobserver-api javascript lit-element lit-html typescript webcomponent webcomponents
Last synced: about 1 month ago
JSON representation
Web Component uses CSS content-visibility and fallback Intersection Observer
- Host: GitHub
- URL: https://github.com/lbrian/content-visibility
- Owner: LBrian
- License: mit
- Created: 2021-01-04T12:14:58.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2023-03-05T18:43:35.000Z (about 2 years ago)
- Last Synced: 2025-04-12T02:06:19.830Z (about 1 month ago)
- Topics: css, intersection-observer, intersectionobserver-api, javascript, lit-element, lit-html, typescript, webcomponent, webcomponents
- Language: HTML
- Homepage:
- Size: 34.5 MB
- Stars: 28
- Watchers: 3
- Forks: 2
- Open Issues: 16
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# content-visibility
[](https://www.webcomponents.org/element/content-visibility)


`` is a simple **web component** encapsulates modern CSS properties `content-visibility` and Web API **Intersection Observer API** to provide cross-browsers solution to skip rendering (layout & painting) elements until it is needed (appears on the viewport) to boosts page performance.
CSS `content-visibility` is only supported on Chrome 85+, Chrome Android 85+ and Opera 71+ but not Firefox, Safari and IE unfortunately, see [web.dev](https://web.dev/content-visibility/). **Intersection Observer API** supports pretty much all browsers except **IE**, thus an intersection observer [polyfill](https://www.npmjs.com/package/intersection-observer) is included for compatible on IE.
Basically, all children inside it will only be renderred after it appears on viewport.
```html
{children will not be rendered when outside the first viewport}
```
## Compatibility
![]()
![]()
![]()
![]()
![]()
![]()
# Getting started
## Install
`npm i content-visibility --save`
## Use in JSX (React/Preact)
```jsx
import 'content-visibility';const Content = () => {
return (
...
...
...
);
};
```## properties
### `containIntrinsicSize`
This is will be set as CSS custom variable for `contain-intrinsic-size` if browsers support it. [see](https://web.dev/content-visibility/#specifying-the-natural-size-of-an-element-with-contain-intrinsic-size)
```html
{children}
```
# Performance results
## Rendering frames
**Safari** comes with `Rendering Frames Timeline` tool helps to measure rendering performance. Let's have a look the rendering frames **without** ``, total `97` rendering frames happened on the first view.
Only `47` rendering frames happened on the first view after integrated with ``

the rest of `50` rendering frames happened when **scorlling to the viewport**
## Rendering & Layout time
Generally speaking, we can plausibly say rendering & layout time improved around `40%`, however benchmark results vary depends on sampling size, environments, tools, implementation and etc. Too many factors could impact benchmark results, so this is just a quick sample results to demonstrate the performance differences.
### Chrome 87.0.4280.141
CSS `content-visibility` and `contain-intrinsic-size`
#### Before

#### After
**Rendering** and **Painting** time reduced around `50%`.

### Firefox 84.0.2
#### Before

#### After

# License
Copyright (c) 2021 [Brian YP Liu](https://brianypliu.com/)