Kann mir wer helfen, den Code zu erklären

Neurotrin

Neues Mitglied
Javascript:
(function($) {
 var $fortune = function(args) {
  if (args === undefined) {
   throw new Error("You must define the options.prices")
  }
  var options = $.extend({}, {
   prices: args,
   duration: 1e3,
   separation: 2,
   min_spins: 10,
   max_spins: 15,
   onSpinBounce: function() {}
  }, args);
  var fortune = this;
  var prices_amount = Array.isArray(options.prices) ? options.prices.length : options.prices;
  var prices_delta = 360 / prices_amount;
  var is_spinning = false;
  fortune.spin = function(price) {
   price = typeof price === "number" ? price : Math.floor(Math.random() * prices_amount);
   var deferred = $.Deferred();
   var position = Math.floor(prices_delta * (price - 1 / 2) + randomBetween(options.separation, prices_delta - options.separation));
   var spins = randomBetween(options.min_spins, options.max_spins);
   var final_position = 360 * spins + position;
   var prev_position = 0;
   var is_bouncing = false;
   is_spinning = true;
   fortune.css({
    transform: "rotate(" + final_position + "deg)",
    "-webkit-transform": "rotate(" + final_position + "deg)",
    transition: "transform " + options.duration + "ms cubic-bezier(.17,.67,.12,.99)",
    "-webkit-transition": "-webkit-transform " + options.duration + "ms cubic-bezier(.17,.67,.12,.99)"
   }).siblings(".spin").removeClass("bounce");
   var bounceSpin = function() {
    var curPosition = Math.floor(getRotationDegrees(fortune)),
     mod = Math.floor((curPosition + prices_delta * .5) % prices_delta),
     diff_position, position_threshold = prices_delta / 5,
     distance_threshold = prices_delta / 10;
    prev_position = Math.floor(curPosition < prev_position ? prev_position - 360 : prev_position);
    diff_position = curPosition - prev_position;
    if (mod < position_threshold && diff_position < distance_threshold || mod < position_threshold * 3 && diff_position >= distance_threshold) {
     if (!is_bouncing) {
      fortune.siblings(".spin").addClass("bounce");
      options.onSpinBounce(fortune.siblings(".spin"));
      is_bouncing = true
     }
    } else {
     fortune.siblings(".spin").removeClass("bounce");
     is_bouncing = false
    }
    if (is_spinning) {
     prev_position = curPosition;
     requestAnimationFrame(bounceSpin)
    }
   };
   var animSpin = requestAnimationFrame(bounceSpin);
   setTimeout(function() {
    fortune.css({
     transform: "rotate(" + position + "deg)",
     "-webkit-transform": "rotate(" + position + "deg)",
     transition: "",
     "-webkit-transition": ""
    }).siblings(".spin").removeClass("bounce");
    cancelAnimationFrame(animSpin);
    deferred.resolve(Array.isArray(options.prices) ? options.prices[price] : price);
    is_spinning = false
   }, options.duration);
   return deferred.promise()
  };
  var getRotationDegrees = function(obj) {
   var angle = 0,
    matrix = obj.css("-webkit-transform") || obj.css("-moz-transform") || obj.css("-ms-transform") || obj.css("-o-transform") || obj.css("transform");
   if (matrix !== "none") {
    var values = matrix.split("(")[1].split(")")[0].split(","),
     a = values[0],
     b = values[1],
     radians = Math.atan2(b, a);
    if (radians < 0) {
     radians += 2 * Math.PI
    }
    angle = Math.round(radians * (180 / Math.PI))
   }
   return angle
  };
  var randomBetween = function(min, max) {
   return Math.floor(Math.random() * (max - min + 1)) + min
  };
  return fortune
 };
 $.extend($.fn, {
  fortune: $fortune
 })
})(jQuery);
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben