Package Exports
- normalize-scroll-left
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (normalize-scroll-left) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Normalize Scroll Left for Right-to-Left
This library normalizes the Element.scrollLeft
property when direction is rtl
.
All the hardwork are based on this juqery plugin and this stackoverflow answer.
Since Element.scrollLeft
's behavior with dir="rtl"
is not defined in any spec we use
a feature detection logic to determine the behavior of the current browser.
Types of scrollLeft
(scrollWidth
= 100) (Copied from
here)
Browser | Type | Most Left | Most Right | Initial |
---|---|---|---|---|
WebKit | default | 0 | 100 | 100 |
Firefox/Opera | negative | -100 | 0 | 0 |
IE/Edge | reverse | 100 | 0 | 0 |
Installation
You can install this package with the following command:
npm install normalize-scroll-left
API
This library exposes these methods:
detectScrollType
type ScrollType = 'indeterminate' | 'default' | 'negative' | 'reverse';
function detectScrollType(): ScrollType;
This function returns the scroll type detected, Keep in mind, this function caches the result as it should render a dummy on the DOM (which is expensive). Make sure the first invocation of this function happens after the body is loaded.
note: To support server-side-rendering, it will output indeterminate
if
it detects a non-browser environment.
import { detectScrollType } from 'normalize-scroll-left';
const type = detectScrollType();
The output is not based on the browser, but feature detection:
Browser | Type |
---|---|
WebKit | default |
Firefox/Opera | negative |
IE/Edge | reverse |
Other/Server | indeterminate |
getNormalizedScrollLeft
function getNormalizedScrollLeft(element: HTMLElement, direction: 'rtl' | 'ltr'): number;
You can use this method to get the normalized scrollLeft
property of an element.
You should explicitly pass the direction for the following reasons:
- Querying the
getComputedStyle
is expensive and might cause a reflow. - The behavior shouldn't be changed when direction is
ltr
.
The output is NaN
on the server. Otherwise, it will mimic the behavior of
WebKit
as it's the esiest to work with.
import { getNormalizedScrollLeft } from 'normalize-scroll-left';
const element = document.getElementById('my-scrollable-container');
// element.scrollWidth = 100;
const scrollLeft = getNormalizedScrollLeft(element, 'rtl');
// scrollLeft will always be from 0 (Most Left) to 100 (Most Right).
// It will initially be 100, That means the most right.
setNormalizedScrollLeft
function setNormalizedScrollLeft(
element: HTMLElement,
scrollLeft: number,
direction: 'rtl' | 'ltr',
): void;
You can use this method to set the scrollLeft
property of an element as normalized.
You should explicitly pass the direction for the same reasons as getNormalizedScrollLeft
:
For scrollWidth = 100
the argument scrollLeft
must be between 0
and 100
. This
function will automatically convert it into something the current browser understands.
import { setNormalizedScrollLeft } from 'normalize-scroll-left';
const element = document.getElementById('my-scrollable-container');
// element.scrollWidth = 100, element.clientWidth = 20;
setNormalizedScrollLeft(element, 20, 'rtl');
// Will set element.scrollLeft to ...
// 20 in WebKit (chrome)
// -60 in Firefox/Opera
// 60 in IE/Edge
// Does nothing on the server
Typings
The typescript type definitions are also available and are installed via npm.
License
This project is licensed under the MIT license.