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

相关文章

  • vue移动UI框架滑动加载数据的方法

    下面给出完整的攻略。 概述 使用vue移动UI框架实现滑动加载数据的方法,其本质是监听页面滚动事件,当页面滚动到一定位置时触发加载数据的操作。具体来说,我们需要通过以下步骤来实现: 监听滚动事件,计算当前页面是否滚动到了底部; 如果滚动到了底部,触发加载数据的操作; 在加载数据的过程中,需要显示加载动画或提示。 代码实现 1. 监听滚动事件 在vue组件的m…

    css 2023年6月10日
    00
  • css3旋转木马_动力节点Java学院整理

    CSS3旋转木马攻略 介绍 CSS3旋转木马是一种较为常见的网页轮播图形式,常见于各种网站的首页或文章页面,通过旋转显示多个内容,让用户可以在不刷新页面的情况下看到更多内容。本攻略将从以下几个方面介绍CSS3旋转木马的实现方法和注意事项。 实现方法 1. HTML结构 CSS3旋转木马的HTML结构核心在于轮播项的容器和轮播项本身。我们可以在一个div中放置…

    css 2023年6月9日
    00
  • css选择器_动力节点Java学院整理

    CSS选择器_动力节点Java学院整理 一、什么是CSS选择器 CSS选择器是CSS中用于选择要应用样式的HTML元素的方式。 在CSS中,选择器是指定要应用样式的特定HTML元素的标识符。通过使用CSS选择器,您可以选择要应用样式的HTML元素,从而更改它们的外观。 二、常用的选择器类型 1.元素选择器 元素选择器会选择指定类型的所有元素。示例代码如下: …

    css 2023年6月9日
    00
  • a标签样式 和 a标签属性写法

    下面我来为您详细讲解一下a标签的样式和属性写法。 a标签样式 a标签可以通过CSS进行样式设置,可以设置的样式包括文字颜色、背景颜色、字体大小、字体粗细、下划线等。 以下是一些常用的a标签样式: 修改文字颜色 a { color: red; } 添加下划线 a { text-decoration: underline; } 修改背景颜色 a { backgr…

    css 2023年6月10日
    00
  • JavaScript实现拖拽效果

    首先,要实现拖拽效果,需要掌握一些JavaScript基础知识,例如事件处理、DOM操作等等。接下来,我将为您提供完整的攻略,包含以下几个步骤: 为被拖拽元素添加事件处理程序 在HTML页面中,我们需要为需要拖拽的元素添加一个事件处理程序。例如,我们可以给目标元素添加一个mousedown事件处理程序,当用户按下鼠标左键时触发拖拽事件。代码如下: docum…

    css 2023年6月10日
    00
  • 学习WEB标准必备的四项技能

    学习 WEB 标准必备的四项技能,是指 HTML、CSS、JavaScript、HTTP。下面给出学习这四项技能的完整攻略。 HTML HTML 是构建 Web 页面的肌骨,它定义了页面的结构和内容。学习 HTML 的过程中,需要掌握以下内容: 标签语义化:使用正确的语义标签来描述网页内容,提高页面可读性和 SEO。例如,使用 h1 标签来表示页面主标题,使…

    css 2023年6月10日
    00
  • jquery动画3.创建一个带遮罩效果的图片走廊

    下面就来详细讲解“jquery动画3.创建一个带遮罩效果的图片走廊”的完整攻略。 1.准备工作 首先,需要创建一个HTML页面,并引入jQuery库和所需的CSS和JS文件。创建一个空白的div作为图片走廊的容器,并在其中添加需要的图片。 <!DOCTYPE html> <html> <head> <meta cha…

    css 2023年6月10日
    00
  • 使用webpack5从0到1搭建一个react项目的实现步骤

    下面是使用webpack5从0到1搭建一个react项目的实现步骤: 步骤1:安装依赖 首先需要安装webpack和webpack-cli的最新版本,使用下面的代码: npm install webpack webpack-cli –save-dev 然后需要安装react和react-dom,输入下面的代码: npm install react reac…

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