javascript Yandex的-示例-Perfectoin.js

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript Yandex的-示例-Perfectoin.js相关的知识,希望对你有一定的参考价值。

{

  // РАНДОМНОЕ ЗНАЧЕНИ от min до max
  const getRandomFloat = (min, max) => {  return Math.random() * (max - min) + min };


  // ФИГУРА КОНЕЧНОЙ ТРАНСФОРМАЦИИ
  const pointsBig = "M500.82 226.5C497.504 61.805 384.828-1.664 228.2.984 71.57 3.633-11.899 91.934 2.417 236.804 16.734 381.675 120.839 483 262.503 483c141.659 0 241.634-91.805 238.317-256.5z";


  // ЛЕКСИЧЕСКОЕ ОКРУЖЕНИЕ
  const DOM = {};
        DOM.scene = document.querySelector('.bubble_bg');
        DOM.gElems = Array.from(document.querySelectorAll('.bubble_bg'));


  // РОДИТЕЛЬСКИЙ БЛОКГДЕ ЛЕТЕАЮТ ШАРИКИ
  var parentBubble = ".promo__content";
  
  // Promise экземпляр
  var promise;

  // ОБЪЕКТ НАЧАЛЬНЫХ ТОЧЕК (формируется при загрузке скрипта) id: path.attr('d')
  var objSvgPath = {};
      $('.small-bubble').each( function (i, el) {
                                                                   // запрет на изминение свойств объекта в котором хранятся значения path.attr(p)
          Object.defineProperty(objSvgPath, el.id, {               // ообъект, свойство, параметры свойства
              value: $(el).find('.small-bublle-path').attr('d'), 
              writable: false,                                     // запретить присвоение 
              configurable: false                                  // запретить удаление 
          });
  });                                                              // return objSvgPath.['small-bubble-`index`'] = "M500.82 226.5C497.504..."


  if ( !msieversion() ) {

    $('.random__bubble').children('div').children('div').css('transition', '0.3s all');
  }

      

  // ОТРКЫВАЕМ ШАРИК НА АКТИВНОМ СЛАЙДЕ

  function slideChangeBubbleOpen () {
    let r = $('.random__bubble').eq(mySwiper.activeIndex),           // random__bubble  который открыт на данный момент
        el = r.find('.small-bubble-open');
    el.trigger('click');                   // включаем срабатываение клика и шарик увеличивается
    DOM[el[0].id].move(true);
  }



  // ДОБАВЛЯЕМ ССЫЛКУ В ОБОЛОЧКУ bubble

  function addLinkBubble (el, trigger) {
    let a = el.closest('a'),
        href = a.attr('data-href');
    if (!trigger) {
      a.attr('href', href);
    } else {
      a.attr('href', '#');
    }
  }



  // ПОЗИЦИОНИРОВАНИЕ ШАРИКА

  function setFixedPositionBubble ( elem ) {
    let el = elem.parent().parent();
    let venue = $('.bubble_venue').offset();
    let top = venue.top - el.offset().top,  
        left = venue.left - el.offset().left;

    if (!msieversion() ) {

      el.css('transform', '');
      el.css({  'transform': `translate( ${left}px, ${top}px ) `  });

    } else {

      // el.css({'left': '', 'top': ''});
      el.css({  'left': `${left}px`, 'top': `${top}px`  });

    }

  }


  // УВЕЛИЧЕНИЕ УМЕНЬШЕНИЕ ШАРИКОВ
  function snapMorph (el) {

    var svg = el[0],                                              
        s = Snap(svg),       
        small = s.select('.small-bublle-path'),   
        mask1 = s.select('.small-bublle-mask1'),
        mask2 = s.select('.small-bublle-mask2'),
        pointsSmall = objSvgPath[el.attr('id')],                  
        isThisBubbleClass = el.hasClass('small-bubble-active'),
        duration = 300;
        
    // Ф-ия ТРАНСФОРМАЦИИ     
    var  morph = function (points) {                            
          small.animate({ d: points,}, duration, mina.bounce);                              
          mask1.animate({ d: points,}, duration, mina.bounce);
          mask2.animate({ d: points,}, duration, mina.bounce);
        };  

      if ( !isThisBubbleClass ) {

        if ( !msieversion() ) {

            promise = function () {
              return new Promise ( (resolve, reject) =>{

                setFixedPositionBubble ( $(el) );
                setTimeout(() => {   resolve();   }, 300); // 300ms это время transform transition css SVG
              });
            } 
            promise().then ( ()=> { 
                        morph(pointsBig); 
                        })
                      .then ( ()=> { 
                        animeInBounce(el);                                       
                        $(el).addClass('small-bubble-active');  })
                      .then ( ()=> {
                        addLinkBubble (el, isThisBubbleClass); })
                      .catch ( (error)=> { console.error(error) })

        } else {      
          console.log('IE Открылся');

        //////////////
        setFixedPositionBubble ( $(el) );
        setTimeout(() => {
          addLinkBubble (el, isThisBubbleClass);
        }, 100);
        morph(pointsBig);                                                                
        el.addClass('small-bubble-active');                                                 
        animeInBounce(el);                                                                 
         

        ////////////////

        }


      } else {

        if ( !msieversion() ) {
          
                  promise = function () {
                    return new Promise ( (resolve, reject) =>{
          
                      $(el).removeClass('small-bubble-active');
                      morph(pointsSmall); 
          
                      setTimeout(() => {   resolve();   }, 300);
                    });
                  } 
                  promise().then ( ()=> { 
                              $(el).parent().parent().css('transform', ''); })
                            .then ( ()=> {
                              addLinkBubble (el, isThisBubbleClass); })
                            .catch ( (error)=> { console.error(error) });

        } else {

          
          //////////
          
          //console.log('IE Закрылся');
          setFixedPositionBubble ( $(el) );
          addLinkBubble (el, isThisBubbleClass); 

          el.removeClass('small-bubble-active'); 
          morph(pointsSmall);
          $(el).closest('.bubble_bg').css({'left': '', 'top': ''});

          //////////

        }

      } 
  } // end_func



  // АНИМАЦИЯ ВНУТРИ ШАРИКОВ ПРИ ЕГО УВЕЛИЧЕНИИ
  function animeInBounce (el) {

    var title = $(el).find('.bubble__title'),
        desc  = $(el).find('.bubble__text');

        TweenMax.from(title, 1, { 
          x: 150,
          y: 60
        });
        TweenMax.from(desc, 1.3, { 
          x: 170,
          y: 70
        });
  };



  // FROM https://davidwalsh.name/javascript-debounce-function.
  const debounce = (func, wait, immediate) => { 
    let timeout;
      return function () {
        let context = this;
        var args = arguments;
        let later = () => {
          timeout = null;
          if (!immediate) func.apply(context, args);
        };
        let callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
  };



  class Bacteria {

      constructor(el) {
        
          this.DOM = {};
          this.DOM.el = el;
          this.CONFIG = {
            motionIncrement: [300, 600]
          };
          this.init();
          this.initEvents();
      }

      init() {
        this.getSizes();
        this.transform = { tx: 0, ty: 0, rz: 0, sx: 0, sy: 0 };         // Current values for the transform.
        this.step = 0;                                                  // Current step.
        // this.DOM.el.style.transformOrigin = '50% 50%';                  // Set Origin.
        this.move();                                                    // Start the transforms animation.
      }
      
      initEvents() {
        window.addEventListener('resize', debounce(() => this.getSizes(), 10));
      }

      getSizes() {
        this.domrect = {
          scene: document.querySelector(parentBubble).getBoundingClientRect(),
          el: this.DOM.el.getBoundingClientRect()
        };
      }

      getTransform(prop) {

        let val;
        if (prop === 'rz') {
          val = anime.random(-30, 30);
        }
        else if (prop === 'sx' || prop === 'sy') {
          val = getRandomFloat(0.8, 1.2);
        }
        else {

          const inc = anime.random(this.CONFIG.motionIncrement[0], this.CONFIG.motionIncrement[1]) * (anime.random(0, 1) ? -1 : 1);
          const vSize = prop === 'tx' ? 'width' : 'height';
          const position = prop === 'tx' ? 'left' : 'top';

          val = this.transform[prop] + inc;
          // Out of viewport.
          if (val > 0 && val > this.domrect.scene[vSize] - this.domrect.el[position] || val < 0 && Math.abs(val) > this.domrect.el[position] + this.domrect.el[vSize]) {
            val -= 2 * inc;
          }
        }

        return val;
      }

      move(stop = false) {

        this.step++;
        this.transform.tx = this.getTransform('tx');
        this.transform.ty = this.getTransform('ty');
        this.transform.rz = this.getTransform('rz');

        let delay = anime.random(0, 1) ? 0 : anime.random(0, 1000);
        var duration = 30000;
        const easing = 'linear';
        anime.remove(this.DOM.el);
     

        if (msieversion()) { // Если IE

            var animbubbleRandom = anime({
                targets: this.DOM.el,
                duration: duration,
                easing: easing,
                delay: delay,
                translateX: this.transform.tx,
                translateY: this.transform.ty,
                //rotate: this.transform.rz,
                complete: () => {
                  
                  // console.log(123)
                  this.move()}
            })
          } else {
            var animbubbleRandom = anime({
                targets: this.DOM.el,
                duration: duration,
                easing: easing,
                delay: delay,
                left: this.transform.tx,
                top: this.transform.ty,
                // rotate: this.transform.rz,
                complete: () => this.move()
            })
        } // end_if
        if (stop) {
          animbubbleRandom.pause();
          return
        }
      }
  }; // end_class





/*
 *  *************************************    ИНИЦИАЛИЗАЦИЯ   **********************
 * 
 *  на мобильных не показывать
 * */

  if ((DOM.scene != null) && ( document.body.clientWidth >= 980 ) ) {
    DOM.gElems.forEach( (gElem) => {

      try {
        let id = gElem.querySelector('svg').id;
        DOM[id] = new Bacteria(gElem); // экземпляры класса будут в этом объекте 
      } catch (e) {
        new Bacteria(gElem);
        console.log("У random bubbl[ов] нет id и проверьте есть ли контент");
      }
      
    }
  )}



/*
 * *************************************    МАНИПУЛЯЦИЯ    **********************
 * 
 *  УСЕНЬШАЕМ  АКТИВНЫЙ ШАРИК И ПРОДОЛЖАЕМ ДВИЖЕНИЕ  /  УВЕЛИЧИВАЕМ ШАРИК НА КОТОРЫЙ КЛИКНУЛИ 
 * */

  $('.small-bubble').off('click').on('click', function() {

      if ($(this).closest('a').attr('href') !== "#") {
        window.location.href = $(this).closest(a).attr('href');
      };
      

      DOM[$(this)[0].id].move(true); // останавливаем движение например DOM['small-bubble-1'].move(true)

      if ( $('.small-bubble-active').length ) {
        
        // уменьшаем
        DOM[$('.small-bubble-active')[0].id].init(); // продолжить движение шарика 
        snapMorph ( $('.small-bubble-active') );  
      } 
    
      // увеличиваем
      snapMorph ( $(this) ); 
      // $(this).closest('.bubble_bg').removeClass('bubble_bg');
  }); 





  // ПРИ ЗАГРУЗКЕ ПОЯВЛЯЕТСЯ ПЕРВЫЙ ШАРИК
  $(document).ready(function () {
    
    slideChangeBubbleOpen();
  });


  // СОБЫТИЯ ПЕРЕКЛЮЧЕНИЯ СЛАЙДЕРА (открываем шарики отмеченные)
  mySwiper.on('slideChange', function() { 
    /**
     * Без обещания не будет корректно отрабатывать анимация
     */
  

    if ( !msieversion() ) {
        let promise = () => {
          return new Promise ( (resolve, reject)=>{
            // Когда закончится переключение swiper
            mySwiper.on('transitionEnd', function() { 
              resolve();
            });
          });
        }
        promise().then ( ()=> { 
          slideChangeBubbleOpen();
        });
    } else {
      // Когда закончится переключение swiper
      mySwiper.off('transitionEnd').on('transitionEnd', function() { 
        slideChangeBubbleOpen();
      });
    }


  }); 










function svgMultilineTextIe () {
  var $set = $('text.data-bubble-set'); 

  $set.css('opacity', '0'); // Убираем из виду длинный текст с сервеар
  let countChar = 30;

}



$(document).ready(function () {
  svgMultilineTextIe () ;
});



// ЕСЛИ IE

if ( msieversion() ) {

  console.log('hello');
  $('foreignObject.bubble__description').hide(); 

} else {
  
  $('text.data-bubble-get').hide();
}







} // end global Object

以上是关于javascript Yandex的-示例-Perfectoin.js的主要内容,如果未能解决你的问题,请参考以下文章

javascript Yandex的-metrica-404.js

javascript 与yandex metrika的turbolinks的反击

javascript yandex_metrica.js

javascript Yandex.Maps路由与geo

javascript Yandex映射Api

yandex 图片自动下载