老师看一下我的代码是哪里有问题

来源:6-2 项目作业

API调用工程师

2021-03-18 20:48:33

问题描述:

我目前刚开始写这个项目,只是想实现传入初始索引,然后会变化当前的图片。

相关代码:

base.js

import { ELEMENT_NODE_TYPE } from "./constants.js";

import DEFAULTS from "./defaults.js";
class BaseSlider {
constructor(el, options) {
if (el.nodeType !== ELEMENT_NODE_TYPE) {
throw new Error("实例化的时候,请传入 DOM 元素!");
}
// 实际参数
this.options = {
...DEFAULTS,
...options,
};
const sliderEl = el;
const sliderContentEl = sliderEl.querySelector(".slider-content");
const sliderItemEls = sliderContentEl.querySelectorAll(".slider-item");
// 添加到 this 上,为了在方法中使用
this.sliderEl = sliderEl;
this.sliderContentEl = sliderContentEl;
this.sliderItemEls = sliderItemEls;

this.minIndex = 0;
this.maxIndex = sliderItemEls.length - 1;
this.currIndex = this.getCorrectedIndex(this.options.initialIndex);

this.init();
}
init() {
//切换到初始索引 initialIndex
this.to(this.currIndex);
}
getCorrectedIndex(index) {
if (index < this.minIndex) return this.maxIndex;
if (index > this.maxIndex) return this.minIndex;
return index;
}
to(index) {
index = this.getCorrectedIndex(index);
if (this.currIndex === index) return;
this.currIndex = index;
for (const items of this.sliderItemEls) {
items.style.opacity = 0;
}

items[index].style.classList.add("slider-item-active");
}
}

export default BaseSlider;

constants.js

export const ELEMENT_NODE_TYPE = 1;

defaults.js

const DEFAULTS = {
// 初始索引
initialIndex: 0,
};
export default DEFAULTS;

index.js

import Slider from "./slider.js";

new Slider(document.querySelector(".banner-slider"), {
initialIndex: 2,
});

slider.js

import BaseSlider from "./base.js";
// 继承基类
class Slider extends BaseSlider {
constructor(el, options) {
super(el, options);
}
}

export default Slider;

 index.html

  <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<link rel="stylesheet" href="css/base.css" />
<link rel="stylesheet" href="css/index.css" />
</head>

<body>
<div class="wrap">
<!-- 第一种切换方式 -->
<div class="banner demo">
<h3>自动或点击小圆点切换图片</h3>
<div class="slider-layout">
<div class="banner-slider slider">
<div class="slider-content">

<div class="slider-item">
<img src="img/banner01.png" alt="" />
</div>
<div class="slider-item">
<img src="img/banner02.png" alt="" />
</div>
<div class="slider-item">
<img src="img/banner03.png" alt="" />
</div>
</div>
<div class="dots pagination">
<span class="active"></span>
<span></span>
<span></span>
</div>
</div>
</div>
</div>
<!-- 第二种切换方式 -->
<div class="tab demo">
<h3>选项卡切换</h3>
<div class="slider-layout">
<div class="tab-slider slider">
<div class="slider-content">
<div class="slider-item slider-item-active">
<img src="img/banner01.png" alt="" />
</div>
<div class="slider-item">
<img src="img/banner02.png" alt="" />
</div>
<div class="slider-item">
<img src="img/banner03.png" alt="" />
</div>
<div class="slider-item">
<img src="img/banner03.png" alt="" />
</div>
</div>
<div class="pagination">
<span class="active">最新招标</span>
<span>装修日记</span>
<span>装修百科</span>
</div>
</div>
</div>
</div>
<!-- 第三种切换方式 -->
<div class="pagination-arrow demo">
<h3>按钮和小圆点切换</h3>
<div class="slider-layout">
<div class="banner-slider slider">
<div class="slider-content">
<div class="slider-item slider-item-active">
<img src="img/banner01.png" alt="" />
</div>
<div class="slider-item">
<img src="img/banner02.png" alt="" />
</div>
<div class="slider-item">
<img src="img/banner03.png" alt="" />
</div>
</div>
<div class="dots pagination">
<span class="active"></span>
<span></span>
<span></span>
</div>
<div class="arrow">
<div class="prev"></div>
<div class="next"></div>
</div>
</div>
</div>
</div>
</div>
<script src="./js/index.js" type="module"></script>
</body>
</html>

