老师看一下我的代码是哪里有问题
来源: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回答
同学你好,很抱歉,在第一次回复中忘记提醒样式处的问题了。
是css优先级的问题,opacity:1;是在css中设置的内联样式

而js中设置的opacity是行内样式,根据就近原则,优先级大,所以即使添加上.slider-item-active类也不生效。可以这样修改提升优先级
或者按照同学那种修改方式也可以,实现效果即可。
祝学习愉快!
好帮手慕星星
2021-03-19
同学你好,是base.js文件中to方法的问题:
1、this.getCorrectedIndex()方法已经更正了index,下面不需要再次判断了,否则无法设置样式
2、通过索引获取某一个元素,需要用this.sliderItemEls
3、classList属性从元素上获取即可,不需要通过style获取
如下修改:

祝学习愉快!
相似问题