当前位置:首页 > JavaScript

js实现滑动相册

2026-01-31 00:18:09JavaScript

js实现滑动相册

js实现滑动相册

实现滑动相册的基本思路

滑动相册的核心是通过监听用户触摸或鼠标事件,动态调整图片的位置。通常结合CSS过渡或动画效果实现平滑滑动。

HTML结构

<div class="slider-container">
  <div class="slider-track">
    <img src="image1.jpg" class="slide">
    <img src="image2.jpg" class="slide">
    <img src="image3.jpg" class="slide">
  </div>
</div>

CSS样式

.slider-container {
  width: 100%;
  overflow: hidden;
  position: relative;
}

.slider-track {
  display: flex;
  transition: transform 0.5s ease;
}

.slide {
  min-width: 100%;
  height: 300px;
  object-fit: cover;
}

JavaScript实现

const track = document.querySelector('.slider-track');
const slides = Array.from(document.querySelectorAll('.slide'));
const slideWidth = slides[0].getBoundingClientRect().width;

let currentIndex = 0;
let isDragging = false;
let startPos = 0;
let currentTranslate = 0;
let prevTranslate = 0;

// 设置初始位置
setSliderPosition();

// 触摸事件处理
track.addEventListener('touchstart', touchStart);
track.addEventListener('touchmove', touchMove);
track.addEventListener('touchend', touchEnd);

// 鼠标事件处理
track.addEventListener('mousedown', touchStart);
track.addEventListener('mousemove', touchMove);
track.addEventListener('mouseup', touchEnd);
track.addEventListener('mouseleave', touchEnd);

function touchStart(e) {
  isDragging = true;
  startPos = getPositionX(e);
  prevTranslate = currentTranslate;
  track.style.transition = 'none';
}

function touchMove(e) {
  if (!isDragging) return;
  const currentPosition = getPositionX(e);
  currentTranslate = prevTranslate + currentPosition - startPos;
  track.style.transform = `translateX(${currentTranslate}px)`;
}

function touchEnd() {
  isDragging = false;
  const movedBy = currentTranslate - prevTranslate;

  if (movedBy < -100 && currentIndex < slides.length - 1) {
    currentIndex += 1;
  }

  if (movedBy > 100 && currentIndex > 0) {
    currentIndex -= 1;
  }

  setSliderPosition();
}

function getPositionX(e) {
  return e.type.includes('mouse') ? e.pageX : e.touches[0].clientX;
}

function setSliderPosition() {
  currentTranslate = currentIndex * -slideWidth;
  track.style.transition = 'transform 0.5s ease';
  track.style.transform = `translateX(${currentTranslate}px)`;
}

自动轮播功能

let autoSlideInterval;

function startAutoSlide() {
  autoSlideInterval = setInterval(() => {
    currentIndex = (currentIndex + 1) % slides.length;
    setSliderPosition();
  }, 3000);
}

function stopAutoSlide() {
  clearInterval(autoSlideInterval);
}

// 开始自动轮播
startAutoSlide();

// 鼠标悬停时停止
track.addEventListener('mouseenter', stopAutoSlide);
track.addEventListener('mouseleave', startAutoSlide);

响应式处理

window.addEventListener('resize', () => {
  slideWidth = slides[0].getBoundingClientRect().width;
  setSliderPosition();
});

添加导航按钮

<button class="prev-btn">Previous</button>
<button class="next-btn">Next</button>
document.querySelector('.prev-btn').addEventListener('click', () => {
  currentIndex = Math.max(currentIndex - 1, 0);
  setSliderPosition();
});

document.querySelector('.next-btn').addEventListener('click', () => {
  currentIndex = Math.min(currentIndex + 1, slides.length - 1);
  setSliderPosition();
});

指示器实现

<div class="indicators"></div>
const indicators = document.querySelector('.indicators');

// 创建指示器
slides.forEach((_, i) => {
  const indicator = document.createElement('div');
  indicator.classList.add('indicator');
  if (i === 0) indicator.classList.add('active');
  indicator.addEventListener('click', () => {
    currentIndex = i;
    setSliderPosition();
    updateIndicators();
  });
  indicators.appendChild(indicator);
});

function updateIndicators() {
  document.querySelectorAll('.indicator').forEach((indicator, i) => {
    indicator.classList.toggle('active', i === currentIndex);
  });
}

这个实现包含了基本的滑动功能、自动轮播、导航按钮和指示器。可以根据实际需求调整过渡效果、滑动阈值和响应式行为。

标签: 相册js
分享给朋友:

相关文章

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…