Maison  >  Article  >  interface Web  >  Encapsulation de la fonction d'assouplissement dans le graphique carrousel JS

Encapsulation de la fonction d'assouplissement dans le graphique carrousel JS

高洛峰
高洛峰original
2017-01-16 14:37:081168parcourir

La racine du carrousel est en fait l'encapsulation de la fonction d'assouplissement. Si le carrousel est une voiture en marche, alors la fonction d'assouplissement est son moteur. Aujourd'hui, cet article vous fera passer du simple au complexe, l'encapsulation de votre propre fonction d'assouplissement~. ~

Nous partons du point de vue de la demande, donnons d'abord une demande simple :

1. Je veux qu'une case sur la page se déplace de la position de départ à une vitesse uniforme. le bon mouvement à 200px ?

Analyse :

1) Nous devons savoir où se trouve la boîte, ce qui peut être obtenu via l'attribut offsetLeft

2) Pour faire bouger la boîte à une vitesse constante ; speed, js est absolument requis setInterval;

3) Voulez-vous que la boîte s'exécute vers la droite ? Cela signifie que vous devez constamment modifier la distance entre la boîte et le point de départ à gauche, y compris la marge gauche et le positionnement à gauche. Ici, j'ai choisi de modifier le positionnement absolu à gauche

4) Courir à distance ; de 200px à partir du point de départ. Si nous voulons arrêter, utilisez simplement clearInterval.

Puis allez directement dans le code

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8" />
  <title>Document</title>
  <style type="text/css">
   * {
    margin: 0;
    padding: 0;
   }
   div {
    position: absolute;
    top: 50px;
    width: 100px;
    height: 100px;
    background-color: red;
   }
   input {
    width: 100px;
    height: 30px;
    color: #fff;
    background-color: yellowgreen;
   }
 
  </style>
 </head>
 
 <body>
  <div></div>
  <input type="button" value="移动到200" />
 
 
  <script type="text/javascript">
   // 获取到元素(这里有个小细节,如果给元素设置了id名,即便不使用获取元素的方法,也能通过这个id名获取到元素哦~~大家可以自己尝试一下)
   var btn = document.querySelector(&#39;input&#39;),
     dv = document.querySelector(&#39;div&#39;);
   // 添加点击事件
   btn.addEventListener(&#39;click&#39;,function() {
    var timer = null,// 保存定时器
      currentDistance = dv.offsetLeft, // 当前离父盒子的距离
      step = 8,// 每次改变的距离
      target = 200;// 目标距离
    timer = setInterval(function() {
     currentDistance += step;// 当前距离 = 上一个当前距离 + 改变的距离
     if((target - currentDistance) < step) { 
      currentDistance = target; // 如果目标距离与当前距离的差小于了要改变的距离,这时候我们就直接让当前距离等于目标距离,防止盒子停下来的时候有误差
      clearInterval(timer); // 清楚定时器
      timer = null; // 将timer解绑,释放内存
     }
     dv.style.left = currentDistance + &#39;px&#39;; // 最核心的一步,改变盒子的left为当前距离
    },17)
   })
  </script>
 </body>
</html>

2. Un effet de mouvement préliminaire a été obtenu, puis nous avons amélioré les exigences :

La boîte se déplace à 200px Après positionnement. , nous voulons que la boîte continue à se déplacer vers la position de 400px ?

Analyse :

1). À ce moment, il y a deux boutons sur lesquels cliquer. L'un se déplace vers 200px, et l'autre se déplace vers 400px

2). sont deux mouvements, mais les fonctions qu'ils utilisent sont les mêmes, se déplaçant d'un point à un autre, nous envisageons donc d'encapsuler le mouvement en 1 dans une fonction pour la réutiliser.

Code~ 

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8" />
 <title>Document</title>
 <style type="text/css">
 * {
  margin: 0;
  padding: 0;
 }
 div {
  position: absolute;
  top: 50px;
  width: 100px;
  height: 100px;
  background-color: red;
 }
 input {
  width: 100px;
  height: 30px;
  color: #fff;
  background-color: yellowgreen;
 }
 
 </style>
</head>
 
