Repository files navigation

FinBars

Styleable scrollbars for real or virtual content

Try the demo.

[See the note Regarding submodules for important information on cloning this repo or re-purposing its build template.]

API documentation

Detailed API docs can be found here.

Import

Use one or the other:

CommonJS npm module

For consumption by bundler on build machine.

From Bash prompt:

npm install --save-prod finbars

From within a code module:

constFinBar=require('finbars');

Runtime import

As an alternative to using the npm module, the client may request a versioned build file that sets the global window.FinBar:

<scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.js"></script><scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.min.js"></script>

Any SEMVER string can be used. 2.0 in the above means load the latest of the 2.0.* range. See the npm semver calculator and npm’s semantic versioning page.

Synopsis

The following sets up a vertical scrollbar to scroll "real" content with the default handler, vertbar.scrollRealContent, which is wired up for you automatically when you give content option but no onchange option).

varcontainer=document.getElementsByTagName('div')[0],content=container.firstChild,vertBar=newFinBar({orientation: 'vertical',content: content});container.appendChild(vertBar.bar);vertbar.resize();window.onresize=function(){vertbar.resize();};

Mark up:

<divstyle="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"><imgsrc="something-taller-than-document.png" /></div>

For this example, we use CSS to dynamically stick the container size to the document so that it is resized as the window is resized.

To set up a horizontal scrollbar as well, just do everything twice.

Introduction

What you do with these scrollbars is completely up to you. They are essentially "range" controls. The scrolling effect is implemented purely in the callback (which you supply). Therefore, they can be used for any purpose, such as to perform "virtual scrolling" (see below).

The example (src/index.html) shows three scrolling <div>…</div> elements:

System scrollbars (no finbars)

The first <div>...</div> doesn't use finbars at all. It is scrolled by the browser using normal operating system scrollbars. These can be made to appear with the following CSS "overflow" style settings:

overflow-x: scroll
overflow-y: scroll

Or "automatically" only when content would overflow the box:

overflow-x: auto
overflow-y: auto
DIY scrolling with finbars

The second <div>...</div> uses finbars instead of system scrollbars. The finbars need to be instantiated, appended to the content element, and rendered using the resize() method. Each callback invocation shifts the content by resetting its position (left and top) styles. In this case the "overflow" styles must be set as follows:

overflow-x: hidden
overflow-y: hidden
Virtual scrolling with finbars

The third <div>...</div> uses finbars to "scroll" virtual content. This means that instead of shifting the content around in response to each callback invocation, the content is regenerated instead in such a way that it appears to be moving in response the scrollbars.

If you generated content is not precise enough to stay within the bounds of the content element, set the "overflow" styles to "hidden" as above. Otherwise you can leave them set to their defaults ("visible").

Finbar styling

You can style your scrollbars with CSS. You can either redefine the existing selectors for div.finbar-vertical and div.finbar-horizontal in src/css/finbars.cssOR you can add your own selectors with a name of your choosing (in place of "finbar") and give that name to the constructor when instantiating your scrollbar object. This second method allows you to have multiple scrollbar styles on a single page.

Your styles should specify the size, color, and opacity of the scrollbar and its thumb.

NOTE: The only CSS style that is required is position: absolute which is set by the constructor, overriding any value from your stylesheets. You can also specify the initial position of the thumb (typically at top: 0 for vertical scrollbars and left: 0 for horizontal scrollbars).

CAUTION: Be sure your existing CSS selectors do not resolve to the scrollbar's element, which consists of a <div>...</div> with a single nested <div>...</div> for the thumb.

Testing

The unit test included currently (test/index.js) is rudimentary and needs to be expanded.

An HTML file is included as an example. I user-tested this example file on:

  • Mac OS High Sierra (10.13.6)
    • Chrome (70.0.3538.77)
    • Safari (12.0 - 13606.2.11)
    • Opera (56.0.3051.52)
    • Firefox (63.0)
  • Windows 7 (SP1)
    • Chrome (67.0.3396.87)
    • Firefox (52.8.0)
    • IE 11 (11.0.9600.19155CO)
  • Windows 10
    • Chrome (70.0.3538.77)
    • Opera (56.0.3051.70)
    • Firefox (63.0)
    • IE 11 (11.345.17134.0)
    • Edge (42.17134.1.0)

Version History

  • 2.0.0 (10/28/2018)
    • This major version update applies platform/browser normalization to deltaXFactor, deltaYFactor, and deltaZFactor, a breaking behavioral change for any app that was previously applying its own normalization factoring to this prop values. See FinBar.normals and normal.
  • 1.6.3 (10/28/2018)
    • Remove stylesheet requirement that .bar and .thumb classes must maintain position: abolute by setting/overriding it on the style attribute as the objects are created in code.
  • 1.6.2 (10/8/2018)
    • Keep .hover class on thumb throughout drag.
  • 1.6.1 (10/8/2018)
    • Capture off-grid mouseup during scrollbar thumb drag.
  • 1.6.0 (5/24/2018)
    • Add deltaXFactor, deltaYFactor, and deltaZFactor properties to fine tune wheel metrics.

About

Styleable scrollbars

Resources

Stars

