老师请问为什么我的鼠标进入后没有暂停切换
在别的地方测试时都是可以的,不知道为什么这里就暂停不了了,小圆点和按钮的功能都能实现所以没有粘贴那部分代码。就是自动播放时,鼠标进入后没有执行暂停
baseSlider
import DEFAULTS from './defaults.js';
import {NODE_TYPE_DOM} from './constants.js';
import circles from './circles.js';
// 幻灯片基类
class BaseSlider{
constructor(el,options){
if(el.nodeType!==NODE_TYPE_DOM) throw new Error('必须使用dom元素');
// 获取外层父盒子,ul和li标签
const sliderEl = el;
const sliderContent = sliderEl.querySelector('.slider-content');
// 先复制第一个li标签
this.cloneLastNode(sliderContent);
// 给最后一个li添加classname
sliderContent.lastElementChild.className='slider-item';
// 获取所有li
const sliderItems = sliderContent.querySelectorAll('.slider-item');
this.sliderEl = sliderEl;
this.sliderContent=sliderContent;
this.sliderItems=sliderItems;
// 获取options默认值
this.options = {...DEFAULTS,...options};
// li的宽度
this.itemWidth = sliderItems[0].offsetWidth;
// 最大最小索引值和当前索引
this.miniIndex = 0;
this.maxIndex = sliderItems.length-1;
this.currentIndex = this.correctIndex(this.options.initialIndex,this.maxIndex);
this.init();
}
init(){
// 给li添加宽度
for(let item of this.sliderItems){
item.style.width = `${this.itemWidth}px`;
}
// 给ul添加宽度
this.sliderContent.style.width =`${
this.itemWidth*this.sliderItems.length
}px`;
// 无动画移动,确认第一张动画位置
this.move(this.toDistance());
// 自动移动
this.autoplay();
}
// 复制第一个元素节点
cloneLastNode(fatherNode){
const lastchild = fatherNode.firstElementChild.cloneNode(true);
fatherNode.appendChild(lastchild);
}
// 判断正确index值
correctIndex(index,max){
if(index<this.miniIndex){return max};
if(index>max){return this.miniIndex};
return index;
}
// 移动
move(distance){
this.sliderContent.style.transform = `translateX(-${distance}px)`;
}
// 带动画的移动
moveWithAnimation(index){
this.openAnimation();
this.currentIndex=index;
this.move(this.toDistance());
}
// 移动距离
toDistance(index=this.currentIndex){
return this.itemWidth*index;
}
// 切换到索引值对应的下一张
to(index,next=true){
if(this.options.animation){
// 分开写next和prev的两种情况
if(next){
// 右移动
this.moveNext(index);
}else{
// 左移动
this.movePrev(index);
}
}else{
// 无动画移动
index = this.correctIndex(index,this.maxIndex-1);
if(this.currentIndex==index) return;
this.currentIndex = index;
this.move(this.toDistance());
}
// 判断是否有小圆点并设置
if(this.options.withCircles){
circles.changeCircle(this);
}
}
// 切换到下一张
next(){
this.to(this.currentIndex+1);
}
// 切换到上一张
prev(){
// false为不是next的情况
this.to(this.currentIndex-1,false);
}
// 自动播放
autoplay(){
if(this.options.autoplay<=0) return;
this.pause();
this.timer = setInterval(()=>{
if(this.options.autoplayDirection=='next'){
this.next();
}else{
this.prev();
}
},this.options.autoplay);
}
pause(){
clearInterval(this.timer);
}
//开启动画
openAnimation(){
this.sliderContent.style.transition =
`transform ${this.options.animationDuration}s ${this.options.animationDelay}s ${this.options.animationType}`;
}
// 关闭动画
closeAnimation(){
this.sliderContent.style.transition='none';
}
//右移动带动画
moveNext(index){
this.moveWithAnimation(index);
if(index==this.maxIndex){
setTimeout(()=>{
index = 0;
this.currentIndex = index;
this.move(0);
this.closeAnimation();
},this.options.animationDuration*1000)
}
}
// 左移动带动画
movePrev(index){
// 切到第一张时,快速变为最后一张
// 再用动画改到倒数第二张
if(index<0){
this.closeAnimation();
this.move(this.toDistance(this.maxIndex));
setTimeout(()=>{
index = this.maxIndex-1;
this.moveWithAnimation(index);
},0);
this.currentIndex=this.maxIndex-1;
}else{
this.moveWithAnimation(index);
}
}
}
export default BaseSlider;slider
import button from './button.js';
import circles from './circles.js';
import BaseSlider from './baseSlider.js';
class Slider extends BaseSlider{
constructor(el,options){
// 继承父类
super(el,options);
this.bindEvent();
}
bindEvent(){
// 判断是否有自动播放
if(this.options.autoplay>0){
// 自动播放时鼠标移入暂停,移出继续
this.sliderEl.onmouseenter = ()=>{ //此处必须用箭头函数
this.pause();
}
// 鼠标移出继续
this.sliderEl.onmouseleave = ()=>{
this.autoplay();
}
// 按钮控制左右
if(this.options.withBtn){
button.bindEvent(this);
}
// 小圆点切换
if(this.options.withCircles){
circles.bindEvent(this);
}
}
}
}
export default Slider;默认值
const DEFAULTS = {
// 初始索引值
initialIndex:0,
// 是否有动画
animation:true,
// 动画时长(秒)
animationDuration:0.3,
// 动画类型
animationType:'linear',
// 动画延时(秒)
animationDelay:0,
// 是否自动播放,0为否,大于0位自动播放的切换间隔
autoplay:0,
// 自动播放为左切还是右切
autoplayDirection:'next',
// 判断是否有小圆点
withCircles:true,
// 判断是否带按钮
withBtn:false
}
export default DEFAULTS;slider的实例
import Slider from './slider';
const sliderEl = document.getElementById('slider');
const slider = new Slider(
sliderEl,{
animation:true,
withCircles:true,
withBtn:true,
autoplay:3000,
initialIndex:0
}
);
export default slider;html结构
<div class="slider" id='slider'> <ul class="slider-content"> <li class='slider-item'> <a href='javascript:;'> <img src="images/banner_01.jpg" alt="" class='slider-img'> </a> </li> <li class='slider-item'> <a href='javascript:;'> <img src="images/banner_02.jpg" alt="" class='slider-img'> </a> </li> <li class='slider-item'> <a href='javascript:;'> <img src="images/banner_03.jpg" alt="" class='slider-img'> </a> </li> <li class='slider-item'> <a href='javascript:;'> <img src="images/banner_04.jpg" alt="" class='slider-img'> </a> </li> <li class='slider-item'> <a href='javascript:;'> <img src="images/banner_05.jpg" alt="" class='slider-img'> </a> </li> </ul> <div class="circles" id="circles"> <ol> <li data-n='0' class="current"></li> <li data-n='1'></li> <li data-n='2'></li> <li data-n='3'></li> <li data-n='4'></li> </ol> </div> </div>
css
.slider, .slider-content,.slider-item,.slider-img{
width:100%;
height:100%;
}
.slider{
width:100%;
height:456px;
overflow:hidden;
}
.slider-item{
float:left;
}
.slider-img{
vertical-align:middle;
}7
收起
正在回答
1回答
同学你好,没有实现的原因大概率是因为sliderEl没有被获取到所造成的,同学检查一下是否控制台中有报错。另同学给的这一部分代码老师没办法进行复现问题的操作,同学可以点击老师的头像然后点击关注给老师发送一条私信,老师这边把客服的联系方式给到同学,同学加上以后把项目整个代码打包发过来,老师这边测一下看看。
祝学习愉快!
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星