<body>
 <div></div>
 <input type="button" value="移动到200" />
 <input type="button" value="移动到400" />
 <script type="text/javascript">
 // 封装函数,盒子和目标距离都是不确定的,我们可以将他们作为参数传递。
 function animation(tag,target) {
  var timer = null,
   currentDistance = tag.offsetLeft,
   step = 5;
  step = currentDistance < target? step: -step;// 判断step的正负,200到400时是递增,400到200时是递减
  timer = setInterval(function() {
  if(Math.abs(currentDistance - target) > Math.abs(step)) { // 这里判断条件也要略作改动,使用绝对值进行比较
   currentDistance += step; /
   tag.style.left = currentDistance + &#39;px&#39;;
  }else {
   tag.style.left = target + &#39;px&#39; // 当当前距离与目标距离之间的差值小于step改变的距离时,我们直接让盒子移动到目标距离。
   clearInterval(timer);
   timer = null;
  }
  },17)
 }
 var btns = document.querySelectorAll(&#39;input&#39;),
  dv = document.querySelector(&#39;div&#39;);
 btns[0].addEventListener(&#39;click&#39;,function() {
  animation(dv,200);
 })
 btns[1].addEventListener(&#39;click&#39;,function() {
  animation(dv,400);
 })
 </script>
</body>
</html>

3. Nous avons encapsulé la fonction permettant à la boîte de se déplacer d'avant en arrière, mais pensons à nouveau à l'effet de défilement du carrousel. une vitesse constante, mais à une vitesse constante. C'est très grumeleux au début, puis ralentit progressivement à l'approche de la fin du parchemin.

Exigences : faciliter la boîte (c'est-à-dire un mouvement à vitesse variable)

Télécharger le code~ 

function animation(tag,target) {
  var timer = null;
  timer = setInterval(function() {
  var currentDistance = tag.offsetLeft,
   step = (target - currentDistance) / 5;// 通过目标距离与当前距离的差除以5便达到了我们需要的变速运动,因为step每次定制器执行都要改变,所以放入定时器内
  step = step > 0 ? Math.ceil(step):Math.floor(step);// 这里如果将currentDistance定时器外面声明可以不用写,如果放在定时器内声明,因为offsetLeft取整的特性,要对step进行取整
  if(Math.abs(currentDistance - target) > Math.abs(step)) {
   currentDistance += step;
   tag.style.left = currentDistance + &#39;px&#39;;
  }else {
   tag.style.left = target + &#39;px&#39;
   clearInterval(timer);
   timer = null;
  }
  },17)

D'accord, l'assouplissement le plus élémentaire requis pour une image de carrousel. la fonction est terminée ~

Voici une fonction d'assouplissement plus complète : sa fonction est plus complète et peut changer plusieurs styles en même temps.

function perfectAnimate(tag, obj, fn) {// 传三个参数,运动的盒子,对象(可以传多个属性),回调函数(在执行完后可以再执行自定义的功能)
 clearInterval(tag.timer);// 这里将定时器作为tag标签的属性保存,可以多次调用函数清除上一个定时器。
 tag.timer = setInterval(function () {
  var flag = true;
  for (var k in obj) {
       // 因为并不是所有属性都带px单位,所以这里进行判断分别设置 
   if (k == &#39;opacity&#39;) {
    var currentDistance = getStyle(tag, k) * 100,
     target = obj[k] * 100,
     step = (target - currentDistance) / 10;
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    currentDistance += step;
    tag.style[k] = currentDistance / 100;
   } else if (k == &#39;zIndex&#39;) {
    tag.style[k] = obj[k];
   else {
    var currentDistance = parseInt(getStyle(tag, k)) || 0,
     target = obj[k],
     step = (target - currentDistance) / 10;
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    currentDistance += step;
    tag.style[k] = currentDistance + &#39;px&#39;;
   }
   if (target != currentDistance) {
    flag = false // 只要还有属性没有运动完成,就不会清楚定时器
   }
  }
  if (flag) {
   clearInterval(tag.timer)
   fn && fn();// 所有定时器走完,这里执行回调函数,短路操作避免不传回调函数也不会报错。
  }
 }, 17)
}
// 获取样式的兼容函数,上面的缓动函数的依赖
function getStyle(tag, attr) {
 if (tag.currentStyle) {
  return tag.currentStyle[attr];
 } else {
  return getComputedStyle(tag, null)[attr];
 }
}

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.

Pour plus d'articles liés à l'encapsulation des fonctions d'assouplissement dans les diagrammes carrousel JS, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn