Armbanden

Heren Armbanden in leer, edelstaal, natuursteen en touw—kies snel op maat, kleur en materiaal voor een pasvorm die klopt.
In deze categorie vind je Heren Armbanden met duidelijke stijlverschillen: warm en casual met leer (gevlochten, glad of strap), strak en modern met edelstaal (RVS) en schakelwerk, en meer textuur met natuursteen kralen. Je ziet ook combinaties waarin leer, touw/paracord en metaal samenkomen, plus uitvoeringen met een ankerdetail, keramiek of een magnetische sluiting. Kleuren lopen van zwart en bruin tot blauw, groen en grijs, met accenten in goudkleurig en zilverkleurig.

Wil je gericht kiezen, werk dan in deze volgorde: bepaal eerst het hoofdmateriaal (leer, edelstaal, natuursteen of touw), kies daarna je maat (vaste lengtes of One Size), en verfijn pas dan op kleur. Zo voorkom je dat je een Armband kiest die net te strak sluit bij een horloge, of juist te los valt bij stapelen. Voor een rustige look werkt één basis (leer of edelstaal) met één accent (kralen of schakels) vaak het meest gebalanceerd. Lees verder

585 Artikelen

Van laag naar hoog sorteren
(function () { "use strict"; // ========================= // Instellingen // ========================= var TICK_MS = 3000; // elke 3 sec 1 random product wisselen var TRANSITION_MS = 900; // overgangsduur var ZOOM_FROM = 1.04; // soft zoom in var MAX_PRODUCTPAGE_FETCHES = 30; // max unieke productpage fetches per pageload var DEBUG = false; // ========================= // Helpers // ========================= function $(sel, root) { return (root || document).querySelector(sel); } function $all(sel, root) { return Array.prototype.slice.call((root || document).querySelectorAll(sel)); } function stripQuery(u) { return (u || "").split("?")[0]; } function isPlaceholderUrl(u) { u = (u || "").toLowerCase(); return u.indexOf("placeholder") !== -1 || u.indexOf("magento_catalog/images/product/placeholder") !== -1; } function absUrl(href) { if (!href) return null; if (href.indexOf("http") === 0) return href; if (href.charAt(0) === "/") return location.origin + href; return location.origin + "/" + href; } // Normalize: maakt /cache/... varianten gelijk zodat “zelfde foto” echt herkend wordt. function normalizeToSourceKey(urlStr) { try { var u = new URL(urlStr, location.origin); var p = u.pathname; if (p.indexOf("/media/catalog/product/") === -1) return null; var cacheIdx = p.indexOf("/media/catalog/product/cache/"); if (cacheIdx !== -1) { var after = p.substring(cacheIdx + "/media/catalog/product/cache/".length); var parts = after.split("/").filter(Boolean); // cacheId / something / if (parts.length >= 3) p = "/media/catalog/product/" + parts.slice(2).join("/"); else if (parts.length >= 2) p = "/media/catalog/product/" + parts.slice(1).join("/"); } var rel = p.substring(p.indexOf("/media/catalog/product/") + "/media/catalog/product/".length); return rel.toLowerCase(); } catch (e) { return null; } } function preload(url) { return new Promise(function (resolve, reject) { try { var im = new Image(); im.decoding = "async"; im.onload = function () { resolve(url); }; im.onerror = function () { reject(new Error("img load failed")); }; im.src = url; } catch (e) { reject(e); } }); } function pickRandom(arr) { return arr[Math.floor(Math.random() * arr.length)]; } // ========================= // CSS (ALTijd correct, overschrijft oude style inhoud) // ========================= function injectCss() { var css = /* anker rond foto is de stabiele box op desktop + mobile */ ".product-item a.product-item-photo{position:relative!important;overflow:hidden!important;}" + /* base product image onder overlays */ ".product-item a.product-item-photo img.product-image-photo{position:relative!important;z-index:1!important;}" + /* overlays altijd absoluut -> kan NOOIT layout breken */ "img.lgt-swap-ol{" + "position:absolute!important;" + "left:0!important;top:0!important;right:0!important;bottom:0!important;" + "width:100%!important;height:100%!important;" + "object-fit:cover!important;object-position:center center!important;" + "display:block!important;" + "pointer-events:none!important;" + "opacity:0!important;" + "transform:scale(1)!important;" + "will-change:opacity,transform;" + "z-index:2!important;" + "transition:opacity " + TRANSITION_MS + "ms ease, transform " + TRANSITION_MS + "ms ease!important;" + "}" + "img.lgt-swap-ol.is-on{opacity:1!important;transform:scale(1)!important;}" + "img.lgt-swap-ol.is-prep{opacity:0!important;transform:scale(" + ZOOM_FROM + ")!important;}" + /* SALE/labels ALTIJD boven overlays (breed, maar alleen binnen de foto-link) */ ".product-item a.product-item-photo [class*='sale']," + ".product-item a.product-item-photo .sale," + ".product-item a.product-item-photo .onsale," + ".product-item a.product-item-photo .product-label," + ".product-item a.product-item-photo .label{" + "position:relative!important;" + "z-index:5!important;" + "}"; var st = document.getElementById("lgt-gridimgswap-style"); if (!st) { st = document.createElement("style"); st.id = "lgt-gridimgswap-style"; document.head.appendChild(st); } // overschrijf ALTIJD (voorkomt “oude css blijft hangen”) st.textContent = css; } // ========================= // DOM selectors // ========================= function getListRoot() { return $("#amasty-shopby-product-list") || $(".products.wrapper") || $(".category-products") || document.body; } function getProductItems(root) { var items = $all("li.product-item", root); if (items.length) return items; items = $all(".product-item-info", root); if (items.length) return items; return $all("[data-product-id]", root); } function getTileAnchors(item) { // Stabiel: de foto-link is de box waar we overlays in willen hangen var photoA = $("a.product-item-photo", item); var nameA = $("a.product-item-link", item) || $("a[href]", item); return { photoA: photoA, linkA: nameA }; } function getBaseImg(item, photoA) { return (photoA && $("img.product-image-photo", photoA)) || $("img.product-image-photo", item) || (photoA && $("img", photoA)) || $("img", item); } // ========================= // Magento gallery parser // ========================= function extractGalleryArray(htmlText) { var keyPos = htmlText.indexOf('"mage/gallery/gallery"'); if (keyPos === -1) return null; var dataPos = htmlText.indexOf('"data"', keyPos); if (dataPos === -1) return null; var start = htmlText.indexOf("[", dataPos); if (start === -1) return null; var i = start, depth = 0, inStr = false, esc = false; for (; i < htmlText.length; i++) { var ch = htmlText.charAt(i); if (inStr) { if (esc) { esc = false; continue; } if (ch === "\\") { esc = true; continue; } if (ch === '"') { inStr = false; continue; } continue; } if (ch === '"') { inStr = true; continue; } if (ch === "[") depth++; else if (ch === "]") { depth--; if (depth === 0) { var arrText = htmlText.substring(start, i + 1); try { var arr = JSON.parse(arrText); return Array.isArray(arr) ? arr : null; } catch (e) { return null; } } } } return null; } // pool = [{key,url}] unique op key function buildPoolFromGallery(arr, baseSrc) { var map = Object.create(null); for (var i = 0; i < arr.length; i++) { var it = arr[i] || {}; var raw = it.img || it.full || it.thumb; if (!raw) continue; raw = stripQuery(String(raw).replace(/\\\//g, "/")); if (raw.indexOf("/media/catalog/product/") === -1) continue; if (isPlaceholderUrl(raw)) continue; var key = normalizeToSourceKey(raw); if (!key) continue; if (!map[key]) map[key] = raw; } // baseSrc toevoegen alleen als het echt nieuwe key is if (baseSrc && !isPlaceholderUrl(baseSrc)) { var bk = normalizeToSourceKey(baseSrc); if (bk && !map[bk]) map[bk] = baseSrc; } var keys = Object.keys(map); var pool = keys.map(function (k) { return { key: k, url: map[k] }; }); // eligible alleen als >1 distinct key return { pool: pool, eligible: keys.length > 1 }; } // ========================= // State + limiter // ========================= var tiles = []; var pageCache = Object.create(null); // href -> {ready, eligible, pool, loading} var fetchCount = 0; var fetchedSet = Object.create(null); function canFetch(href) { if (fetchedSet[href]) return true; return fetchCount < MAX_PRODUCTPAGE_FETCHES; } function markFetch(href) { if (!fetchedSet[href]) { fetchedSet[href] = 1; fetchCount++; if (DEBUG) console.log("[gridimgswap] fetchCount", fetchCount, "/", MAX_PRODUCTPAGE_FETCHES); } } // ========================= // Overlay management // ========================= function ensureOverlays(photoA) { // photoA is position:relative via CSS var a = photoA.querySelector("img.lgt-swap-ol[data-ol='a']"); var b = photoA.querySelector("img.lgt-swap-ol[data-ol='b']"); if (!a) { a = document.createElement("img"); a.className = "lgt-swap-ol"; a.setAttribute("data-ol", "a"); a.alt = ""; photoA.appendChild(a); } if (!b) { b = document.createElement("img"); b.className = "lgt-swap-ol"; b.setAttribute("data-ol", "b"); b.alt = ""; photoA.appendChild(b); } return { a: a, b: b }; } function scan() { injectCss(); var root = getListRoot(); var items = getProductItems(root); for (var i = 0; i < items.length; i++) { var item = items[i]; if (!item || item.getAttribute("data-lgt-gridimgswap-attached") === "1") continue; var anchors = getTileAnchors(item); var photoA = anchors.photoA; var linkA = anchors.linkA; if (!photoA || !linkA) continue; // HARD: geen foto-link => niet aanpassen var baseImg = getBaseImg(item, photoA); if (!baseImg) continue; var href = absUrl(linkA.getAttribute("href")); if (!href) continue; var baseSrc = stripQuery(baseImg.getAttribute("src") || ""); if (!baseSrc || isPlaceholderUrl(baseSrc)) continue; var baseKey = normalizeToSourceKey(baseSrc) || baseSrc; var ol = ensureOverlays(photoA); item.setAttribute("data-lgt-gridimgswap-attached", "1"); tiles.push({ item: item, photoA: photoA, href: href, baseSrc: baseSrc, lastKey: baseKey, active: "a", olA: ol.a, olB: ol.b }); } if (DEBUG) console.log("[gridimgswap] tiles:", tiles.length); } function ensurePool(tile) { var cached = pageCache[tile.href]; if (cached && cached.ready) return Promise.resolve(cached); if (cached && cached.loading) { return new Promise(function (resolve) { var tries = 0; var iv = setInterval(function () { tries++; var c = pageCache[tile.href]; if (c && c.ready) { clearInterval(iv); resolve(c); } if (tries >= 40) { clearInterval(iv); resolve({ ready: true, eligible: false, pool: [] }); } }, 100); }); } if (!canFetch(tile.href)) { pageCache[tile.href] = { ready: true, eligible: false, pool: [], loading: false }; return Promise.resolve(pageCache[tile.href]); } pageCache[tile.href] = { ready: false, eligible: false, pool: [], loading: true }; markFetch(tile.href); return fetch(tile.href, { credentials: "same-origin" }) .then(function (r) { return r.text(); }) .then(function (html) { var arr = extractGalleryArray(html); if (!Array.isArray(arr) || arr.length <= 1) { pageCache[tile.href] = { ready: true, eligible: false, pool: [], loading: false }; return pageCache[tile.href]; } var built = buildPoolFromGallery(arr, tile.baseSrc); pageCache[tile.href] = { ready: true, eligible: built.eligible, pool: built.pool, loading: false }; if (DEBUG) console.log("[gridimgswap] eligible:", built.eligible, "pool:", built.pool.length, tile.href); return pageCache[tile.href]; }) .catch(function () { pageCache[tile.href] = { ready: true, eligible: false, pool: [], loading: false }; return pageCache[tile.href]; }); } function pickDifferentByKey(pool, currentKey) { var filtered = []; for (var i = 0; i < pool.length; i++) { if (pool[i] && pool[i].key !== currentKey) filtered.push(pool[i]); } if (!filtered.length) return null; return pickRandom(filtered); } function swap(tile, chosen) { if (!tile || !chosen || !chosen.url || !chosen.key) return; if (tile.item.getAttribute("data-lgt-swap-busy") === "1") return; tile.item.setAttribute("data-lgt-swap-busy", "1"); var from = (tile.active === "a") ? tile.olA : tile.olB; var to = (tile.active === "a") ? tile.olB : tile.olA; // prepare to.classList.remove("is-on"); to.classList.add("is-prep"); preload(chosen.url).then(function () { to.src = chosen.url; requestAnimationFrame(function () { to.classList.add("is-on"); to.classList.remove("is-prep"); from.classList.remove("is-on"); }); setTimeout(function () { tile.active = (tile.active === "a") ? "b" : "a"; tile.lastKey = chosen.key; tile.item.removeAttribute("data-lgt-swap-busy"); }, TRANSITION_MS + 60); }).catch(function () { to.classList.remove("is-prep"); tile.item.removeAttribute("data-lgt-swap-busy"); }); } // ========================= // Loop + visibility pause // ========================= var timerId = null; function tick() { if (!tiles.length) return; var attempts = 0; (function tryPick() { attempts++; var tile = pickRandom(tiles); if (!tile) return; ensurePool(tile).then(function (c) { if (!c || !c.eligible || !c.pool || c.pool.length < 2) { if (attempts < 12) return tryPick(); return; } var chosen = pickDifferentByKey(c.pool, tile.lastKey); if (!chosen) return; swap(tile, chosen); }); })(); } function startLoop() { if (timerId) return; timerId = setInterval(tick, TICK_MS); } function stopLoop() { if (!timerId) return; clearInterval(timerId); timerId = null; } document.addEventListener("visibilitychange", function () { if (document.hidden) stopLoop(); else startLoop(); }); // ========================= // Init + mutations // ========================= scan(); var root = getListRoot(); var mo = new MutationObserver(function () { scan(); }); mo.observe(root, { childList: true, subtree: true }); if (document.hidden) stopLoop(); else startLoop(); if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", scan); else scan(); })();