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.
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.
- Leren Armbanden voor heren
- Stalen Armbanden (edelstaal/RVS)
- Kralen Armbanden met natuursteen
- Schakelarmbanden van edelstaal
-
Houten kralen armband Spartaanse Helm€ 12,95 € 16,95
(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();
})();






























