实用的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日

相关文章

  • jQuery 选择器(61种)整理总结

    jQuery 选择器(61种)整理总结 什么是jQuery选择器 在jQuery中,选择器是用来选择HTML元素的一种方法。jQuery允许你使用CSS选择器,DOM元素和自定义的选择器来选择DOM元素。 基本选择器 基本选择器用于选择指定的HTML元素。jQuery提供了以下基本选择器: 1. 元素选择器 元素选择器选取特定类型的元素。语法为: $(ele…

    css 2023年6月10日
    00
  • 浅谈CSS中overflow清除浮动的用法

    以下是关于 “浅谈CSS中overflow清除浮动的用法” 的详细攻略。 什么是浮动 在CSS中,浮动指将元素从其正常位置移动,并沿着其父元素的左侧或右侧浮动。这个概念是为了能够将文本和图片等元素组合在一起,以形成复杂的布局。 浮动元素带来的问题 当一个元素浮动时,其它元素可能会出现在它的下方,这时候就需要通过清除浮动来确保页面布局不混乱。 如何清除浮动 空…

    css 2023年6月10日
    00
  • 让IE6/IE7/IE8支持CSS3属性的8种方法介绍

    以下是“让IE6/IE7/IE8支持CSS3属性的8种方法介绍”的完整攻略: 1. 使用CSS3 PIE CSS3 PIE是一个为IE6~IE9提供CSS3属性支持的JavaScript库,通过将CSS3属性解析成标准的IE滤镜表达式来实现。使用CSS3 PIE,我们可以轻松地给IE6~IE9添加圆角、shadow、渐变等一系列CSS3属性的支持。下面是一个…

    css 2023年6月9日
    00
  • JQuery Dialog(JS 模态窗口,可拖拽的DIV)

    JQuery Dialog(JS 模态窗口,可拖拽的DIV)攻略 什么是JQuery Dialog? JQuery Dialog是基于JQuery库封装的一个JS模态窗口组件,可轻松实现模态窗口的弹出、拖拽、关闭等功能。 如何使用JQuery Dialog? 引入JQuery和JQuery Dialog库 在页面中引入JQuery和JQuery Dialog…

    css 2023年6月11日
    00
  • 小程序中使用css var变量(使js可以动态设置css样式属性)

    使用 CSS 变量可以大大提高开发效率,让我们能够一次性定义样式,然后全局使用。在小程序中使用 CSS 变量,可以使 JS 可以动态设置 CSS 样式属性。 下面是使用 CSS 变量(或者称为 CSS 自定义属性)的完整攻略: 在样式中定义变量 使用 CSS 变量需要在样式中先定义变量名及其对应的值,语法为:–变量名: 值;。例如: :root { –m…

    css 2023年6月9日
    00
  • js实现鼠标点击左上角滑动菜单效果代码

    下面我来详细讲解一下如何实现鼠标点击左上角滑动菜单效果的代码攻略。 1.准备工作 在实现滑动菜单效果之前,我们需要准备以下工作: HTML 模板:我们需要一个 HTML 模板,包含一个菜单按钮和一个菜单内容的容器。 CSS 样式:我们需要用 CSS 样式来实现菜单内容的定位和显示效果。 JavaScript 代码:我们需要使用 JavaScript 代码来实…

    css 2023年6月10日
    00
  • 使用react+redux实现弹出框案例

    使用React和Redux实现弹出框案例可以分为以下几个步骤: 1. 创建React组件 首先,在React中创建一个弹出框组件,该组件需要有以下几个基本的属性和方法: isOpen: 控制弹出框是否可见的状态属性 open(): 打开弹出框的方法 close(): 关闭弹出框的方法 onConfirm(): 用户确认操作时触发的回调函数 onCancel(…

    css 2023年6月10日
    00
  • SpringBoot+Vue+Redis实现单点登录(一处登录另一处退出登录)

    下面是 “SpringBoot+Vue+Redis实现单点登录(一处登录另一处退出登录)” 的完整攻略。 一、前置知识 在讲解实现单点登录的过程中,我们需要掌握以下技术: SpringBoot:后端框架,用来提供 RESTful API 服务; Vue:前端框架,用来构建单页应用; Redis:一个内存数据库,用来保存用户会话信息。 如果对这些技术还不太了解…

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