请老师帮忙查看
当前目录下的index.js文件
import'./css';
import Slider from './module';
// 实例化基类
const slider = new Slider(document.querySelector('.slider'),{
initiallndex:2,
// 切换时是否有动画
animation:true,
// 切换速度,单位ms
speed:300,
// 自动切换,单位ms
autoplay:1000
});
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 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>
</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>
</body>
</html>
css文件夹
(1)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)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;
opacity: 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;
}
/* 控制动画 */
.slider-animation{
transition-property:transform;
transition-duration: 0ms;
}
module文件夹
(1)base.js文件:
// 引入常量
import { ELEMENT_NODE_TYPE,SLIDER_ANIMATION_CLASS_NAME} from './constants';
import DEFAULTS from './defaults';
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.cueeIndex = this.getCorrectedIndex(this.options.initiallndex);
// 每个slider-item的宽度(每次移动的距离)
this.itemWidth = sliderItemEls[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设置宽度:所有slider-item的宽度之和
this.setContentWidth();
// 切换到初始索引initiallndex
this.move(this.getDistance());
// 开启动画
if(this.options.animation){
// 执行开启动画方法
this.openAnimation();
}
// 自动切换
if(this.options.autoplay){
// 执行自动切换方法
this.autoplay();
}
}
// 为每个slider-item设置宽度
setItemsWidth(){
for (const item of this.sliderContentEls){
item.style.width = `${this.itemWidth}px`;
}
}
// 为每个slider-content设置宽度
setContentWidth(){
this.sliderContentEL.style.width = `${this.itemWidth * this.sliderContentEls.length}px`;
}
// 不带动画的移动move方法
move(distance) {
this.sliderContentEl.style.transform = `translate3d(${distance}px, 0px, 0px)`;
}
// 获取要移动的距离
getDistance(index = this.currIndex) {
return -this.itemWidth * index;
}
// 开启动画方法
openAnimation(){
this.sliderContentEl.classList.add(SLIDER_ANIMATION_CLASS_NAME);
}
// 设置切换动画速度的方法
setAnimationSpeed(speed = this.options.speed){
this.sliderContentEl.style.transitionDuration = `${speed}ms`;
}
// 关闭动画的方法
closeAnimation(){
this.setAnimationSpeed(0);
}
// 带动画的移动方法
moveWithAnimation(distance){
// 默认参数
this.setAnimationSpeed;
// 调用带动画的移动方法
this.meve(distance)
// 用完动画,速度还原为0
this.sliderContentEL.addEventListener(
'transitionend',
()=>{
this.closeAnimation();
},
false
);
}
// 自动切换方法
autoplay(){
if(this.options.autoplay <= 0) return;
// 先执行自动切换
this.pause();
// 定时器
this.autoplayTimer = setInterval(()=>{
this.next();
},autoplay);
}
// 暂停自动切换方法
pause(){
// 清除定时器
clearInterval(this.autoplayTimer);
}
// 切换到上一张方法
prev(){
this.options(this.currIndex -1);
}
// 切换到下一张方法
next(){
this.options(this.currIndex +1);
}
// 切换到index索引对应的幻灯片方法
to(index){
// 校正传进来的参数
index = this.getCorrectedIndex(index);
// 判断当前索引是否等于传进来的索引
if(this.currIndex === index) return;
// 如果不等,则让其相等
this.currIndex = index;
// 获取移动距离
const distance = this.getDistance();
// 再判断是否有动画,有则调用动画移动方法
if(this.options.animation){
this.moveWithAnimation(distance);
}else{
this.move(distance);
}
}
}
export default BaseSlider;
(2)constants.js文件:
// base
export const ELEMENT_NODE_TYPE =1;
// 与base.css文件对应
export const SLIDER_ANIMATION_CLASS_NAME = 'slider-animation';
(3)defaults.js文件:
// 默认参数
const DEFAULTS = {
// 初始索引
initiallndex:0,
// 切换时是否有动画
animation:true,
// 切换速度,单位ms
speed:300,
// 自动切换,单位ms
autoplay:0
};
export default DEFAULTS;
(4)first.js文件
import BaseSlider from './base.js';
// 继承基类
class firstSlider extends BaseSlider{
constructor(el,options){
// 调用构造方法
super(el,options);
// 获取小圆点
this.dots = this.sliderEl.querySelector('#dots');
// 获取图片
this.sliderItemEls = this.sliderEl.querySelector('#slider-item');
this.addBindEvent();
this.addBindEventmouse();
}
// 圆点绑定事件
addBindEvent(){
this.dots.addEventListener(
'click',
()=>{
// 小圆点变成活跃形式
this.dots.className = 'active';
// 图片跟着改变
this.sliderItemEls.className = 'slider-item-active';
}
)
}
// 图片区域绑定鼠标事件
addBindEventmouse(){
this.sliderEl.addEventListener(
'moserenter',
()=>{
// 鼠标移入,执行暂停自动切换方法
slider.pause();
},
false
);
this.sliderEl.addEventListener(
'moseleave',
()=>{
// 鼠标移出,执行自动切换方法
slider.autoplay();
},
false
);
}
}
export default firstSlider;
(5)index.js文件
import './base';
// 子类继承父类
class Slider extends BaseSlider {
constructor(el,options){
super(el,options);
}
}
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星