vuux
Version:
Vue3 Nuxt3 Nuxt4 组件库
163 lines (162 loc) • 5.48 kB
JavaScript
import { ref as c, computed as g, watch as Y, onMounted as k, nextTick as O, onBeforeUnmount as p } from "vue";
import { normalizeSize as H } from "../utils.mjs";
const te = (n, w, a, $) => {
const D = c(0), u = c(0), l = c(n.modelValue ?? n.initialIndex), f = c(!1), d = c(0);
let L = 0, E = 0, x = 0, b = null;
const i = c(!1), C = c(null);
let y = null;
const F = g(() => !n.loop && l.value === 0), U = g(() => !n.loop && l.value === u.value - 1), W = g(() => ({
width: H(n.width),
height: n.autoSize ? "auto" : H(n.height),
position: "relative",
overflow: "hidden",
//防止横向滚动冲突
touchAction: "pan-y"
})), q = g(() => -(l.value * (D.value + n.gap)) + d.value), B = g(() => ({
display: "flex",
gap: `${n.gap}px`,
transform: `translate3d(${q.value}px, 0, 0)`,
transition: f.value ? "none" : `transform ${n.transitionDuration}ms ease`,
willChange: "transform"
})), N = () => n.threshold < 1 ? D.value * n.threshold : n.threshold, V = (e) => {
if (n.loop) {
const t = u.value;
return (e % t + t) % t;
}
return Math.max(0, Math.min(e, u.value - 1));
}, s = () => {
n.autoSize && O(() => {
const e = a.value;
if (!e)
return;
const t = e.children.item(l.value);
t && (C.value = t.offsetHeight);
});
}, S = () => {
!w.value || !a.value || (D.value = w.value.clientWidth, u.value = a.value.children.length, s());
}, z = (e) => {
e && clearTimeout(e);
}, j = () => {
if (i.value = !0, d.value = 0, !a.value) {
i.value = !1;
return;
}
const e = () => {
i.value = !1, a.value?.removeEventListener("transitionend", e), s();
};
a.value?.addEventListener("transitionend", e, { once: !0 });
const t = window.setTimeout(() => {
if (i.value) {
i.value = !1;
try {
a.value?.removeEventListener("transitionend", e);
} catch {
}
s();
}
z(t);
}, n.transitionDuration + 80);
}, v = (e) => {
const t = V(e);
if (t === l.value) {
j();
return;
}
if (i.value = !0, l.value = t, d.value = 0, !a.value) {
i.value = !1, s();
return;
}
const o = () => {
i.value = !1, a.value?.removeEventListener("transitionend", o), s();
};
a.value?.addEventListener("transitionend", o, { once: !0 });
const r = window.setTimeout(() => {
if (i.value) {
i.value = !1;
try {
a.value?.removeEventListener("transitionend", o);
} catch {
}
s();
}
z(r);
}, n.transitionDuration + 80);
}, A = () => {
i.value || (n.loop || l.value < u.value - 1) && v(l.value + 1);
}, G = () => {
i.value || (n.loop || l.value > 0) && v(l.value - 1);
}, m = (e) => {
if (!f.value)
return;
let t = 0, o = 0;
if ("touches" in e) {
if (e.touches.length === 0)
return;
t = e.touches[0].clientX, o = e.touches[0].clientY;
} else
t = e.clientX, o = e.clientY;
const r = t - L, P = o - E;
if (b || (b = Math.abs(r) > Math.abs(P) ? "h" : "v"), b === "v")
return;
e.cancelable && e.preventDefault(), L = t, E = o, x += r;
const K = l.value === 0, Q = l.value === u.value - 1, Z = r > 0, _ = r < 0;
!n.loop && (K && Z || Q && _) ? d.value += r * 0.35 : d.value += r;
}, T = () => {
y && (clearInterval(y), y = null);
}, I = () => {
!n.autoplay || u.value <= 1 || (T(), y = window.setInterval(() => {
A();
}, n.interval));
}, h = () => {
if (!f.value)
return;
f.value = !1;
const e = N();
let t = l.value;
x > e ? t = l.value - 1 : x < -e && (t = l.value + 1), v(t), I(), window.removeEventListener("mousemove", m), window.removeEventListener("mouseup", h), window.removeEventListener("touchmove", m), window.removeEventListener("touchend", h);
}, J = (e) => {
if (T(), !i.value) {
if (f.value = !0, b = null, d.value = 0, x = 0, "touches" in e) {
const t = e.touches[0];
L = t.clientX, E = t.clientY;
} else
L = e.clientX, E = e.clientY;
window.addEventListener("mousemove", m, { passive: !1 }), window.addEventListener("mouseup", h), window.addEventListener("touchmove", m, { passive: !1 }), window.addEventListener("touchend", h);
}
};
let X = null, M = null;
return Y(
() => n.modelValue,
(e) => {
typeof e == "number" && e !== l.value && v(e);
}
), Y(l, (e) => $("update:modelValue", e)), k(() => {
S(), I(), w.value && (X = new ResizeObserver(() => S()), X.observe(w.value)), a.value && (M = new MutationObserver(() => S()), M.observe(a.value, { childList: !0, subtree: !1 })), n.images && n.images.length && O(() => {
const e = a.value?.querySelectorAll("img") || [];
for (let t = 0; t < e.length; t++)
e[t].addEventListener(
"load",
() => {
s();
},
{ once: !0 }
);
}), s();
}), p(() => {
T(), X?.disconnect(), M?.disconnect(), window.removeEventListener("mousemove", m), window.removeEventListener("mouseup", h), window.removeEventListener("touchmove", m), window.removeEventListener("touchend", h);
}), {
slidesCount: u,
currentIndex: l,
isDisabledPrev: F,
isDisabledNext: U,
containerStyles: W,
trackStyles: B,
goTo: v,
next: A,
prev: G,
onPointerDown: J
};
};
export {
te as useSwiper
};