11 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

FinBars

Styleable scrollbars for real or virtual content

Try the demo.

[See the note Regarding submodules for important information on cloning this repo or re-purposing its build template.]

API documentation

Detailed API docs can be found here.

Import

Use one or the other:

CommonJS npm module

For consumption by bundler on build machine.

From Bash prompt:

npm install --save-prod finbars

From within a code module:

constFinBar=require('finbars');

Runtime import

As an alternative to using the npm module, the client may request a versioned build file that sets the global window.FinBar:

<scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.js"></script><scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.min.js"></script>

Any SEMVER string can be used. 2.0 in the above means load the latest of the 2.0.* range. See the npm semver calculator and npm’s semantic versioning page.

Synopsis

The following sets up a vertical scrollbar to scroll "real" content with the default handler, vertbar.scrollRealContent, which is wired up for you automatically when you give content option but no onchange option).

varcontainer=document.getElementsByTagName('div')[0],content=container.firstChild,vertBar=newFinBar({orientation: 'vertical',content: content});container.appendChild(vertBar.bar);vertbar.resize();window.onresize=function(){vertbar.resize();};

Mark up:

<divstyle="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"><imgsrc="something-taller-than-document.png" /></div>

For this example, we use CSS to dynamically stick the container size to the document so that it is resized as the window is resized.

To set up a horizontal scrollbar as well, just do everything twice.

Introduction

What you do with these scrollbars is completely up to you. They are essentially "range" controls. The scrolling effect is implemented purely in the callback (which you supply). Therefore, they can be used for any purpose, such as to perform "virtual scrolling" (see below).

The example (src/index.html) shows three scrolling <div>…</div> elements:

System scrollbars (no finbars)

The first <div>...</div> doesn't use finbars at all. It is scrolled by the browser using normal operating system scrollbars. These can be made to appear with the following CSS "overflow" style settings:

overflow-x: scroll
overflow-y: scroll

Or "automatically" only when content would overflow the box:

overflow-x: auto
overflow-y: auto
DIY scrolling with finbars

The second <div>...</div> uses finbars instead of system scrollbars. The finbars need to be instantiated, appended to the content element, and rendered using the resize() method. Each callback invocation shifts the content by resetting its position (left and top) styles. In this case the "overflow" styles must be set as follows:

overflow-x: hidden
overflow-y: hidden
Virtual scrolling with finbars

The third <div>...</div> uses finbars to "scroll" virtual content. This means that instead of shifting the content around in response to each callback invocation, the content is regenerated instead in such a way that it appears to be moving in response the scrollbars.

If you generated content is not precise enough to stay within the bounds of the content element, set the "overflow" styles to "hidden" as above. Otherwise you can leave them set to their defaults ("visible").

Finbar styling

You can style your scrollbars with CSS. You can either redefine the existing selectors for div.finbar-vertical and div.finbar-horizontal in src/css/finbars.cssOR you can add your own selectors with a name of your choosing (in place of "finbar") and give that name to the constructor when instantiating your scrollbar object. This second method allows you to have multiple scrollbar styles on a single page.

Your styles should specify the size, color, and opacity of the scrollbar and its thumb.

NOTE: The only CSS style that is required is position: absolute which is set by the constructor, overriding any value from your stylesheets. You can also specify the initial position of the thumb (typically at top: 0 for vertical scrollbars and left: 0 for horizontal scrollbars).

CAUTION: Be sure your existing CSS selectors do not resolve to the scrollbar's element, which consists of a <div>...</div> with a single nested <div>...</div> for the thumb.

Testing

The unit test included currently (test/index.js) is rudimentary and needs to be expanded.

An HTML file is included as an example. I user-tested this example file on:

  • Mac OS High Sierra (10.13.6)
    • Chrome (70.0.3538.77)
    • Safari (12.0 - 13606.2.11)
    • Opera (56.0.3051.52)
    • Firefox (63.0)
  • Windows 7 (SP1)
    • Chrome (67.0.3396.87)
    • Firefox (52.8.0)
    • IE 11 (11.0.9600.19155CO)
  • Windows 10
    • Chrome (70.0.3538.77)
    • Opera (56.0.3051.70)
    • Firefox (63.0)
    • IE 11 (11.345.17134.0)
    • Edge (42.17134.1.0)

Version History

  • 2.0.0 (10/28/2018)
    • This major version update applies platform/browser normalization to deltaXFactor, deltaYFactor, and deltaZFactor, a breaking behavioral change for any app that was previously applying its own normalization factoring to this prop values. See FinBar.normals and normal.
  • 1.6.3 (10/28/2018)
    • Remove stylesheet requirement that .bar and .thumb classes must maintain position: abolute by setting/overriding it on the style attribute as the objects are created in code.
  • 1.6.2 (10/8/2018)
    • Keep .hover class on thumb throughout drag.
  • 1.6.1 (10/8/2018)
    • Capture off-grid mouseup during scrollbar thumb drag.
  • 1.6.0 (5/24/2018)
    • Add deltaXFactor, deltaYFactor, and deltaZFactor properties to fine tune wheel metrics.

About

Styleable scrollbars

Resources

Stars

11 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

FinBars

Styleable scrollbars for real or virtual content

Try the demo.

[See the note Regarding submodules for important information on cloning this repo or re-purposing its build template.]

API documentation

Detailed API docs can be found here.

Import

Use one or the other:

CommonJS npm module

For consumption by bundler on build machine.

From Bash prompt:

npm install --save-prod finbars

From within a code module:

constFinBar=require('finbars');

Runtime import

As an alternative to using the npm module, the client may request a versioned build file that sets the global window.FinBar:

<scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.js"></script><scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.min.js"></script>

Any SEMVER string can be used. 2.0 in the above means load the latest of the 2.0.* range. See the npm semver calculator and npm’s semantic versioning page.

Synopsis

The following sets up a vertical scrollbar to scroll "real" content with the default handler, vertbar.scrollRealContent, which is wired up for you automatically when you give content option but no onchange option).

varcontainer=document.getElementsByTagName('div')[0],content=container.firstChild,vertBar=newFinBar({orientation: 'vertical',content: content});container.appendChild(vertBar.bar);vertbar.resize();window.onresize=function(){vertbar.resize();};

Mark up:

<divstyle="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"><imgsrc="something-taller-than-document.png" /></div>

For this example, we use CSS to dynamically stick the container size to the document so that it is resized as the window is resized.

To set up a horizontal scrollbar as well, just do everything twice.

Introduction

What you do with these scrollbars is completely up to you. They are essentially "range" controls. The scrolling effect is implemented purely in the callback (which you supply). Therefore, they can be used for any purpose, such as to perform "virtual scrolling" (see below).

The example (src/index.html) shows three scrolling <div>…</div> elements:

System scrollbars (no finbars)

The first <div>...</div> doesn't use finbars at all. It is scrolled by the browser using normal operating system scrollbars. These can be made to appear with the following CSS "overflow" style settings:

overflow-x: scroll
overflow-y: scroll

Or "automatically" only when content would overflow the box:

overflow-x: auto
overflow-y: auto
DIY scrolling with finbars

The second <div>...</div> uses finbars instead of system scrollbars. The finbars need to be instantiated, appended to the content element, and rendered using the resize() method. Each callback invocation shifts the content by resetting its position (left and top) styles. In this case the "overflow" styles must be set as follows:

overflow-x: hidden
overflow-y: hidden
Virtual scrolling with finbars

The third <div>...</div> uses finbars to "scroll" virtual content. This means that instead of shifting the content around in response to each callback invocation, the content is regenerated instead in such a way that it appears to be moving in response the scrollbars.

If you generated content is not precise enough to stay within the bounds of the content element, set the "overflow" styles to "hidden" as above. Otherwise you can leave them set to their defaults ("visible").

Finbar styling

You can style your scrollbars with CSS. You can either redefine the existing selectors for div.finbar-vertical and div.finbar-horizontal in src/css/finbars.cssOR you can add your own selectors with a name of your choosing (in place of "finbar") and give that name to the constructor when instantiating your scrollbar object. This second method allows you to have multiple scrollbar styles on a single page.

Your styles should specify the size, color, and opacity of the scrollbar and its thumb.

NOTE: The only CSS style that is required is position: absolute which is set by the constructor, overriding any value from your stylesheets. You can also specify the initial position of the thumb (typically at top: 0 for vertical scrollbars and left: 0 for horizontal scrollbars).

CAUTION: Be sure your existing CSS selectors do not resolve to the scrollbar's element, which consists of a <div>...</div> with a single nested <div>...</div> for the thumb.

Testing

The unit test included currently (test/index.js) is rudimentary and needs to be expanded.

An HTML file is included as an example. I user-tested this example file on:

  • Mac OS High Sierra (10.13.6)
    • Chrome (70.0.3538.77)
    • Safari (12.0 - 13606.2.11)
    • Opera (56.0.3051.52)
    • Firefox (63.0)
  • Windows 7 (SP1)
    • Chrome (67.0.3396.87)
    • Firefox (52.8.0)
    • IE 11 (11.0.9600.19155CO)
  • Windows 10
    • Chrome (70.0.3538.77)
    • Opera (56.0.3051.70)
    • Firefox (63.0)
    • IE 11 (11.345.17134.0)
    • Edge (42.17134.1.0)

Version History

  • 2.0.0 (10/28/2018)
    • This major version update applies platform/browser normalization to deltaXFactor, deltaYFactor, and deltaZFactor, a breaking behavioral change for any app that was previously applying its own normalization factoring to this prop values. See FinBar.normals and normal.
  • 1.6.3 (10/28/2018)
    • Remove stylesheet requirement that .bar and .thumb classes must maintain position: abolute by setting/overriding it on the style attribute as the objects are created in code.
  • 1.6.2 (10/8/2018)
    • Keep .hover class on thumb throughout drag.
  • 1.6.1 (10/8/2018)
    • Capture off-grid mouseup during scrollbar thumb drag.
  • 1.6.0 (5/24/2018)
    • Add deltaXFactor, deltaYFactor, and deltaZFactor properties to fine tune wheel metrics.

About

Styleable scrollbars

Resources

Stars

11 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

FinBars

