老师帮我修改一下谢谢,这个不太会写
来源:5-2 自由编程
清夏_
2022-10-01 17:25:46
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Class 的应用</title>
<link rel="stylesheet" href="./slider.css" />
</head>
<body>
<div class="slider-layout">
<div class="slider">
<div class="slider-content">
<div class="slider-item">
<a href="javascript:;"
><img src="./images/6.jpg" alt="1" class="slider-img"
/></a>
</div>
<div class="slider-item">
<a href="javascript:;"
><img src="./images/7.jpg" alt="1" class="slider-img"
/></a>
</div>
<div class="slider-item">
<a href="javascript:;"
><img src="./images/8.jpg" alt="1" class="slider-img"
/></a>
</div>
<div class="slider-item">
<a href="javascript:;"
><img src="./images/9.jpg" alt="1" class="slider-img"
/></a>
</div>
<a href="javascript:;" class="leftbtn btn"><</a>
<a href="javascript:;" class="rightbtn btn">></a>
</div>
</div>
</div>
<script src="./base.js"></script>
<script>
const leftbtn = document.querySelector(".leftbtn");
const rightbtn = document.querySelector(".rightbtn");
const slider = document.querySelector(".slider");
// console.log(BaseSlider);
class Slider extends BaseSlider {
constructor(el, options) {
super(el, options);
this._bindEvent();
}
/* 左右按钮事件监听 */
_bindEvent() {
leftbtn.addEventListener("click", () => {
this.prev();
});
rightbtn.addEventListener("click", () => {
this.next();
});
}
}
// 大盒子绑定鼠标移入移出事件
slider.addEventListener("mouseenter", () => {
btn.style.display = "block";
});
new Slider(document.querySelector(".slider"), {
// 图片切换间隔时间2s
speed: 2000,
});
</script>
</body>
</html>/* css reset */
* {
padding: 0;
margin: 0;
}
a {
text-decoration: none;
outline: none;
}
img {
vertical-align: top;
}
/* layout */
.slider-layout {
width: 80%;
height: 420px;
margin: 0 auto;
}
/* slider */
.slider,
.slider-content,
.slider-item,
.slider-img {
width: 100%;
height: 100%;
}
.slider {
overflow: hidden;
/* 相对定位 */
position: relative;
}
.slider-item {
float: left;
}
.slider-animation {
transition-property: transform;
transition-duration: 0ms;
}
/* 左右按钮 */
/* 共性 */
.btn {
position: absolute;
background-color: rgba(255, 255, 255, 0.711);
width: 60px;
height: 60px;
top: 50%;
margin-top: -30px;
border-radius: 50%;
text-align: center;
line-height: 55px;
font-size: 50px;
color: rgba(0, 0, 0, 0.404);
/* 默认隐藏按钮 */
display: none;
}
.leftbtn {
left: 0;
}
.rightbtn {
right: 0;
}// 默认参数
const DEFAULTS = {
// 初始索引
initialIndex: 0,
// 切换时是否有动画
animation: true,
// 切换速度,单位 ms
speed: 300
};
// base
const ELEMENT_NODE = 1;
const SLIDER_ANIMATION_CLASSNAME = 'slider-animation';
class BaseSlider {
constructor(el, options) {
// console.log(options)
if (el.nodeType !== ELEMENT_NODE)
throw new Error('实例化的时候,请传入 DOM 元素!');
// 实际参数
this.options = {
...DEFAULTS,
...options
};
const slider = el;
const sliderContent = slider.querySelector('.slider-content');
const sliderItems = sliderContent.querySelectorAll('.slider-item');
// 添加到 this 上,为了在方法中使用
this.slider = slider;
this.sliderContent = sliderContent;
this.sliderItems = sliderItems;
this.minIndex = 0;
this.maxIndex = sliderItems.length - 1;
this.currIndex = this.getCorrectedIndex(this.options.initialIndex);
// 每个 slider-item 的宽度(每次移动的距离)
this.itemWidth = sliderItems[0].offsetWidth;
this.init();
}
// 获取修正后的索引值
// 随心所欲,不逾矩
getCorrectedIndex(index) {
if (index < this.minIndex) return this.maxIndex;
if (index > this.maxIndex) return this.minIndex;
return index;
}
// 初始化
init() {
// 为每个 slider-item 设置宽度
this.setItemsWidth();
// 为 slider-content 设置宽度
this.setContentWidth();
// 切换到初始索引 initialIndex
this.move(this.getDistance());
// 开启动画
if (this.options.animation) {
this.openAnimation();
}
}
// 为每个 slider-item 设置宽度
setItemsWidth() {
for (const item of this.sliderItems) {
item.style.width = `${this.itemWidth}px`;
}
}
// 为 slider-content 设置宽度
setContentWidth() {
this.sliderContent.style.width = `${this.itemWidth * this.sliderItems.length
}px`;
}
// 不带动画的移动
move(distance) {
this.sliderContent.style.transform = `translate3d(${distance}px, 0px, 0px)`;
}
// 带动画的移动
moveWithAnimation(distance) {
this.setAnimationSpeed(this.options.speed);
this.move(distance);
}
// 设置切换动画速度
setAnimationSpeed(speed) {
this.sliderContent.style.transitionDuration = `${speed}ms`;
}
// 获取要移动的距离
getDistance(index = this.currIndex) {
return -this.itemWidth * index;
}
// 开启动画
openAnimation() {
this.sliderContent.classList.add(SLIDER_ANIMATION_CLASSNAME);
}
// 关闭动画
closeAnimation() {
this.setAnimationSpeed(0);
}
// 切换到 index 索引对应的幻灯片
to(index) {
index = this.getCorrectedIndex(index);
if (this.currIndex === index) return;
this.currIndex = index;
const distance = this.getDistance();
if (this.options.animation) {
return this.moveWithAnimation(distance);
} else {
return this.move(distance);
}
}
// 切换上一张
prev() {
this.to(this.currIndex - 1);
}
// 切换下一张
next() {
this.to(this.currIndex + 1);
}
// 获取当前索引
getCurrIndex() {
return this.currIndex;
}
}问题描述:第一 我不知道那个this到底该什么时候去使用,感觉是super没学好,那里很绕,很多种应用场景跟this指向 ,第二我这个右按钮不知道为啥没有显示 第三我这个按左按钮不知道为啥直接四张图片一起换 第四我不知道我这些事件应该放在哪个位置 请老师费心帮我看看
1回答
好帮手慕久久
2022-10-05
同学你好,解答如下:
1、左右按钮不显示,有如下原因:
a、按钮的dom元素并没有获取,修改如下:

b、html结构不合理,.slider-content的transform属性会影响右箭头的位置。调整如下:

2、this的使用和super没什么关系。super的东西了解就行,知道有super这个东西,不用记住。this可以回顾如下课程,在笔记中记好每种场合下this指向什么就行了,用到的时候翻笔记:

在Class中,this一般指向实例,按照这一点使用就行。如果出现this相关报错,就使用console.log打印一下this,看看this指向谁,然后想办法改就行了。
3、轮播图效果有很多形式,我们这里并不是无缝滚动的形式,所以点击左按钮,可以看到第一张切换到第四张的过程。这里是最基本的轮播图,效果是正常的,不用纠结,也不需要更改。
4、代码的写法不是固定的,事件写在哪里也不是固定的,同学这种写法就可以。建议把鼠标移入,箭头隐藏效果添加上:

另外,建议按照练习要求,让初始显示第二张:

同学可以看看问答区其他人的写法,将每一种自己没见过的写法都琢磨几遍,自己思路就丰富了。
祝学习愉快!
相似问题