<style>
.slider-before, .slider-after {
user-select: none;
}
</style>
<div class="custom-image-slider" id="customImageSlider">
<img class="slider-before" src=https://imgur.com/fjABpr0 alt="Before">
<img class="slider-after" src=https://imgur.com/jSvcAI7 alt="After">
<div class="slider-handle"></div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function () {
const container = document.querySelector(".custom-image-slider");
const afterImage = document.querySelector(".slider-after");
const handle = document.querySelector(".slider-handle");
// Set initial handle position and clipPath
const initialPercentage = 50;
handle.style.left = `${initialPercentage}%`;
afterImage.style.clipPath = `inset(0 ${100 - initialPercentage}% 0 0)`;
let dragging = false;
let lastX = 0;
// Add mouse event listeners
handle.addEventListener("mousedown", (e) => {
dragging = true;
lastX = e.clientX;
e.preventDefault();
});
document.addEventListener("mouseup", () => {
dragging = false;
});
document.addEventListener("mouseleave", () => {
dragging = false;
});
document.addEventListener("mousemove", (e) => {
if (!dragging) return;
const rect = container.getBoundingClientRect();
const x = e.clientX - rect.left;
let widthPercentage = (x / rect.width) * 100;
// Add constraint to keep the handle within 1% of either edge
widthPercentage = Math.max(0, Math.min(widthPercentage, 100));
// Update handle position using requestAnimationFrame
window.requestAnimationFrame(() => {
handle.style.left = `${widthPercentage}%`;
afterImage.style.clipPath = `inset(0 ${100 - widthPercentage}% 0 0)`;
});
lastX = x;
});
// Add touch event listeners
handle.addEventListener("touchstart", (e) => {
dragging = true;
lastX = e.touches[0].clientX;
e.preventDefault();
});
document.addEventListener("touchend", () => {
dragging = false;
});
container.addEventListener("touchcancel", () => {
dragging = false;
});
container.addEventListener("touchmove", (e) => {
if (!dragging) return;
const rect = container.getBoundingClientRect();
const x = e.touches[0].clientX - rect.left;
let widthPercentage = (x / rect.width) * 100;
// Add constraint to keep the handle within 1% of either edge
widthPercentage = Math.max(0, Math.min(widthPercentage, 100));
// Update handle position using requestAnimationFrame
window.requestAnimationFrame(() => {
handle.style.left = `${widthPercentage}%`;
afterImage.style.clipPath = `inset(0 ${100 - widthPercentage}% 0 0)`;
});
lastX = x;
});
});
</script>