请老师看下问题

来源:4-4 自由编程

澄月

2022-05-09 23:33:56

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Module 的基本用法</title>
    <link rel="stylesheet" href="./css/slider.css" />
  </head>
  <body>
    <div class="slider-layout">
      <div class="slider">
        <div class="slider-content">
          <div class="slider-item">
            <a href="javascript:;"
              ><img src="./imgs/1.jpg" alt="1" class="slider-img"
            /></a>
          </div>
          <div class="slider-item">
            <a href="javascript:;"
              ><img src="./imgs/2.jpg" alt="1" class="slider-img"
            /></a>
          </div>
          <div class="slider-item">
            <a href="javascript:;"
              ><img src="./imgs/3.jpg" alt="1" class="slider-img"
            /></a>
          </div>
          <div class="slider-item">
            <a href="javascript:;"
              ><img src="./imgs/4.jpg" alt="1" class="slider-img"
            /></a>
          </div>
        </div>
      </div>
    </div>
   <script src="./js/index.js" type="module">
   </script>
  </body>
</html>
import { Slider } from "./slider.js";

new Slider(document.querySelector('.slider'));
import { BaseSlider } from "./baseSlider";/*父类 */
import { events } from "./events.js";//方法事件
class Slider extends BaseSlider {
    constructor(el, options) {
        super(el, options);
        this._bindEvent();
    }

    _bindEvent() {
        events.bindEvent(this);
    }
}
export default Slider;
import { DEFAULTS } from "./defaults.js";//默认参数
import { ELEMENT_NODE, SLIDER_ANIMATION_CLASSNAME } from "./constant.js";/*常量 */
// 父类
class BaseSlider {
    constructor(el, 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;
    }
}
export default BaseSlider;
const events = {
    bindEvent(slider) {
        document.addEventListener(
            'keyup',
            ev => {
                if (ev.keyCode === 37) {
                    slider.prev();
                } else if (ev.keyCode === 39) {
                    slider.next();
                }
            },
            false
        );
    }
}
export default events;
// base
const ELEMENT_NODE = 1;
const SLIDER_ANIMATION_CLASSNAME = 'slider-animation';
export { ELEMENT_NODE, SLIDER_ANIMATION_CLASSNAME };
// 默认参数
const DEFAULTS = {
    // 初始索引
    initialIndex: 0,
    // 切换时是否有动画
    animation: true,
    // 切换速度,单位 ms
    speed: 300
};
export default DEFAULTS;

https://img.mukewang.com/climg/6279342509d15e1c19050335.jpg

问题描述:

老师,麻烦看下baseSlider报错404是什么情况呢,检查好多遍了,没找到问题.......

写回答

1回答

好帮手慕久久

2022-05-10

同学你好,代码有如下问题:

1、引入js文件时,需要补全“.js”的后缀,否则会报同学截图中的错误:

https://img.mukewang.com/climg/6279cf6d091aa9cd17950128.jpg

修改如下:

https://img.mukewang.com/climg/6279cfc309e1746c07450075.jpg

同学把所有文件中的引入语句,都检查一下。

2、默认导出的模块,引入时,不能写成如下形式(不能写大括号):

https://img.mukewang.com/climg/6279cfca09cfce5c06860061.jpg

https://img.mukewang.com/climg/6279cfe309fe6c2708460297.jpg

修改如下:

https://img.mukewang.com/climg/6279cffd091291c108070417.jpg

同学代码中很多这种导入错误,要全部调整一下。

祝学习愉快!

0

前端工程师

前端入门如同写字,如果你不知道从哪开始,那就选择前端(含Vue3.x,React17,TS)

20327 学习 · 17877 问题

查看课程