X-Git-Url: https://git.distorted.org.uk/~mdw/tgal/blobdiff_plain/6ac5dde2c2826f066d96e167f6f1fcdc46d5fab4..HEAD:/static/tgal.js?ds=sidebyside diff --git a/static/tgal.js b/static/tgal.js index de05593..6e96dc2 100644 --- a/static/tgal.js +++ b/static/tgal.js @@ -27,12 +27,13 @@ /* Handle keyboard interaction. */ addEventListener("keydown", function (ev) { var dir; - if (ev.key === " " || ev.key === "ArrowRight") dir = "next"; - else if (ev.key === " " || ev.key === "ArrowRight") dir = "next"; - else if (ev.key === "Backspace" || ev.key === "ArrowLeft") dir = "prev"; - else if (ev.key === "^") dir = "up"; + if (ev.altKey || ev.ctrlKey || ev.metaKey) return; else if (ev.key === "<") dir = "first"; else if (ev.key === ">") dir = "last"; + else if (ev.key === "^") dir = "up"; + else if (ev.shiftKey) return; + else if (ev.key === " " || ev.key === "ArrowRight") dir = "next"; + else if (ev.key === "Backspace" || ev.key === "ArrowLeft") dir = "prev"; else return; var elt = document.querySelector("link[rel=" + dir + "]"); if (!elt) return; @@ -42,14 +43,34 @@ addEventListener("keydown", function (ev) { /* Scroll the thumbnail strip so that the current image is in the middle. */ (function () { - var strip = document.querySelector("div.thumbstrip"); - var focus = document.querySelector("#focusthumb"); - if (strip && focus) { - var stripbox = strip.getBoundingClientRect(); - var focusbox = focus.getBoundingClientRect(); - strip.scrollLeft += - (focusbox.x - stripbox.x) - - (stripbox.width - focusbox.width)/2; + var obs = null; + + var scroll = function(strip) { + var focus = strip.querySelector("figure.focusthumb"); + if (focus) { + var stripbox = strip.getBoundingClientRect(); + var focusbox = focus.getBoundingClientRect(); + strip.scrollLeft += + (focusbox.x - stripbox.x) - + (stripbox.width - focusbox.width)/2; + } + }; + + var strips = document.querySelectorAll("div.thumbstrip"); + if (window.IntersectionObserver) { + obs = new IntersectionObserver(function (ee) { + ee.forEach(function (e) { + if (e.isIntersecting) { + obs.unobserve(e.target); + scroll(e.target); + } + }); + }, { + root: document.querySelector("html") + }); + strips.forEach(function (strip) { obs.observe(strip); }); + } else { + strips.forEach(scroll); } })();