Skip to content

Instantly share code, notes, and snippets.

@jmshal
Last active May 15, 2018 01:54
Show Gist options
  • Select an option

  • Save jmshal/4c7dd81a61adcb648944a16b0fac717f to your computer and use it in GitHub Desktop.

Select an option

Save jmshal/4c7dd81a61adcb648944a16b0fac717f to your computer and use it in GitHub Desktop.
Electron `position: sticky` shim

sticky-shim

This 8 line shim makes elements with position: sticky work as intended in situations where you have scrollable content nested within your app - see this for an example.

Before going any further, this is to be used only in Electron.

How do I use it?

You will need to enable the position: sticky flag/blink feature in order for this to work.

You can do this by either adding CSSStickyPosition to the blinkFeatures web preference...

win = new BrowserWindow({
  // ...
  webPreferences: {
    blinkFeatures: 'CSSStickyPosition',
  },
});

Or you can enable all of the Chrome experimental features (of which position: sticky is one)...

win = new BrowserWindow({
  // ...
  webPreferences: {
    experimentalFeatures: true,
  },
});

Now all you need to do is import the sticky-shim.js file, and add the sticky-shim class to any elements which have the position: sticky css rule applied. The shim does not automatically add position: sticky, this is so when Electron does support it natively, you can simply remove the shim and the shim class, and all should work as intended.

window.addEventListener('scroll', (event) => {
const stickyShim = event.target.querySelector('.sticky-shim');
if (stickyShim) {
stickyShim.style.position = 'relative';
stickyShim.offsetHeight;
stickyShim.style.position = '';
}
}, true);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment