.html 结构文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jq轮播图</title>
<link rel="stylesheet" href="css/jq_scroll.css">
</head>
<body>
<div class="scroll">
<!-- 图片区域 img-->
<div class="scroll-img">
<!-- 假图 -->
<img src="img/004.jpg" alt="">
<img class="active" src="img/001.jpg" alt="">
<img src="img/002.jpg" alt="">
<img src="img/003.jpg" alt="">
<img src="img/004.jpg" alt="">
<!-- 假图 -->
<img src="img/001.jpg" alt="">
</div>
<!-- 右下角切换按钮 tag -->
<ul class="scroll-tag">
<li class="active"></li>
<li></li>
<li></li>
<li></li>
</ul>
<!-- 左右切换图 toggle-->
<div class="scroll-toggle">
<i class="toggle-left"><</i>
<i class="toggle-right">></i>
</div>
</div>
</body>
<script src="js/jquery-3.3.1.js"></script>
<script type="text/javascript" src="js/jq_scroll.js"></script>
</html>
.css 样式文件
html, body, ul,img{
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
/*图片位置设置*/
.scroll, .scroll-img, img {
width: 613px;
height: 230px;
}
.scroll {
margin: 50px auto;
position: relative;
/*用户不可拖拽选中*/
user-select: none;
/*壁纸超出部位不可见*/
overflow: hidden;
}
/*设置轮播图片,为长条滚动显示*/
.scroll-img{
position: absolute;
/*走马灯,壁纸长度为真图数加头尾两个假图*/
width: calc(613px * 6);
left:-613px;
}
.scroll-img img{
/*img浮动清除图片之间的空格*/
float: left;
}
/*右下选图按钮 tag*/
ul{
position: absolute;
bottom: 10px;
right: 20px;
}
li{
/*画圈用于点击*/
width: 8px;
height: 8px;
border: 2px solid #888;
border-radius: 50%;
float: left;
margin-left: 10px;
background-color: transparent;
/*鼠标悬浮样式*/
cursor: pointer;
}
/*活跃状态下的li,变色*/
li.active {
transition: .2s;
background-color: #999;
}
/*左右切换按钮*/
.toggle-left, .toggle-right {
width: 40px;
height: 80px;
background-color: rgba(255,255, 255, 0.7);
line-height: 80px;
text-align: center;
font-size: 30px;
position: absolute;
top: 75px;
border-radius: 5px;
/*默认状态不可见*/
opacity: 0;
}
.toggle-left {
left: 2px;
}
.toggle-right {
right: 2px;
}
/*鼠标悬浮,可见,鼠标状态改变*/
.scroll:hover .toggle-left, .scroll:hover .toggle-right {
transition: .1s;
opacity: 1;
cursor: pointer;
}
.js 文件
// 自动滚动,一直做左移,到末尾假图重置
// 使用定时器,加可控制参数scroll_disable
// 图片数量
var imgCount = 4;
var timer = 0;
// 用来保证进入单个动画能被完整结束
var scroll_disable = false;
function autoScroll() {
timer = setInterval(function () {
// false 进入
if(!scroll_disable){
// 用于确保进入之后,不执行完毕就被再次调用执行
scroll_disable = true;
// 总图已经滚动的距离,相对移动的左端
var current_left = $('.scroll-img').position().left;
// 滚动长度是图片的长度
var scroll_width = $('.scroll-img img').width();
// console.log(current_left);
// console.log(scroll_width);
// 动画操作,总图的拖拽操作
$('.scroll-img').animate({
left:current_left - scroll_width
},300,function () {
// 动画执行完毕重置可进入滚动的条件
scroll_disable = false;
// 图片停留在假图,进入判断
if(current_left<=-(scroll_width*imgCount))
{
$(this).css({
// 尾假图,变成相应的真图1的位置
left:-scroll_width
})
}
})
// tag操作,切换活跃的对象
// js操作获取绝对值
var index = Math.abs(current_left/scroll_width);
// 当index为图片数量,重置索引为0
if(index == imgCount){
index = 0;
}
// eq(index) 匹配一个给定索引值的元素
// siblings([expr]) 筛选同辈元素
// 链式赋值,对 .scroll-tag 子代中对应索引添加活跃状态,解除所有同辈的活跃状态
$('.scroll-tag').children().eq(index).addClass('active').siblings().removeClass('active');
}
},2500)
}
autoScroll()
// 鼠标事件监控,悬浮清动画,离开启动
// 悬浮显示左右按键,离开清除
$('.scroll').mouseover(function () {
clearInterval(timer);
})
$('.scroll').mouseout(function () {
autoScroll();
})
// toggle-right 下一张图片,切换同自动轮播
$('.toggle-right').click(function () {
if (!scroll_disable) {
// 在本次动画未结束时,让用户无法进行下一次点击
scroll_disable = true;
// console.log("right btn action");
// 图片右滚
// 点击一下右键,在原位置(left偏移)基础上往右滚一个图片宽度
// offset() 距离窗口左上角的top与left
// console.log($('.scroll-img').offset());
// position() 距离定位父级左上角的top与left
// console.log($('.scroll-img').position());
// 当前整个view的做左移量
var current_left = $('.scroll-img').position().left;
// 一次动画滚动的距离
var scroll_width = $('.scroll-img img').width();
$('.scroll-img').animate({
left: current_left - scroll_width
}, 300, function () {
scroll_disable = false;
// 显示末尾假图时
// console.log(current_left);
if (current_left <= -(scroll_width * imgCount)) {
// 切换为首位真图
$(this).css({
left: -scroll_width
})
}
})
// tag切换
var index = Math.abs(current_left / scroll_width);
// console.log(index);
if (index == imgCount) {
index = 0;
}
// tag下面的index索引指向的li变成活跃状态,该li的其他兄弟,都变成不活跃状态
$current_li = $('.scroll-tag').children().eq(index);
$current_li.addClass('active');
$current_li.siblings().removeClass('active');
// $('.tag').children().eq(index).addClass('active').siblings().removeClass('active');
}
})
// toggle-left
$('.toggle-left').click(function () {
if (!scroll_disable) {
// 在本次动画未结束时,让用户无法进行下一次点击
scroll_disable = true;
// 当前整个view的做左移量
var current_left = $('.scroll-img').position().left;
// 一次动画滚动的距离
var scroll_width = $('.scroll-img img').width();
$('.scroll-img').animate({
left: current_left + scroll_width
}, 300, function () {
scroll_disable = false;
// 在首位假图时
// console.log(current_left);
if (current_left >= -scroll_width) {
// 切换为首位真图
$(this).css({
left: -scroll_width * imgCount
})
}
})
// tag切换 对应关系 1=>3 4=>2 3=>1 2=>0
var index = Math.abs(current_left / scroll_width) -2;
if (index == -1) {
index = imgCount-1;
}
// tag下面的index索引指向的li变成活跃状态,该li的其他兄弟,都变成不活跃状态
$current_li = $('.scroll-tag').children().eq(index);
$current_li.addClass('active');
$current_li.siblings().removeClass('active');
// $('.tag').children().eq(index).addClass('active').siblings().removeClass('active');
}
})
$('.scroll-tag').children().click(function () {
// console.log($(this).index());
// var $li = $(this);
// 切换活跃的tag li
$(this).siblings('.active').removeClass("active");
$(this).addClass('active');
// 当前点击点的索引
var current_index = $(this).index(); // 0 | 1 | 2 | 3
// 一次动画滚动的距离
var scroll_width = $('.scroll-img img').width();
console.log(current_index);
console.log(scroll_width);
// 切换图片 view
// 当前点击的父亲相邻哥哥,做动画
$(this).parent().prev().animate({
// +1 初始左侧有一张假图
left: -(current_index + 1) * scroll_width
}, 300)
})