~xdavidwu/xdavidwu.link

ref: 11358a12c763501d74f61e7e798cfbeceb3d7c35 xdavidwu.link/assets/js/_greedy-navigation.js -rw-r--r-- 1.8 KiB
11358a12xdavidwu tweak light footer color 4 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
GreedyNav.js - http://lukejacksonn.com/actuate
Licensed under the MIT license - http://opensource.org/licenses/MIT
Copyright (c) 2015 Luke Jackson
*/


const $btn = document.querySelector("nav.greedy-nav .greedy-nav__toggle");
const $vlinks = document.querySelector("nav.greedy-nav .visible-links");
const $hlinks = document.querySelector("nav.greedy-nav .hidden-links");

var numOfItems = 0;
var totalSpace = 0;
var closingTime = 1000;
var breakWidths = [];

// Get initial state
for (i of $vlinks.children) {
  totalSpace += i.offsetWidth;
  numOfItems += 1;
  breakWidths.push(totalSpace);
}

var availableSpace, numOfVisibleItems, requiredSpace, timer;

function check() {

  // Get instant state
  availableSpace = $vlinks.offsetWidth;
  numOfVisibleItems = $vlinks.children.length;
  requiredSpace = breakWidths[numOfVisibleItems - 1];

  // There is not enought space
  if (requiredSpace > availableSpace) {
    $hlinks.prepend($vlinks.lastChild);
    numOfVisibleItems -= 1;
    check();
    // There is more than enough space
  } else if (availableSpace > breakWidths[numOfVisibleItems]) {
    $vlinks.append($hlinks.firstChild);
    numOfVisibleItems += 1;
    check();
  }
  // Update the button accordingly
  $btn.setAttribute("count", numOfItems - numOfVisibleItems);
  if (numOfVisibleItems === numOfItems) {
    $btn.classList.add('hidden');
  } else $btn.classList.remove('hidden');
}

// Window listeners
window.addEventListener('resize', () => {
  check();
});

$btn.addEventListener('click', () => {
  $hlinks.classList.toggle('hidden');
  clearTimeout(timer);
});

$hlinks.addEventListener('mouseleave', () => {
  // Mouse has left, start the timer
  timer = setTimeout(function() {
    $hlinks.classList.add('hidden');
  }, closingTime);
});
$hlinks.addEventListener('mouseenter', () => {
  // Mouse is back, cancel the timer
  clearTimeout(timer);
});

check();