Styleable scrollbars for real or virtual content

Try the demo.

[See the note Regarding submodules for important information on cloning this repo or re-purposing its build template.]

API documentation

Detailed API docs can be found here.

Import

Use one or the other:

CommonJS npm module

For consumption by bundler on build machine.

From Bash prompt:

npm install --save-prod finbars

From within a code module:

constFinBar=require('finbars');

Runtime import

As an alternative to using the npm module, the client may request a versioned build file that sets the global window.FinBar:

<scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.js"></script><scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.min.js"></script>

Any SEMVER string can be used. 2.0 in the above means load the latest of the 2.0.* range. See the npm semver calculator and npm’s semantic versioning page.

Synopsis

The following sets up a vertical scrollbar to scroll "real" content with the default handler, vertbar.scrollRealContent, which is wired up for you automatically when you give content option but no onchange option).

varcontainer=document.getElementsByTagName('div')[0],content=container.firstChild,vertBar=newFinBar({orientation: 'vertical',content: content});container.appendChild(vertBar.bar);vertbar.resize();window.onresize=function(){vertbar.resize();};

Mark up:

<divstyle="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"><imgsrc="something-taller-than-document.png" /></div>

For this example, we use CSS to dynamically stick the container size to the document so that it is resized as the window is resized.

To set up a horizontal scrollbar as well, just do everything twice.

Introduction

What you do with these scrollbars is completely up to you. They are essentially "range" controls. The scrolling effect is implemented purely in the callback (which you supply). Therefore, they can be used for any purpose, such as to perform "virtual scrolling" (see below).

The example (src/index.html) shows three scrolling <div>…</div> elements:

System scrollbars (no finbars)

The first <div>...</div> doesn't use finbars at all. It is scrolled by the browser using normal operating system scrollbars. These can be made to appear with the following CSS "overflow" style settings:

overflow-x: scroll
overflow-y: scroll

Or "automatically" only when content would overflow the box:

overflow-x: auto
overflow-y: auto
DIY scrolling with finbars

The second <div>...</div> uses finbars instead of system scrollbars. The finbars need to be instantiated, appended to the content element, and rendered using the resize() method. Each callback invocation shifts the content by resetting its position (left and top) styles. In this case the "overflow" styles must be set as follows:

overflow-x: hidden
overflow-y: hidden
Virtual scrolling with finbars

The third <div>...</div> uses finbars to "scroll" virtual content. This means that instead of shifting the content around in response to each callback invocation, the content is regenerated instead in such a way that it appears to be moving in response the scrollbars.

If you generated content is not precise enough to stay within the bounds of the content element, set the "overflow" styles to "hidden" as above. Otherwise you can leave them set to their defaults ("visible").

Finbar styling

You can style your scrollbars with CSS. You can either redefine the existing selectors for div.finbar-vertical and div.finbar-horizontal in src/css/finbars.cssOR you can add your own selectors with a name of your choosing (in place of "finbar") and give that name to the constructor when instantiating your scrollbar object. This second method allows you to have multiple scrollbar styles on a single page.

Your styles should specify the size, color, and opacity of the scrollbar and its thumb.

NOTE: The only CSS style that is required is position: absolute which is set by the constructor, overriding any value from your stylesheets. You can also specify the initial position of the thumb (typically at top: 0 for vertical scrollbars and left: 0 for horizontal scrollbars).

CAUTION: Be sure your existing CSS selectors do not resolve to the scrollbar's element, which consists of a <div>...</div> with a single nested <div>...</div> for the thumb.

Testing

The unit test included currently (test/index.js) is rudimentary and needs to be expanded.

An HTML file is included as an example. I user-tested this example file on:

  • Mac OS High Sierra (10.13.6)
    • Chrome (70.0.3538.77)
    • Safari (12.0 - 13606.2.11)
    • Opera (56.0.3051.52)
    • Firefox (63.0)
  • Windows 7 (SP1)
    • Chrome (67.0.3396.87)
    • Firefox (52.8.0)
    • IE 11 (11.0.9600.19155CO)
  • Windows 10
    • Chrome (70.0.3538.77)
    • Opera (56.0.3051.70)
    • Firefox (63.0)
    • IE 11 (11.345.17134.0)
    • Edge (42.17134.1.0)

Version History

  • 2.0.0 (10/28/2018)
    • This major version update applies platform/browser normalization to deltaXFactor, deltaYFactor, and deltaZFactor, a breaking behavioral change for any app that was previously applying its own normalization factoring to this prop values. See FinBar.normals and normal.
  • 1.6.3 (10/28/2018)
    • Remove stylesheet requirement that .bar and .thumb classes must maintain position: abolute by setting/overriding it on the style attribute as the objects are created in code.
  • 1.6.2 (10/8/2018)
    • Keep .hover class on thumb throughout drag.
  • 1.6.1 (10/8/2018)
    • Capture off-grid mouseup during scrollbar thumb drag.
  • 1.6.0 (5/24/2018)
    • Add deltaXFactor, deltaYFactor, and deltaZFactor properties to fine tune wheel metrics.

About

Styleable scrollbars

Resources

Stars

11 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

FinBars

