feat: add sticky bar with smooth scroll

This commit is contained in:
matcornic 2017-08-01 21:20:15 +02:00
parent e37af28876
commit da208441c0
5 changed files with 91 additions and 7 deletions

View file

@ -3,9 +3,9 @@
- créer une section Showcase - créer une section Showcase
- refaire la possibilité d'overrider le style/script/etc -> TODO - refaire la possibilité d'overrider le style/script/etc -> TODO
- créer des jolis thèmes de base (avec des noms) -> TODO - créer des jolis thèmes de base (avec des noms) -> TODO
- ajouter Travis pour tester le thème quotidiennement avec les nouvelles versions de Hugo -> TODO - ajouter les attachments -> TODO
- ajouter Travis pour tester le thème quotidiennement avec les nouvelles versions de Hugo -> OK
- #54 -> OK - #54 -> OK
- corriger slider menu qui ne fonctionne plus -> OK - corriger slider menu qui ne fonctionne plus -> OK
- Update font awesome -> OK - Update font awesome -> OK

View file

@ -1 +1,2 @@
<link rel="shortcut icon" href="/images/favicon.png" type="image/x-icon" /> <link rel="shortcut icon" href="/images/favicon.png" type="image/x-icon" />
<link rel="icon" href="/images/favicon.png" type="image/x-icon" />

View file

@ -34,7 +34,7 @@
{{ partial "menu.html" . }} {{ partial "menu.html" . }}
<section id="body"> <section id="body">
<div id="overlay"></div> <div id="overlay"></div>
<div class="padding highlightable"> <div class="padding highlightable sticky-parent">
{{if not .IsHome}} {{if not .IsHome}}
<div id="top-bar"> <div id="top-bar">
{{ if and (or .IsPage .IsSection) .Site.Params.editURL }} {{ if and (or .IsPage .IsSection) .Site.Params.editURL }}

View file

@ -56,10 +56,10 @@ images.each(function(index){
}); });
// Stick the top to the top of the screen when scrolling // Stick the top to the top of the screen when scrolling
//$("#top-bar").stick_in_parent( { $("#top-bar").stick_in_parent( {
// parent: ".sticky-parent", parent: ".sticky-parent",
// spacer: ".sticky-spacer", spacer: ".sticky-spacer",
//}); });
jQuery(document).ready(function() { jQuery(document).ready(function() {

View file

@ -251,6 +251,89 @@ jQuery(document).ready(function() {
}); });
} }
/**
* Fix anchor scrolling that hides behind top nav bar
* Courtesy of https://stackoverflow.com/a/13067009/28106
*
* We could use pure css for this if only heading anchors were
* involved, but this works for any anchor, including footnotes
**/
(function (document, history, location) {
var HISTORY_SUPPORT = !!(history && history.pushState);
var anchorScrolls = {
ANCHOR_REGEX: /^#[^ ]+$/,
OFFSET_HEIGHT_PX: 50,
/**
* Establish events, and fix initial scroll position if a hash is provided.
*/
init: function () {
this.scrollToCurrent();
$(window).on('hashchange', $.proxy(this, 'scrollToCurrent'));
$('body').on('click', 'a', $.proxy(this, 'delegateAnchors'));
},
/**
* Return the offset amount to deduct from the normal scroll position.
* Modify as appropriate to allow for dynamic calculations
*/
getFixedOffset: function () {
return this.OFFSET_HEIGHT_PX;
},
/**
* If the provided href is an anchor which resolves to an element on the
* page, scroll to it.
* @param {String} href
* @return {Boolean} - Was the href an anchor.
*/
scrollIfAnchor: function (href, pushToHistory) {
var match, anchorOffset;
if (!this.ANCHOR_REGEX.test(href)) {
return false;
}
match = document.getElementById(href.slice(1));
if (match) {
anchorOffset = $(match).offset().top - this.getFixedOffset();
$('html, body').animate({ scrollTop: anchorOffset });
// Add the state to history as-per normal anchor links
if (HISTORY_SUPPORT && pushToHistory) {
history.pushState({}, document.title, location.pathname + href);
}
}
return !!match;
},
/**
* Attempt to scroll to the current location's hash.
*/
scrollToCurrent: function (e) {
if (this.scrollIfAnchor(window.location.hash) && e) {
e.preventDefault();
}
},
/**
* If the click event's target was an anchor, fix the scroll position.
*/
delegateAnchors: function (e) {
var elem = e.target;
if (this.scrollIfAnchor(elem.getAttribute('href'), true)) {
e.preventDefault();
}
}
};
$(document).ready($.proxy(anchorScrolls, 'init'));
})(window.document, window.history, window.location);
}); });
jQuery(window).on('load', function() { jQuery(window).on('load', function() {