Нужно объяснить маленькую часть кода

181
07 июля 2018, 07:50

Есть спрайтовая анимация

(function(x, y, el, t) { 
  setInterval(function() {; 
    (y > 1) ? (y = 0, (x = (x > 1) ? 0 : x + 1)) : (y += 1); 
    el.style.backgroundPosition = "-" + x + "00% -" + y + "00%"; 
  }, 100); 
})( 
  0, 
  0, 
  document.getElementById("cat"), 
);
#cat { 
  width: 112px; 
  height: 156px; 
  background-image: url(https://inter-net.pro/images/css/sprite-marsch.png); 
  background-position: 0% 0%; 
}
<div id="cat"></div>

Кто может помочь объяснить javascript код? И желательно упростить код.

Answer 1

Рассмотрим все по порядку

Здесь объявляется само вызывающаяся лямбда

(function(x,y,el,t) { 

Тоже лямбда вызывающаяся с определенным интервалом

setInterval(function() {

Тут тернарный оператор

;(y>1)?(y=0,(x=(x>1)?0:x+1)):(y+=1);

на простой if можно перевести как

if ( y > 1 ) 
{
   y = 0;
   if (x > 1)
   {
     x = 0
   }
   else 
   {
     x += 1;
   }
} 
else
{
  y += 1;
}

Тут я думаю объяснять не нужно, идет присвоение стилей.

el.style.backgroundPosition = "-"+x+"00% -"+y+"00%";

Тоже не должно быть вопросов, задается интервал в 100мс.

}, 100);

Закрывается лямбда, и само-вызывается, в нее передаются аргументы x = 0, y = 0, el = document.getElementById("cat")

})(
  0,
  0,
  document.getElementById("cat"),
);
Answer 2
   (function(x,y,el,t) {
      setInterval(function() { // Обычный вызов функции с интервалом указанным вторым параметром
        ;(y>1)?(y=0,(x=(x>1)?0:x+1)):(y+=1); // зачем тут нужна ; не знаю, так обычно делают для модулей, тут она не нужна, все остальное это тернарные операции (короткий вариант if() {} else {} в виде - <условие> ? <значение, если условие выполнилось> : <значение, если условие не выполнилось>")
        el.style.backgroundPosition = "-"+x+"00% -"+y+"00%"; // простое задание стилей
      }, 100); // интервал вызова в миллисекундах
    })(0, 0, document.getElementById("cat")); // Эти аргументы передаются в функцию которая тут же вызывается (IIFE), соответственно x = 0, y = 0, el = document.getElementById("cat")

Упрощенный в моем понимании вариант:

var x = 0; 
var y = 0; 
var el = document.getElementById("cat"); 
var func = function( x, y , el ) { 
  setInterval(function() { 
    if(y > 1) { 
      y = 0; 
 
      if(x > 1) { 
        x = 0 
      } else { 
        x = x + 1; 
      } 
    } else { 
      y = y + 1; 
    } 
 
    var XPercentagePosition = -x * 100 + '%'; 
    var YPercentagePosition = -x * 100 + '%'; 
 
    el.style.backgroundPosition = XPercentagePosition + ' ' + XPercentagePosition; 
  }, 100); 
} 
 
func(x, y, el);
#cat { 
  width:112px; 
  height:156px; 
  background-image:url(https://inter-net.pro/images/css/sprite-marsch.png); 
  background-position:0% 0%; 
}
<div id="cat"></div>

READ ALSO
Каждый h3 тэг с новым размером шрифта

Каждый h3 тэг с новым размером шрифта

Пожалуйста не предлагайте классы или idНужно сделать так, чтобы каждый новый тэг h3 появлялся с новым размером шрифта

160
Есть видео уроки по созданию расширения для devtools?

Есть видео уроки по созданию расширения для devtools?

Есть видео уроки по созданию расширения для devtools?

186
Сборка ng build --prod после команды ng eject

Сборка ng build --prod после команды ng eject

На Angular5 проекте с помощью ng eject был сгенерирован файл webpackconfig

115
Что использовать для написания бота

Что использовать для написания бота

Подскажите что использовать или почитать что бы выполнить задание:

158