Skip to content

Commit 9d8bd87

Browse files
committed
💄 ajout du sticky header
1 parent 0477014 commit 9d8bd87

File tree

10 files changed

+72901
-17
lines changed

10 files changed

+72901
-17
lines changed

public/css/app.css

Lines changed: 11440 additions & 10 deletions
Large diffs are not rendered by default.

public/js/app.js

Lines changed: 61339 additions & 2 deletions
Large diffs are not rendered by default.

public/mix-manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"/js/app.js": "/js/app.js?id=1d8832a55a90910e91ad",
3-
"/css/app.css": "/css/app.css?id=543449437fc1da0337d7"
2+
"/js/app.js": "/js/app.js",
3+
"/css/app.css": "/css/app.css"
44
}

resources/css/app.css

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
@import "forms.css";
1212
@import "torchlight.css";
1313
@import "toc.css";
14-
@import "media-library.css";
15-
/*@import "rain.css";*/
14+
@import "rain.css";
15+
@import "header.css";
16+
/*@import "media-library.css";*/
1617
/*@import "christmas.css";*/
1718

1819
:root {

resources/css/header.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.header.is-fixed {
2+
@apply fixed inset-x-0 transform duration-300 bg-skin-menu/80 backdrop-blur;
3+
}
4+
5+
.header.is-hidden {
6+
transform: translateY(-100%);
7+
}

resources/css/rain.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
width: 100%;
55
height: 100%;
66
z-index: 2;
7+
pointer-events: none;
78
}
89

910
.rain.back-row {

resources/js/app.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ import Alpine from 'alpinejs'
22
import intersect from '@alpinejs/intersect'
33

44
import internationalNumber from './plugins/internationalNumber'
5+
import { registerHeader } from './header'
56
import './elements'
67
import './helpers'
78
import './editor'
89
import './scrollspy'
910
// import './rain'
1011

12+
registerHeader()
13+
1114
// Add Alpine to window object.
1215
window.Alpine = Alpine;
1316

resources/js/header.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { throttle } from '@helpers/timers'
2+
3+
let $header = document.querySelector('.header')
4+
let currentTop = 0
5+
let previousTop = 0
6+
let scrolling = false
7+
const scrollDelta = 20
8+
let scrollOffset = $header ? $header.offsetHeight : 0
9+
10+
// Les différents états possible du header
11+
const FIXED = 0
12+
const HIDDEN = 1
13+
const DEFAULT = 2
14+
let state = DEFAULT
15+
16+
/**
17+
* Fonction de changement d'état du header
18+
*
19+
* @param {number} newState
20+
*/
21+
function setState (newState) {
22+
// Le header n'a pas changé d'état
23+
if (newState === state) {
24+
return
25+
}
26+
27+
if (newState === HIDDEN) {
28+
$header.classList.add('is-hidden')
29+
} else if (newState === FIXED) {
30+
$header.classList.remove('is-hidden')
31+
$header.classList.add('is-fixed')
32+
} else if (newState === DEFAULT) {
33+
$header.classList.remove('is-hidden')
34+
$header.classList.remove('is-fixed')
35+
}
36+
37+
state = newState
38+
}
39+
40+
const autoHideHeader = function () {
41+
if (!$header) {
42+
return
43+
}
44+
currentTop = document.documentElement.scrollTop
45+
// Opacité sur le header
46+
if (currentTop > $header.offsetHeight) {
47+
if (currentTop - previousTop > scrollDelta && currentTop > scrollOffset) {
48+
setState(HIDDEN)
49+
} else if (previousTop - currentTop > scrollDelta) {
50+
setState(FIXED)
51+
}
52+
} else {
53+
setState(DEFAULT)
54+
}
55+
/**
56+
// Masquage / affichage
57+
if (previousTop - currentTop > scrollDelta) {
58+
$header.classList.remove('is-hidden')
59+
} else if (currentTop - previousTop > scrollDelta && currentTop > scrollOffset) {
60+
$header.classList.add('is-hidden')
61+
}
62+
**/
63+
previousTop = currentTop
64+
scrolling = false
65+
}
66+
67+
/**
68+
* Enregistre le comportement du header (fixed au scoll)
69+
* @return {function(): void}
70+
*/
71+
export function registerHeader () {
72+
const scrollListener = throttle(() => {
73+
if (!scrolling) {
74+
scrolling = true
75+
window.requestAnimationFrame(autoHideHeader)
76+
}
77+
}, 100)
78+
window.addEventListener('scroll', scrollListener)
79+
return () => {
80+
window.removeEventListener('scroll', scrollListener)
81+
}
82+
}

resources/js/helpers/timers.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* Throttle un callback
3+
*/
4+
export function throttle(callback, delay) {
5+
let last;
6+
let timer;
7+
return function () {
8+
let context = this;
9+
let now = new Date();
10+
let args = arguments;
11+
if (last && now < last + delay) {
12+
// le délai n'est pas écoulé on reset le timer
13+
clearTimeout(timer);
14+
timer = setTimeout(function () {
15+
last = now;
16+
callback.apply(context, args);
17+
}, delay);
18+
} else {
19+
last = now;
20+
callback.apply(context, args);
21+
}
22+
};
23+
}

resources/views/layouts/_nav.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<nav x-data="{ open: false, flyoutMenu: false }" class="relative z-10 bg-skin-menu">
1+
<nav x-data="{ open: false, flyoutMenu: false }" class="relative z-10 bg-skin-menu header">
22
<div class="max-w-7xl mx-auto px-2 sm:px-4">
33
<div class="flex justify-between h-16">
44
<div class="flex px-2 lg:px-0">

0 commit comments

Comments
 (0)