实用的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的不规则矩形的排列实现代码

    下面是关于“基于jquery的不规则矩形的排列实现代码”的完整攻略: 1. 前期准备 在开始编写代码之前,我们需要先确定代码所需的资源和环境。具体步骤如下: 确定用于排版的元素样式和尺寸,例如宽度、高度、背景颜色等等。 引入jQuery库,确保代码能够正常执行。 在页面中添加用于显示排版的容器,例如一个<div>标签。 2. 实现思路 在前期准备…

    css 2023年6月10日
    00
  • VsCode 使用基础_VsCode入门小技巧

    VsCode 使用基础 环境准备 在开始使用VsCode之前,我们需要对其环境进行一些准备工作: 安装VsCode:从官网 https://code.visualstudio.com/ 下载并安装VsCode; 安装必要的插件:在VsCode菜单栏中选择“扩展”,搜索并安装以下插件: Markdown All in One:用于编写markdown文件 Br…

    css 2023年6月10日
    00
  • CSS 完美兼容IE6/IE7/FF的通用hack方法

    如果我们在编写CSS代码时,需要考虑兼容IE6/IE7/FF,那么就需要使用CSS通用hack来解决问题。下面是一些常见的CSS通用Hack方法,供参考: 1. 属性前缀法 color: #fff; /* 正常显示 */ _color: #f00; /* 只在IE6/IE7中显示红色 */ *color: #0f0; /* 只在IE6中显示绿色 */ 在IE…

    css 2023年6月10日
    00
  • 基于CSS实现带阴影和小箭头的黑色风格下拉菜单效果

    让我们来详细讲解一下如何基于CSS实现带阴影和小箭头的黑色风格下拉菜单效果吧。 1. HTML代码结构 首先,我们需要构造一个基本的HTML代码结构,包括 ul 和 li 元素,同时给 ul 添加一个类名 dropdown-menu 用于后续的 CSS 样式定制。 <div class="dropdown"> <butt…

    css 2023年6月10日
    00
  • 基于Bootstrap+jQuery.validate实现表单验证

    下面是关于“基于Bootstrap+jQuery.validate实现表单验证”的完整攻略: 操作步骤 第一步:下载Bootstrap和jQuery.validate Bootstrap官网提供了下载地址,你也可以在jQuery.validate的官网上下载该脚本。在下载的文件中,Bootstrap含有css、js等文件,而jQuery.validate只含…

    css 2023年6月11日
    00
  • IE6/7在滚动区域内的标签使用position会飘出这个滚动区域不随滚动条滚动

    问题描述 在IE6/7浏览器中,当在滚动区域内使用css属性 position: absolute 或 position: fixed 的元素时,该元素会出现跑出滚动区域的情况,具体表现为该元素不会随着滚动条的滚动而滚动,而是固定在页面顶部或左侧。 解决方案 在IE6/7浏览器中,使用 zoom:1 和 position: relative 的结合解决该问题…

    css 2023年6月10日
    00
  • vue+elementui实现选项卡功能

    好的。那么我们就来一步一步地详细讲解如何用 Vue 和 ElementUI 实现选项卡功能。 1. 引入和注册 ElementUI 组件库 首先我们需要在项目中引入 ElementUI 组件库。可以使用命令行安装: npm install element-ui -S 然后在项目中使用该组件库,需要在 Vue 中进行注册。可以在 main.js 或相应的组件中…

    css 2023年6月11日
    00
  • BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法

    BootStrap.css 在手机端滑动时右侧出现空白的原因 问题描述 在使用BootStrap.css布局的网站,当在手机端滑动页面时,经常会出现右侧出现空白的问题,这个问题通常出现在使用了container或container-fluid类的元素上。这是因为在手机端,页面宽度比较小,而BootStrap.css默认使用的栅格(Grid System)是基…

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