diff options
author | Phil Hughes <me@iamphill.com> | 2017-09-14 20:25:48 +0100 |
---|---|---|
committer | Phil Hughes <me@iamphill.com> | 2017-09-22 11:13:19 +0100 |
commit | 7ce70dd5a046048ef13eb5f93ece8f149bfbaea3 (patch) | |
tree | 5ddd05ba2b378bd0ee63f8b9d9b723bd699dd3f1 /app | |
parent | 41068df71d8c198bced9cc16eeb4ed1f70961e86 (diff) | |
download | gitlab-ce-7ce70dd5a046048ef13eb5f93ece8f149bfbaea3.tar.gz |
Dynamically create offset for sticky bar
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/lib/utils/sticky.js | 30 | ||||
-rw-r--r-- | app/assets/stylesheets/pages/diff.scss | 9 |
2 files changed, 27 insertions, 12 deletions
diff --git a/app/assets/javascripts/lib/utils/sticky.js b/app/assets/javascripts/lib/utils/sticky.js index 283c0ec0410..f8f0a43f1cc 100644 --- a/app/assets/javascripts/lib/utils/sticky.js +++ b/app/assets/javascripts/lib/utils/sticky.js @@ -1,14 +1,34 @@ -export const isSticky = (el, scrollY, stickyTop) => { +export const createPlaceholder = () => { + const placeholder = document.createElement('div'); + placeholder.classList.add('sticky-placeholder'); + + return placeholder; +}; + +export const isSticky = (el, scrollY, stickyTop, insertPlaceholder) => { const top = Math.floor(el.offsetTop - scrollY); - if (top <= stickyTop) { + if (top <= stickyTop && !el.classList.contains('is-stuck')) { + const placeholder = insertPlaceholder ? createPlaceholder(el) : null; + const heightBefore = el.offsetHeight; + el.classList.add('is-stuck'); - } else { + + if (insertPlaceholder) { + el.parentNode.insertBefore(placeholder, el.nextElementSibling); + + placeholder.style.height = `${heightBefore - el.offsetHeight}px`; + } + } else if (top > stickyTop && el.classList.contains('is-stuck')) { el.classList.remove('is-stuck'); + + if (insertPlaceholder && el.nextElementSibling.classList.contains('sticky-placeholder')) { + el.nextElementSibling.remove(); + } } }; -export default (el) => { +export default (el, insertPlaceholder = true) => { if (!el) return; const computedStyle = window.getComputedStyle(el); @@ -17,7 +37,7 @@ export default (el) => { const stickyTop = parseInt(computedStyle.top, 10); - document.addEventListener('scroll', () => isSticky(el, window.scrollY, stickyTop), { + document.addEventListener('scroll', () => isSticky(el, window.scrollY, stickyTop, insertPlaceholder), { passive: true, }); }; diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index 951580ea1fe..5dbf44073b5 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -451,7 +451,7 @@ } .files { - margin-top: -1px; + margin-top: 1px; .diff-file:last-child { margin-bottom: 0; @@ -586,11 +586,6 @@ top: 76px; } - + .files, - + .alert { - margin-top: 1px; - } - &:not(.is-stuck) .diff-stats-additions-deletions-collapsed { display: none; } @@ -608,7 +603,7 @@ + .files, + .alert { - margin-top: 32px; + // margin-top: 32px; } } } |