Styleable scrollbars for real or virtual content

Try the demo.

[See the note Regarding submodules for important information on cloning this repo or re-purposing its build template.]

API documentation

Detailed API docs can be found here.

Import

Use one or the other:

CommonJS npm module

For consumption by bundler on build machine.

From Bash prompt:

npm install --save-prod finbars

From within a code module:

constFinBar=require('finbars');

Runtime import

As an alternative to using the npm module, the client may request a versioned build file that sets the global window.FinBar:

<scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.js"></script><scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.min.js"></script>

Any SEMVER string can be used. 2.0 in the above means load the latest of the 2.0.* range. See the npm semver calculator and npm’s semantic versioning page.

Synopsis

The following sets up a vertical scrollbar to scroll "real" content with the default handler, vertbar.scrollRealContent, which is wired up for you automatically when you give content option but no onchange option).

varcontainer=document.getElementsByTagName('div')[0],content=container.firstChild,vertBar=newFinBar({orientation: 'vertical',content: content});container.appendChild(vertBar.bar);vertbar.resize();window.onresize=function(){vertbar.resize();};

Mark up:

<divstyle="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"><imgsrc="something-taller-than-document.png" /></div>

For this example, we use CSS to dynamically stick the container size to the document so that it is resized as the window is resized.

To set up a horizontal scrollbar as well, just do everything twice.

Introduction

What you do with these scrollbars is completely up to you. They are essentially "range" controls. The scrolling effect is implemented purely in the callback (which you supply). Therefore, they can be used for any purpose, such as to perform "virtual scrolling" (see below).

The example (src/index.html) shows three scrolling <div>…</div> elements:

System scrollbars (no finbars)

The first <div>...</div> doesn't use finbars at all. It is scrolled by the browser using normal operating system scrollbars. These can be made to appear with the following CSS "overflow" style settings:

overflow-x: scroll
overflow-y: scroll

Or "automatically" only when content would overflow the box:

overflow-x: auto
overflow-y: auto
DIY scrolling with finbars

The second <div>...</div> uses finbars instead of system scrollbars. The finbars need to be instantiated, appended to the content element, and rendered using the resize() method. Each callback invocation shifts the content by resetting its position (left and top) styles. In this case the "overflow" styles must be set as follows:

overflow-x: hidden
overflow-y: hidden
Virtual scrolling with finbars

The third <div>...</div> uses finbars to "scroll" virtual content. This means that instead of shifting the content around in response to each callback invocation, the content is regenerated instead in such a way that it appears to be moving in response the scrollbars.

If you generated content is not precise enough to stay within the bounds of the content element, set the "overflow" styles to "hidden" as above. Otherwise you can leave them set to their defaults ("visible").

Finbar styling

You can style your scrollbars with CSS. You can either redefine the existing selectors for div.finbar-vertical and div.finbar-horizontal in src/css/finbars.cssOR you can add your own selectors with a name of your choosing (in place of "finbar") and give that name to the constructor when instantiating your scrollbar object. This second method allows you to have multiple scrollbar styles on a single page.

Your styles should specify the size, color, and opacity of the scrollbar and its thumb.

NOTE: The only CSS style that is required is position: absolute which is set by the constructor, overriding any value from your stylesheets. You can also specify the initial position of the thumb (typically at top: 0 for vertical scrollbars and left: 0 for horizontal scrollbars).

CAUTION: Be sure your existing CSS selectors do not resolve to the scrollbar's element, which consists of a <div>...</div> with a single nested <div>...</div> for the thumb.

Testing

The unit test included currently (test/index.js) is rudimentary and needs to be expanded.

An HTML file is included as an example. I user-tested this example file on:

  • Mac OS High Sierra (10.13.6)
    • Chrome (70.0.3538.77)
    • Safari (12.0 - 13606.2.11)
    • Opera (56.0.3051.52)
    • Firefox (63.0)
  • Windows 7 (SP1)
    • Chrome (67.0.3396.87)
    • Firefox (52.8.0)
    • IE 11 (11.0.9600.19155CO)
  • Windows 10
    • Chrome (70.0.3538.77)
    • Opera (56.0.3051.70)
    • Firefox (63.0)
    • IE 11 (11.345.17134.0)
    • Edge (42.17134.1.0)

Version History

  • 2.0.0 (10/28/2018)
    • This major version update applies platform/browser normalization to deltaXFactor, deltaYFactor, and deltaZFactor, a breaking behavioral change for any app that was previously applying its own normalization factoring to this prop values. See FinBar.normals and normal.
  • 1.6.3 (10/28/2018)
    • Remove stylesheet requirement that .bar and .thumb classes must maintain position: abolute by setting/overriding it on the style attribute as the objects are created in code.
  • 1.6.2 (10/8/2018)
    • Keep .hover class on thumb throughout drag.
  • 1.6.1 (10/8/2018)
    • Capture off-grid mouseup during scrollbar thumb drag.
  • 1.6.0 (5/24/2018)
    • Add deltaXFactor, deltaYFactor, and deltaZFactor properties to fine tune wheel metrics.

About

Styleable scrollbars

Resources

Stars

11 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

FinBars

Styleable scrollbars for real or virtual content

Try the demo.

[See the note Regarding submodules for important information on cloning this repo or re-purposing its build template.]

API documentation

Detailed API docs can be found here.

Import

Use one or the other:

CommonJS npm module

For consumption by bundler on build machine.

From Bash prompt:

npm install --save-prod finbars

From within a code module:

constFinBar=require('finbars');

Runtime import

As an alternative to using the npm module, the client may request a versioned build file that sets the global window.FinBar:

<scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.js"></script><scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.min.js"></script>

Any SEMVER string can be used. 2.0 in the above means load the latest of the 2.0.* range. See the npm semver calculator and npm’s semantic versioning page.

Synopsis

The following sets up a vertical scrollbar to scroll "real" content with the default handler, vertbar.scrollRealContent, which is wired up for you automatically when you give content option but no onchange option).

varcontainer=document.getElementsByTagName('div')[0],content=container.firstChild,vertBar=newFinBar({orientation: 'vertical',content: content});container.appendChild(vertBar.bar);vertbar.resize();window.onresize=function(){vertbar.resize();};

Mark up:

<divstyle="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"><imgsrc="something-taller-than-document.png" /></div>

For this example, we use CSS to dynamically stick the container size to the document so that it is resized as the window is resized.

To set up a horizontal scrollbar as well, just do everything twice.

Introduction

What you do with these scrollbars is completely up to you. They are essentially "range" controls. The scrolling effect is implemented purely in the callback (which you supply). Therefore, they can be used for any purpose, such as to perform "virtual scrolling" (see below).

The example (src/index.html) shows three scrolling <div>…</div> elements:

System scrollbars (no finbars)

The first <div>...</div> doesn't use finbars at all. It is scrolled by the browser using normal operating system scrollbars. These can be made to appear with the following CSS "overflow" style settings:

overflow-x: scroll
overflow-y: scroll

Or "automatically" only when content would overflow the box:

overflow-x: auto
overflow-y: auto
DIY scrolling with finbars

The second <div>...</div> uses finbars instead of system scrollbars. The finbars need to be instantiated, appended to the content element, and rendered using the resize() method. Each callback invocation shifts the content by resetting its position (left and top) styles. In this case the "overflow" styles must be set as follows:

overflow-x: hidden
overflow-y: hidden
Virtual scrolling with finbars

The third <div>...</div> uses finbars to "scroll" virtual content. This means that instead of shifting the content around in response to each callback invocation, the content is regenerated instead in such a way that it appears to be moving in response the scrollbars.

If you generated content is not precise enough to stay within the bounds of the content element, set the "overflow" styles to "hidden" as above. Otherwise you can leave them set to their defaults ("visible").

Finbar styling

You can style your scrollbars with CSS. You can either redefine the existing selectors for div.finbar-vertical and div.finbar-horizontal in src/css/finbars.cssOR you can add your own selectors with a name of your choosing (in place of "finbar") and give that name to the constructor when instantiating your scrollbar object. This second method allows you to have multiple scrollbar styles on a single page.

Your styles should specify the size, color, and opacity of the scrollbar and its thumb.

NOTE: The only CSS style that is required is position: absolute which is set by the constructor, overriding any value from your stylesheets. You can also specify the initial position of the thumb (typically at top: 0 for vertical scrollbars and left: 0 for horizontal scrollbars).

CAUTION: Be sure your existing CSS selectors do not resolve to the scrollbar's element, which consists of a <div>...</div> with a single nested <div>...</div> for the thumb.

Testing

The unit test included currently (test/index.js) is rudimentary and needs to be expanded.

An HTML file is included as an example. I user-tested this example file on:

  • Mac OS High Sierra (10.13.6)
    • Chrome (70.0.3538.77)
    • Safari (12.0 - 13606.2.11)
    • Opera (56.0.3051.52)
    • Firefox (63.0)
  • Windows 7 (SP1)
    • Chrome (67.0.3396.87)
    • Firefox (52.8.0)
    • IE 11 (11.0.9600.19155CO)
  • Windows 10
    • Chrome (70.0.3538.77)
    • Opera (56.0.3051.70)
    • Firefox (63.0)
    • IE 11 (11.345.17134.0)
    • Edge (42.17134.1.0)

Version History

  • 2.0.0 (10/28/2018)
    • This major version update applies platform/browser normalization to deltaXFactor, deltaYFactor, and deltaZFactor, a breaking behavioral change for any app that was previously applying its own normalization factoring to this prop values. See FinBar.normals and normal.
  • 1.6.3 (10/28/2018)
    • Remove stylesheet requirement that .bar and .thumb classes must maintain position: abolute by setting/overriding it on the style attribute as the objects are created in code.
  • 1.6.2 (10/8/2018)
    • Keep .hover class on thumb throughout drag.
  • 1.6.1 (10/8/2018)
    • Capture off-grid mouseup during scrollbar thumb drag.
  • 1.6.0 (5/24/2018)
    • Add deltaXFactor, deltaYFactor, and deltaZFactor properties to fine tune wheel metrics.

About

Styleable scrollbars

Resources

Stars

11 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

FinBars

Styleable scrollbars for real or virtual content

Try the demo.

[See the note Regarding submodules for important information on cloning this repo or re-purposing its build template.]

API documentation

Detailed API docs can be found here.

Import

Use one or the other:

CommonJS npm module

For consumption by bundler on build machine.

From Bash prompt:

npm install --save-prod finbars

From within a code module:

constFinBar=require('finbars');

Runtime import

As an alternative to using the npm module, the client may request a versioned build file that sets the global window.FinBar:

<scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.js"></script><scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.min.js"></script>

Any SEMVER string can be used. 2.0 in the above means load the latest of the 2.0.* range. See the npm semver calculator and npm’s semantic versioning page.

Synopsis

The following sets up a vertical scrollbar to scroll "real" content with the default handler, vertbar.scrollRealContent, which is wired up for you automatically when you give content option but no onchange option).

varcontainer=document.getElementsByTagName('div')[0],content=container.firstChild,vertBar=newFinBar({orientation: 'vertical',content: content});container.appendChild(vertBar.bar);vertbar.resize();window.onresize=function(){vertbar.resize();};

Mark up:

<divstyle="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"><imgsrc="something-taller-than-document.png" /></div>

For this example, we use CSS to dynamically stick the container size to the document so that it is resized as the window is resized.

To set up a horizontal scrollbar as well, just do everything twice.

Introduction

What you do with these scrollbars is completely up to you. They are essentially "range" controls. The scrolling effect is implemented purely in the callback (which you supply). Therefore, they can be used for any purpose, such as to perform "virtual scrolling" (see below).

The example (src/index.html) shows three scrolling <div>…</div> elements:

System scrollbars (no finbars)

The first <div>...</div> doesn't use finbars at all. It is scrolled by the browser using normal operating system scrollbars. These can be made to appear with the following CSS "overflow" style settings:

overflow-x: scroll
overflow-y: scroll

Or "automatically" only when content would overflow the box:

overflow-x: auto
overflow-y: auto
DIY scrolling with finbars

The second <div>...</div> uses finbars instead of system scrollbars. The finbars need to be instantiated, appended to the content element, and rendered using the resize() method. Each callback invocation shifts the content by resetting its position (left and top) styles. In this case the "overflow" styles must be set as follows:

overflow-x: hidden
overflow-y: hidden
Virtual scrolling with finbars

The third <div>...</div> uses finbars to "scroll" virtual content. This means that instead of shifting the content around in response to each callback invocation, the content is regenerated instead in such a way that it appears to be moving in response the scrollbars.

If you generated content is not precise enough to stay within the bounds of the content element, set the "overflow" styles to "hidden" as above. Otherwise you can leave them set to their defaults ("visible").

Finbar styling

You can style your scrollbars with CSS. You can either redefine the existing selectors for div.finbar-vertical and div.finbar-horizontal in src/css/finbars.cssOR you can add your own selectors with a name of your choosing (in place of "finbar") and give that name to the constructor when instantiating your scrollbar object. This second method allows you to have multiple scrollbar styles on a single page.

Your styles should specify the size, color, and opacity of the scrollbar and its thumb.

NOTE: The only CSS style that is required is position: absolute which is set by the constructor, overriding any value from your stylesheets. You can also specify the initial position of the thumb (typically at top: 0 for vertical scrollbars and left: 0 for horizontal scrollbars).

CAUTION: Be sure your existing CSS selectors do not resolve to the scrollbar's element, which consists of a <div>...</div> with a single nested <div>...</div> for the thumb.

Testing

The unit test included currently (test/index.js) is rudimentary and needs to be expanded.

An HTML file is included as an example. I user-tested this example file on:

  • Mac OS High Sierra (10.13.6)
    • Chrome (70.0.3538.77)
    • Safari (12.0 - 13606.2.11)
    • Opera (56.0.3051.52)
    • Firefox (63.0)
  • Windows 7 (SP1)
    • Chrome (67.0.3396.87)
    • Firefox (52.8.0)
    • IE 11 (11.0.9600.19155CO)
  • Windows 10
    • Chrome (70.0.3538.77)
    • Opera (56.0.3051.70)
    • Firefox (63.0)
    • IE 11 (11.345.17134.0)
    • Edge (42.17134.1.0)

Version History

  • 2.0.0 (10/28/2018)
    • This major version update applies platform/browser normalization to deltaXFactor, deltaYFactor, and deltaZFactor, a breaking behavioral change for any app that was previously applying its own normalization factoring to this prop values. See FinBar.normals and normal.
  • 1.6.3 (10/28/2018)
    • Remove stylesheet requirement that .bar and .thumb classes must maintain position: abolute by setting/overriding it on the style attribute as the objects are created in code.
  • 1.6.2 (10/8/2018)
    • Keep .hover class on thumb throughout drag.
  • 1.6.1 (10/8/2018)
    • Capture off-grid mouseup during scrollbar thumb drag.
  • 1.6.0 (5/24/2018)
    • Add deltaXFactor, deltaYFactor, and deltaZFactor properties to fine tune wheel metrics.

About

Styleable scrollbars

Resources

Stars

11 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

FinBars

Styleable scrollbars for real or virtual content

Try the demo.

[See the note Regarding submodules for important information on cloning this repo or re-purposing its build template.]

API documentation

Detailed API docs can be found here.

Import

Use one or the other:

CommonJS npm module

For consumption by bundler on build machine.

From Bash prompt:

npm install --save-prod finbars

From within a code module:

constFinBar=require('finbars');

Runtime import

As an alternative to using the npm module, the client may request a versioned build file that sets the global window.FinBar:

<scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.js"></script><scriptsrc="https://unpkg.com/finbars@2.0/umd/finbars.min.js"></script>

Any SEMVER string can be used. 2.0 in the above means load the latest of the 2.0.* range. See the npm semver calculator and npm’s semantic versioning page.

Synopsis

The following sets up a vertical scrollbar to scroll "real" content with the default handler, vertbar.scrollRealContent, which is wired up for you automatically when you give content option but no onchange option).

varcontainer=document.getElementsByTagName('div')[0],content=container.firstChild,vertBar=newFinBar({orientation: 'vertical',content: content});container.appendChild(vertBar.bar);vertbar.resize();window.onresize=function(){vertbar.resize();};

Mark up:

<divstyle="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"><imgsrc="something-taller-than-document.png" /></div>

For this example, we use CSS to dynamically stick the container size to the document so that it is resized as the window is resized.

To set up a horizontal scrollbar as well, just do everything twice.

Introduction

What you do with these scrollbars is completely up to you. They are essentially "range" controls. The scrolling effect is implemented purely in the callback (which you supply). Therefore, they can be used for any purpose, such as to perform "virtual scrolling" (see below).

The example (src/index.html) shows three scrolling <div>…</div> elements:

System scrollbars (no finbars)

The first <div>...</div> doesn't use finbars at all. It is scrolled by the browser using normal operating system scrollbars. These can be made to appear with the following CSS "overflow" style settings:

overflow-x: scroll
overflow-y: scroll

Or "automatically" only when content would overflow the box:

overflow-x: auto
overflow-y: auto
DIY scrolling with finbars

The second <div>...</div> uses finbars instead of system scrollbars. The finbars need to be instantiated, appended to the content element, and rendered using the resize() method. Each callback invocation shifts the content by resetting its position (left and top) styles. In this case the "overflow" styles must be set as follows:

overflow-x: hidden
overflow-y: hidden
Virtual scrolling with finbars

The third <div>...</div> uses finbars to "scroll" virtual content. This means that instead of shifting the content around in response to each callback invocation, the content is regenerated instead in such a way that it appears to be moving in response the scrollbars.

If you generated content is not precise enough to stay within the bounds of the content element, set the "overflow" styles to "hidden" as above. Otherwise you can leave them set to their defaults ("visible").

Finbar styling

You can style your scrollbars with CSS. You can either redefine the existing selectors for div.finbar-vertical and div.finbar-horizontal in src/css/finbars.cssOR you can add your own selectors with a name of your choosing (in place of "finbar") and give that name to the constructor when instantiating your scrollbar object. This second method allows you to have multiple scrollbar styles on a single page.

Your styles should specify the size, color, and opacity of the scrollbar and its thumb.

NOTE: The only CSS style that is required is position: absolute which is set by the constructor, overriding any value from your stylesheets. You can also specify the initial position of the thumb (typically at top: 0 for vertical scrollbars and left: 0 for horizontal scrollbars).

CAUTION: Be sure your existing CSS selectors do not resolve to the scrollbar's element, which consists of a <div>...</div> with a single nested <div>...</div> for the thumb.

Testing

The unit test included currently (test/index.js) is rudimentary and needs to be expanded.

An HTML file is included as an example. I user-tested this example file on:

  • Mac OS High Sierra (10.13.6)
    • Chrome (70.0.3538.77)
    • Safari (12.0 - 13606.2.11)
    • Opera (56.0.3051.52)
    • Firefox (63.0)
  • Windows 7 (SP1)
    • Chrome (67.0.3396.87)
    • Firefox (52.8.0)
    • IE 11 (11.0.9600.19155CO)
  • Windows 10
    • Chrome (70.0.3538.77)
    • Opera (56.0.3051.70)
    • Firefox (63.0)
    • IE 11 (11.345.17134.0)
    • Edge (42.17134.1.0)

Version History

  • 2.0.0 (10/28/2018)
    • This major version update applies platform/browser normalization to deltaXFactor, deltaYFactor, and deltaZFactor, a breaking behavioral change for any app that was previously applying its own normalization factoring to this prop values. See FinBar.normals and normal.
  • 1.6.3 (10/28/2018)
    • Remove stylesheet requirement that .bar and .thumb classes must maintain position: abolute by setting/overriding it on the style attribute as the objects are created in code.
  • 1.6.2 (10/8/2018)
    • Keep .hover class on thumb throughout drag.
  • 1.6.1 (10/8/2018)
    • Capture off-grid mouseup during scrollbar thumb drag.
  • 1.6.0 (5/24/2018)
    • Add deltaXFactor, deltaYFactor, and deltaZFactor properties to fine tune wheel metrics.

About

Styleable scrollbars

Resources

Stars

11 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages