sutty-base-jekyll-theme/_packs/controllers/scroll_controller.js

48 lines
1 KiB
JavaScript
Raw Permalink Normal View History

2021-11-22 17:51:50 +00:00
import { Controller } from "stimulus";
/*
* Al navegar por el sitio y llegar a ciertas secciones, se van
* activando ítems del menú.
*
* Para eso configuramos un IntersectionObserver en todo el documento y
* a medida que van apareciendo secciones actualizamos el menú.
*/
export default class extends Controller {
2021-11-22 17:51:50 +00:00
static targets = ["section"];
2021-11-22 17:51:50 +00:00
connect() {
for (const section of this.sectionTargets) {
2021-11-22 17:51:50 +00:00
this.observer.observe(section);
}
}
/*
* Solo nos interesa la primera
*/
2021-11-22 17:51:50 +00:00
get observer() {
if (!this._observer)
this._observer = new IntersectionObserver(
(entries, observer) => this.update(entries),
this.options
);
return this._observer;
}
2021-11-22 17:51:50 +00:00
get options() {
if (!this._options) this._options = { threshold: 0, rootMargin: "0px" };
2021-11-22 17:51:50 +00:00
return this._options;
}
2021-11-22 17:51:50 +00:00
update(entries) {
const section = entries.find((x) => x.isIntersecting);
2021-11-22 17:51:50 +00:00
if (!section) return;
2021-11-22 17:51:50 +00:00
window.dispatchEvent(
new CustomEvent("scroll:section", { detail: { id: section.target.id } })
);
}
}