JavaScript —— 实现一个简易版轮播图

JavaScript —— 实现一个简易版轮播图

先看看效果:
JavaScript —— 实现一个简易版轮播图_第1张图片

零、起因和思路

昨天有位小伙伴询问一种轮播导航栏要如何做:
起因

JavaScript —— 实现一个简易版轮播图_第2张图片
今晚寻思着,刚睡醒吃完,花点时间撸一下。老样子,完整代码放最后面,具体思路如下:

  1. 点击某一项滚动
  2. 点击上一项或下一项滚动
  3. 自动滚动轮播
  4. 鼠标移入移出暂停轮播

一、设计结构

<body>
	<div class="over">div>
body>

样式代码:


生成元素:

// 元素个数
var itemNum = 30;
(function() {
	const html = new Array()
	for(let i = 0; i < itemNum; i++) {
		const div = '
+i+')">'+(i+1)+'
'
html.push(div) } const next = '' const pre = '
<
'
const line = '
'
html.push(next) html.push(line) html.push(pre) parentScroll.innerHTML = html.join(''); })()

二、实现点击事件

// 先获取三个element
const parentScroll = document.querySelector(".over");
const childScroll = document.querySelectorAll(".item");
const lineScroll = document.querySelector(".line");
// 定义控制滚动下标
var itemIndex = 0;

// 单项点击事件
function itemClick(index) {
	// 临界值处理
	if (index == -1) {
		itemIndex = itemNum - 1
	} else if (index == itemNum) {
		itemIndex = 0
	} else {
		itemIndex = index
	}
	// 控制下划线和整体滚动
	scrollCheck(itemIndex)
}

// 上一项点击事件
function preClick() {
	itemClick(--itemIndex)
}

// 下一项点击事件
function nextClick() {
	itemClick(++itemIndex)
}

// 控制下划线滚动函数
function scrollLine(left) {
	lineScroll.style.left = left + 'px'
}

// 控制下划线和整体滚动函数
function scrollCheck(index) {
	let parentLeft = parentScroll.scrollLeft; // 获取父元素滚动条位置,用于设置整体滚动
	let parentWidth = parentScroll.clientWidth / 2; // 获取父元素可视区域中间值,用于比较
	let childLeft = childScroll[index].offsetLeft; // 获取子元素距父元素左侧距离,用于设置下划线位置
	let childScrollWidth = childScroll[index].offsetLeft + childScroll[index].clientWidth / 2; // 获取每一项中间值距父元素左侧距离,用于比较
	// 如果当前项的中间值距父元素左侧距离,比父元素可视区域中间值,小,那么整体不滚动
	// 反之,将横向滚动element.scrollLeft的值设置为当前项的中间值距父元素左侧距离,形成滚动
	if (childScrollWidth < parentWidth) {
		parentScroll.scrollTo({
			left: 0,
			behavior: "smooth"
		})
	} else {
		parentScroll.scrollTo({
			left: childScrollWidth - parentWidth + childScroll[index].clientWidth / 2,
			behavior: "smooth"
		})
	}
	// 控制下划线滚动
	scrollLine(childLeft)
}

三、实现自动轮播

var timer = null;
function autoPlay() {
	timer = setInterval(() => {
		nextClick()
	}, 2000)
}

四、实现鼠标移停

parentScroll.onmouseenter = function() {
	clearInterval(timer)
}

parentScroll.onmouseleave = function() {
	autoPlay()
}

五、完整代码

<script>
	var timer = null;
	var itemNum = 30;
	var itemIndex = 0;
	const parentScroll = document.querySelector(".over");
	
	(function() {
		const html = new Array()
		for(let i = 0; i < itemNum; i++) {
			const div = '
+i+')">'+(i+1)+'
'
html.push(div) } const next = '' const pre = '
<
'
const line = '
'
html.push(next) html.push(line) html.push(pre) parentScroll.innerHTML = html.join(''); })() const childScroll = document.querySelectorAll(".item"); const lineScroll = document.querySelector(".line"); function itemClick(index) { if (index == -1) { itemIndex = itemNum - 1 } else if (index == itemNum) { itemIndex = 0 } else { itemIndex = index } scrollCheck(itemIndex) } function nextClick() { itemClick(++itemIndex) } function preClick() { itemClick(--itemIndex) } function scrollCheck(index) { let parentLeft = parentScroll.scrollLeft; let parentWidth = parentScroll.clientWidth / 2; let childLeft = childScroll[index].offsetLeft; let childScrollWidth = childScroll[index].offsetLeft + childScroll[index].clientWidth / 2; if (childScrollWidth < parentWidth) { parentScroll.scrollTo({ left: 0, behavior: "smooth" }) } else { parentScroll.scrollTo({ left: childScrollWidth - parentWidth + childScroll[index].clientWidth / 2, behavior: "smooth" }) } scrollLine(childLeft) } function scrollLine(left) { lineScroll.style.left = left + 'px' } function autoPlay() { timer = setInterval(() => { nextClick() }, 2000) } parentScroll.onmouseenter = function() { clearInterval(timer) } parentScroll.onmouseleave = function() { autoPlay() } autoPlay() </script>

你可能感兴趣的:(javascript,javascript,前端,html)