base.css

 

* {
margin: 0;
padding: 0;
font-family: "微软雅黑";
box-sizing: border-box;
}
/* layout */
.wrap {
width: 1200px;
margin: 0 auto;
}
.demo {
margin-bottom: 20px;
}
.demo {
background: #f2f2f2;
}
.slider-layout {
width: 1200px;
height: 300px;
margin: 0 auto;
cursor: pointer;
}
/* slider */

.slider,
.slider-content,
.slider-item,
.slider-img {
width: 100%;
height: 100%;
cursor: pointer;
}

.slider {
overflow: hidden;
position: relative;
border-radius: 8px;
border: 1px solid gray;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
-ms-border-radius: 8px;
-o-border-radius: 8px;
}

.slider-item {
position: absolute;
top: 0;
left: 0;
transition: all 0.3s;
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
-ms-transition: all 0.3s;
-o-transition: all 0.3s;
}
.slider-item img {
width: 100%;
height: 300px;
}

.slider-item-active {
opacity: 1;
transition: all 0.3s;
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
-ms-transition: all 0.3s;
-o-transition: all 0.3s;
}

/* 小圆点 */

.dots {
position: absolute;
left: 50%;
transform: translate(-50%);
bottom: 20px;
}

.dots span {
display: inline-block;
width: 10px;
height: 10px;
margin: 0 5px;
border-radius: 50%;
background: #333;
}

.dots span.active {
background: #0058aa;
transform: scale(1.5);
-webkit-transform: scale(1.5);
-moz-transform: scale(1.5);
-ms-transform: scale(1.5);
-o-transform: scale(1.5);
}

/* arrow */

.arrow div {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 60px;
height: 60px;
border-radius: 50%;
background: rgba(0, 0, 0, 0.3) no-repeat center center;
background-size: 48px 48px;
}

.arrow .prev {
left: 0;
background-image: url("../img/prev.png");
}

.arrow .next {
right: 0;
background-image: url("../img/next.png");
}
h3 {
font-size: 32px;
color: #696868;
font-weight: normal;
text-align: center;
padding: 20px 0;
}

index.css 


/* 第二种样式 */
.tab .slider-layout {
height: 360px;
}
.tab-slider {
padding-top: 60px;
}
.tab-slider .pagination {
position: absolute;
top:0;
width: 100%;
}
.tab-slider .pagination span{
float:left;
width: 33.33%;
line-height: 60px;
text-align:center;
border-radius:8px;
-webkit-border-radius:8px;
-moz-border-radius:8px;
-ms-border-radius:8px;
-o-border-radius:8px;
}
.tab-slider .slider-item{
top: 60px;
}
.tab-slider .pagination span.active {
color: #fff;
background: #0058AA;
}

/* 第三种方式 */
.pagination-arrow .arrow div{
opacity: 0;
}


写回答

2回答

好帮手慕星星

2021-03-19

同学你好,很抱歉,在第一次回复中忘记提醒样式处的问题了。

是css优先级的问题,opacity:1;是在css中设置的内联样式

http://img.mukewang.com/climg/605444eb0923efbe03620215.jpg

而js中设置的opacity是行内样式,根据就近原则,优先级大,所以即使添加上.slider-item-active类也不生效。可以这样修改提升优先级

http://img.mukewang.com/climg/6054453d0949b7d804400264.jpg

或者按照同学那种修改方式也可以,实现效果即可。

祝学习愉快!

0

好帮手慕星星

2021-03-19

同学你好,是base.js文件中to方法的问题:

1、this.getCorrectedIndex()方法已经更正了index,下面不需要再次判断了,否则无法设置样式

2、通过索引获取某一个元素,需要用this.sliderItemEls

3、classList属性从元素上获取即可,不需要通过style获取

如下修改:

http://img.mukewang.com/climg/60540a850947645f08710406.jpg

祝学习愉快!

0
hPI调用工程师
hp dir="ltr">是css样式表优先级的问题吗

h021-03-19
共5条回复

0 学习 · 15276 问题

查看课程