React Ticker
React Ticker is a lightweight, performant React component, that moves text, images and videos infinitely like a newsticker.
It can be used to replace the deprecated marquee
-HTML-tag.
Check out the Demo!
Features:
- Move its child-elements from right to left or left to right.
- Dynamically create child-elements, for example from an API.
(Does not work for dynamic widths yet!)
- Repeat the elements infinitely.
- Three different modes of repetition.
- Control speed, starting and stopping.
- Define start offset.
Getting started
-
Install the package with npm or yarn
npm install react-ticker
yarn add react-ticker
-
Use it in your React components!
import React from 'react'
import Ticker from 'react-ticker'
const MoveStuffAround = () => (
<Ticker>
{({ index }) => (
<>
<h1>This is the Headline of element #{index}!</h1>
<img src="www.my-image-source.com/" alt=""/>
</>
)}
</Ticker>
)
export default MoveStuffAround
Take a look at the CodeSandbox.
Props
Name | Type | Default | Description |
---|
speed | number | 5 | |
direction | string | toLeft | Opposite direction: toRight |
mode | string | chain | chain By default, the elements follow one and another immediately. await A new element appears as soon as the previous one has disappeared completely. smooth A new element appears as soon as the previous one starts to disappear. |
height | string or number | auto | Auto-height: By default, the Ticker will adapt the height of its highest visible child. Fixed height: Alternatively you can give it a fixed height: A number will be set as pixels, a string can be everything. |
offset | string or number | 0 | By default, the first element in the Ticker will align to the Tickers left side. Fixed Offset: A number will move the Ticker's first child to the right by n pixel. Relative Offset: The offset can also be defined in percent of the Ticker’s width. Run-in: The string run-in hides the first element, so the Ticker starts empty. |
move | boolean | true | Set to false stops the Ticker. |
onNext | function | (index) => {} | Return the index of the next element to the parent component |
onFinish | function | () => {} | Tell the parent component that one element is out of screen |
Gotchas
Await loading webfonts
If you want to move text around, be sure, that your webfonts have loaded, before you initiate the Ticker-component! Otherwise the widths might be calculated wrong for the first iteration.
To await your webfonts, try out Web Font Loader.
Avoid linebreaks
If you want to avoid linebreaks in your text-elements, use the CSS-property white-space: nowrap;
.
Dynamic loading of elements
It is possible to dynamically load new elements. This feature is still experimental. It only works properly, if you use the property offset="run-in"
and provide a placeholder while loading.
const GetRatesFromAPI = () => {
const [rates, setRates] = useState("");
useEffect(() => {
async function fetchData() {
const ratesFromAPI = await makeAPICall();
setRates(ratesFromAPI);
}
fetchData();
}, []);
return rates ? (
<p style={{ whiteSpace: "nowrap" }}>{rates.join(" +++ ")} +++ </p>
) : (
<p style={{ visibility: "hidden" }}>Placeholder</p>
);
};
function StockTicker() {
return (
<Ticker offset="run-in" speed={10}>
{() => <GetRatesFromAPI />}
</Ticker>
);
}
export default StockTicker;
React Ticker calls its function-as-child anytime it runs out of content. It does not matter, if this function is a static component or a component, that loads content from an API.
It is important, that you provide a placeholder during the loading time of the API-call, to trigger the mutation observer when the content has arrived.
Render only if browser-tab is visible
Currently react-ticker
runs out of elements, when you leave the browser tab. To fix it, there is this workaround using the Page Visibility API utilized by this great Module: react-page-visibility
import React, { useState } from 'react'
import Ticker from 'react-ticker'
import PageVisibility from 'react-page-visibility'
const MoveStuffAround = () => {
const [pageIsVisible, setPageIsVisible] = useState(true)
const handleVisibilityChange = (isVisible) => {
setPageIsVisible(isVisible)
}
return (
<PageVisibility onChange={handleVisibilityChange}>
{pageIsVisible && (
<Ticker>
{({ index }) => (
<>
<h1>This is the Headline of element #{index}!</h1>
<img src="www.my-image-source.com/" alt=""/>
</>
)}
</Ticker>
)}
</PageVisibility>
)
}
export default MoveStuffAround
Dependencies
React Ticker has no dependecies besides React 16+ (the minimum minor-release still has to be looked up).
Browser Support
React Ticker should work in all current browsers as well as Internet Explorer 11. If you discover bugs in older browser versions, please file an issue!
Contributing
Every contribution is very much appreciated.
Feel free to file bugs, feature- and pull-requests.
If this plugin is helpful for you, please star it on GitHub.
License
MIT © https://github.com/AndreasFaust