老师帮我修改一下谢谢,这个不太会写

来源: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">&lt;</a>
          <a href="javascript:;" class="rightbtn btn">&gt;</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元素并没有获取,修改如下:

https://img.mukewang.com/climg/633ce9d2093827f906950318.jpg

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

https://img.mukewang.com/climg/633cea24095602a709450290.jpg

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

https://img.mukewang.com/climg/633cea8509087a9c07390635.jpg

在Class中,this一般指向实例,按照这一点使用就行。如果出现this相关报错,就使用console.log打印一下this,看看this指向谁,然后想办法改就行了。

3、轮播图效果有很多形式,我们这里并不是无缝滚动的形式,所以点击左按钮,可以看到第一张切换到第四张的过程。这里是最基本的轮播图,效果是正常的,不用纠结,也不需要更改。

4、代码的写法不是固定的,事件写在哪里也不是固定的,同学这种写法就可以。建议把鼠标移入,箭头隐藏效果添加上:

https://img.mukewang.com/climg/633cebf7092f6f7909120530.jpg

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

https://img.mukewang.com/climg/633cec9b09edcada07650200.jpg

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

祝学习愉快!

0

0 学习 · 17877 问题

查看课程