当前位置:首页 > 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实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…