实用的js 焦点图切换效果 结构行为相分离

下面是关于“实用的js 焦点图切换效果 结构行为相分离”的完整攻略:

一、什么是结构行为相分离

结构行为相分离(Separation of Concerns,SoC)是一种设计思想,即将一个系统分为若干个组成部分,每个部分负责不同的内容,从而使系统更加模块化、可维护和可扩展。在Web开发中,这种设计思想得到广泛应用,尤其在前端开发中更是不可或缺。

具体来说,结构行为相分离在前端开发中主要有两个方面的应用:

  1. HTML和CSS的分离:将页面的结构和样式分离开来,让页面的结构更加清晰,易于修改和维护。

  2. JS的分离:将页面的交互行为和页面逻辑分离开来,保持页面的可维护性和可扩展性。

二、实现方案

对于页面中的焦点图(轮播图)切换效果,我们可以通过结构行为相分离的思想来实现:

  1. HTML结构部分

HTML结构部分主要包括焦点图容器、图片列表和图片说明等。

<div class="slider">
  <ul class="slider-list">
    <li><img src="img/1.jpg" alt=""/></li>
    <li><img src="img/2.jpg" alt=""/></li>
    <li><img src="img/3.jpg" alt=""/></li>
    <li><img src="img/4.jpg" alt=""/></li>
    <li><img src="img/5.jpg" alt=""/></li>
  </ul>
  <div class="slider-nav"></div>
  <div class="slider-prev"></div>
  <div class="slider-next"></div>
</div>
  1. CSS样式部分

CSS样式部分主要包括焦点图容器、图片列表和图片说明等的样式。

.slider {
  position: relative;
  width: 800px;
  height: 400px;
  margin: 0 auto;
}

.slider-list {
  position: absolute;
  width: 500%;
  height: 100%;
  left: 0;
  top: 0;
}

.slider-list li {
  float: left;
  width: 20%;
  height: 100%;
  overflow: hidden;
}

.slider-list li img {
  width: 100%;
  height: 100%;
  display: block;
}

.slider-nav {
  position: absolute;
  bottom: 20px;
  right: 20px;
  z-index: 999;
}

.slider-nav span {
  display: inline-block;
  width: 10px;
  height: 10px;
  margin-left: 5px;
  border-radius: 50%;
  background-color: #000;
  cursor: pointer;
}

.slider-nav span.active {
  background-color: #fff;
}

.slider-prev,
.slider-next {
  position: absolute;
  top: 50%;
  margin-top: -24px;
  width: 48px;
  height: 48px;
  background-image: url('img/prev-next.png');
  background-position: 0 0;
  cursor: pointer;
}

.slider-next {
  right: 0;
  background-position: -48px 0;
}
  1. JS行为部分

JS行为部分主要负责焦点图的切换动效和导航按钮的切换。

// 获取DOM元素
var slider = document.querySelector('.slider');
var sliderList = slider.querySelector('.slider-list');
var sliderItems = slider.querySelectorAll('.slider-list li');
var sliderNav = slider.querySelector('.slider-nav');
var sliderPreBtn = slider.querySelector('.slider-prev');
var sliderNextBtn = slider.querySelector('.slider-next');
var navItems = [];
var curIndex = 0;

// 初始化DOM元素状态
for (var i = 0; i < sliderItems.length; i++) {
  var span = document.createElement('span');
  sliderNav.appendChild(span);
  navItems.push(span);
}
navItems[curIndex].classList.add('active');
sliderList.style.left = 0;

// 切换动效函数
function switchSlider(nextIndex) {
  var startLeft = parseInt(sliderList.style.left) || 0;
  var endLeft = -nextIndex * slider.offsetWidth;
  var curLeft = startLeft;
  var step = 0;
  var count = 10;
  var interval = 16;
  var dis = endLeft - startLeft;

  function animate() {
    step++;
    if (step >= count) {
      clearInterval(timer);
      curIndex = nextIndex;
      return;
    }
    curLeft = startLeft + dis * step / count;
    sliderList.style.left = curLeft + 'px';
  }

  var timer = setInterval(animate, interval);
}

// 导航按钮点击事件
sliderNav.addEventListener('click', function(e) {
  if (e.target.tagName.toLowerCase() === 'span') {
    var index = navItems.indexOf(e.target);
    if (index !== curIndex) {
      navItems[curIndex].classList.remove('active');
      navItems[index].classList.add('active');
      switchSlider(index);
    }
  }
});

// 左右切换按钮点击事件
sliderPreBtn.addEventListener('click', function() {
  var index = curIndex - 1;
  if (index < 0) {
    index = navItems.length - 1;
  }
  navItems[curIndex].classList.remove('active');
  navItems[index].classList.add('active');
  switchSlider(index);
});
sliderNextBtn.addEventListener('click', function() {
  var index = curIndex + 1;
  if (index >= navItems.length) {
    index = 0;
  }
  navItems[curIndex].classList.remove('active');
  navItems[index].classList.add('active');
  switchSlider(index);
});

// 自动播放
var autoPlayTimer = setInterval(function() {
  var index = curIndex + 1;
  if (index >= navItems.length) {
    index = 0;
  }
  navItems[curIndex].classList.remove('active');
  navItems[index].classList.add('active');
  switchSlider(index);
}, 3000);

三、示例说明

下面是两个示例说明:

示例一

假设我们现在要在一个具有图片切换效果的页面中添加一个新的焦点图切换功能,该功能可以通过一个新的HTML容器来实现,同时还需保持页面的结构清晰和可维护性,那么我们就可以利用结构行为相分离的思想,将该功能的JS行为与当前的JS行为部分分离开来,在自己的JS文件中完成该功能的实现,从而达到复用JS代码的目的。

示例二

假设我们现在要在一个页面中添加一个新的交互行为,该交互行为需要与已有的焦点图切换功能进行联动,那么我们就可以使用事件订阅(Event Subscription)的方式来实现结构行为相分离。具体来说,我们可以在已有的JS行为部分中使用一个事件来代替某个具体的操作,如焦点图切换结束后触发一个名为“switched”的自定义事件,然后在新的交互行为中监听该事件,从而实现两个交互行为的联动。这样可以通过结构行为相分离的方式来进行代码复用,并提高代码的可维护性和可扩展性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:实用的js 焦点图切换效果 结构行为相分离 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • css3一个简易的 LED 数字时钟实现方法

    以下是“CSS3一个简易的 LED 数字时钟实现方法”的完整攻略: CSS3一个简易的 LED 数字时钟实现方法 在 CSS3 中,可以使用伪元素和动画来实现一个简易的 LED 数字时钟。以下是一些常见的实现方法。 HTML 结构 首先,需要创建一个 HTML 结构来容纳 LED 数字时钟。例如: <div class="led-clock&…

    css 2023年5月18日
    00
  • CSS 制作网页导航条(上)

    CSS 制作网页导航条(上) CSS制作网页导航条是前端开发中的基础技能之一,以下是制作网页导航条的基本步骤和示例说明: 基本步骤 创建HTML文件:在HTML文件中添加导航栏元素,例如: <!DOCTYPE html> <html> <head> <title>网页标题</title> <l…

    css 2023年5月18日
    00
  • 兼容主流浏览器的CSS透明代码(必看篇)

    下面详细讲解“兼容主流浏览器的CSS透明代码(必看篇)”的完整攻略。 什么是CSS透明代码 CSS透明代码是指在Web页面中,通过CSS样式实现元素背景透明的技术。 通过调节透明度值,可以让元素显示成半透明或全透明,从而带来更好的视觉效果,让页面看起来更加美观。 如何实现兼容主流浏览器的CSS透明代码 下面是一些常用的CSS透明代码实现方式: 使用RGBA颜…

    css 2023年6月9日
    00
  • 详细介绍CSS中的伪选择器

    接下来我将详细介绍CSS中的伪选择器。 什么是CSS中的伪选择器 CSS中的伪选择器(pseudo-selector)是一种语法结构,可以用于选择不同状态下的元素。伪选择器以冒号(:)开头,通常用于选择元素的某个状态或某些特定的子元素,可以把它们看作是CSS选择器的扩展。 CSS中的伪选择器分类 伪选择器可以分为两大类:伪类(Pseudo-classes)和…

    css 2023年6月9日
    00
  • CSS样式表与具体设备表示

    CSS样式表与具体设备表示,是指在为不同设备编写CSS样式时,需要使用一些特定的代码来自适应不同的屏幕大小和设备类型。 以下是完整攻略,包括两个示例说明: 一、基础方案:使用媒体查询 媒体查询是一种CSS技术,可以根据不同的设备类型和屏幕大小,在同一个样式表中指定不同的样式。通过媒体查询,可以为不同大小的设备定义不同的样式,从而使网页在各种设备上都能正常显示…

    css 2023年6月9日
    00
  • Ajax轮询请求状态(微信公众号带参数二维码登录网站)

    下面是关于“Ajax轮询请求状态(微信公众号带参数二维码登录网站)”的完整攻略。 什么是Ajax轮询请求状态? Ajax轮询是指一种通过反复向服务器发送请求的方式来获取最新状态信息的技术。在Web应用中,我们通常使用Ajax轮询来实现长时间的异步数据请求。 在使用Ajax轮询的过程中,我们可以设置一个时间间隔来反复向服务器请求数据,如果服务器有新的数据产生,…

    css 2023年6月9日
    00
  • css 微格式 XFN规范

    CSS 微格式 XFN 规范是一种用于定义网页中人际关系的标准,它可以帮助搜索引擎更好地理解网页内容,提高网页的可读性和可访问性。下面是 CSS 微格式 XFN 规范的详细讲解。 1. 什么是 CSS 微格式 XFN 规范 CSS 微格式 XFN 规范是一种用于定义网页中人际关系的标准,它使用简单的 HTML 标签和 class 属性来表示人际关系,例如朋友…

    css 2023年5月18日
    00
  • VS Code代码六边形颜色长度怎么设置未错误?

    VS Code代码六边形颜色长度设置攻略 在 VS Code 中,六边形颜色长度通常指的是 CSS 颜色值的长度。设置正确的颜色长度可以让你的代码更具可读性,并且避免出现一些错误。接下来,我们将详细讲解如何设置 VS Code 中的六边形颜色长度。 步骤一:打开设置 首先,我们需要打开 VS Code 设置。方法是在菜单栏中选择 File -> Pre…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部