<div class="scene">
  <div class="content">
    <div class="back">
      <div class="back__bg back__bg-1 active"></div>
      <div class="back__bg back__bg-2"></div>
      <div class="back__bg back__bg-3"></div>
      <div class="back__bg back__bg-4"></div>
    </div>
    <div class="front">
      <div class="front__bg front__bg-1 active"></div>
      <div class="front__bg front__bg-2"></div>
      <div class="front__bg front__bg-3"></div>
      <div class="front__bg front__bg-4"></div>
    </div>
    <div class="nav">
      <div data-page="1" class="nav__el nav__el-1">
        Why i'm not here?
        <div class="nav__el-clone">
          <div class="nav__el nav__el-1">Why i'm not here?</div>
        </div>
      </div>
      <div data-page="2" class="nav__el nav__el-2">
        Where am i?
        <div class="nav__el-clone">
          <div class="nav__el nav__el-2">Where am i?</div>
        </div>
      </div>
      <div data-page="3" class="nav__el nav__el-3">
        This place is cool
        <div class="nav__el-clone">
          <div class="nav__el nav__el-3">This place is cool</div>
        </div>
      </div>
      <div data-page="4" class="nav__el nav__el-4">
        Cold and beautiful
        <div class="nav__el-clone">
          <div class="nav__el nav__el-4">Cold and beautiful</div>
        </div>
      </div>
    </div>
  </div>
  <div class="menu">
    <div class="menu__btn">
      <div class="menu__btn-inner">
        <span class="menu__btn-line"></span>
        <span class="menu__btn-line"></span>
        <span class="menu__btn-line"></span>
      </div>
    </div>
    <div class="menu__block">
      <div class="menu__block-bg"></div>
      <svg class="menu__block-svg">
        <path class="menu__block-svgPath" />
      </svg>
    </div>
    <h1 class="menu__heading">Something</h1>
  </div>
</div>

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"></script>
//Скрипт js надо подключать здесь
//Автор: Nikolay Talanov. @suez
*, *:before, *:after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html, body {
  font-size: 62.5%;
  height: 100%;
  overflow: hidden;
}

.instant {
  transition: 0 0 !important;
}

.scene {
  position: relative;
  height: 100%;
  background: #fff;
  transition: transform 0.5s;
  will-change: transform;
}
.scene.menu-visible .menu__btn {
  background: #000;
  color: #000;
}
.scene.menu-visible .menu__btn:after {
  transform: scale(1.5) !important;
}
.scene.menu-visible .menu__heading {
  opacity: 1;
  transition: opacity 0.5s 1.7s;
}

.content {
  position: relative;
  height: 100%;
  transition: transform 0.6s, opacity 0.4s 0.1s;
  will-change: transform, opacity;
}
.content.inactive {
  opacity: 0;
  transform: scale(0.9);
}

.back,
.front {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transition: transform 0.5s 0.5s;
  will-change: transform;
}
.back__bg,
.front__bg {
  position: absolute;
  left: 0;
  width: 100%;
  height: 100%;
  background-size: cover;
  transition: transform 0.5s;
  will-change: transform;
}
.back__bg-1,
.front__bg-1 {
  background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/sls-1.jpg);
}
.back__bg-2,
.front__bg-2 {
  background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/sls-2.jpg);
}
.back__bg-3,
.front__bg-3 {
  background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/sls-3.jpg);
}
.back__bg-4,
.front__bg-4 {
  background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/142996/sls-4.jpg);
}

.back__bg.hidden {
  display: none;
}
.back__bg:after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5);
}
.back__bg-1 {
  top: 0%;
}
.back__bg-2 {
  top: 100%;
}
.back__bg-3 {
  top: 200%;
}
.back__bg-4 {
  top: 300%;
}

.front__bg {
  transform: scale(0.8);
}
.front__bg.active {
  transform: scale(1);
}
.front__bg:after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.25);
}
.front__bg-0 {
  top: 100%;
}
.front__bg-1 {
  top: 0%;
}
.front__bg-2 {
  top: -100%;
}
.front__bg-3 {
  top: -200%;
}
.front__bg-4 {
  top: -300%;
}

.nav {
  position: absolute;
  left: 0;
  bottom: 20%;
  width: 100%;
  text-align: center;
}
.nav__el {
  display: inline-block;
  position: relative;
  font-size: 2.5rem;
  height: 3.5rem;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.5);
  font-family: "Open Sans", Helvetica, Arial, sans-serif;
  margin: 1rem 2rem;
  padding-left: 1.5rem;
  cursor: pointer;
  overflow: hidden;
}
.nav__el-clone {
  position: absolute;
  top: 0;
  left: 0;
  overflow: hidden;
  transition: transform 0.5s;
  will-change: transform;
  transform: translateX(-100%);
}
.nav__el-clone > div {
  margin: 0;
  color: #fff;
  transition: transform 0.5s;
  will-change: transform;
  transform: translateX(100%);
}
.nav__el.active:after {
  transform: scale(1);
}
.nav__el.active .nav__el-clone {
  transform: scale(1);
  transition: transform 6s 2s;
}
.nav__el.active .nav__el-clone .nav__el {
  transform: scale(1);
  transition: transform 6s 2s;
}
.nav__el:before {
  position: absolute;
  top: 50%;
  margin-top: -1rem;
  left: -0.3rem;
  font-size: 1.5rem;
  transform: rotate(-90deg);
}
.nav__el:after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 1px;
  background: #fff;
  transition: transform 1.5s;
  transform: scale(0);
}
.nav__el-1:before {
  content: "01";
}
.nav__el-2:before {
  content: "02";
}
.nav__el-3:before {
  content: "03";
}
.nav__el-4:before {
  content: "04";
}

.menu__btn {
  z-index: 5;
  position: absolute;
  top: 5%;
  right: 5%;
  width: 5.2rem;
  height: 5.2rem;
  border: 2px solid;
  color: #fff;
  overflow: hidden;
  cursor: pointer;
  transition: background-color 0.5s;
}
.menu__btn:hover:after {
  transform: scale(1);
}
.menu__btn:hover .menu__btn-line:nth-child(1) {
  -webkit-animation: animateMenuBtn 0.7s 0s;
          animation: animateMenuBtn 0.7s 0s;
}
.menu__btn:hover .menu__btn-line:nth-child(2) {
  -webkit-animation: animateMenuBtn 0.7s 0.2s;
          animation: animateMenuBtn 0.7s 0.2s;
}
.menu__btn:hover .menu__btn-line:nth-child(3) {
  -webkit-animation: animateMenuBtn 0.7s 0.4s;
          animation: animateMenuBtn 0.7s 0.4s;
}
.menu__btn:after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border: 0.5rem solid #fff;
  transition: transform 0.6s;
  will-change: transform;
  transform: scale(1.5);
}
.menu__btn-inner {
  position: absolute;
  top: 1.6rem;
  left: 1.2rem;
  width: 2.4rem;
  height: 1.6rem;
  overflow: hidden;
}
.menu__btn-line {
  position: absolute;
  left: 0;
  width: 100%;
  height: 2px;
  background: #fff;
}
.menu__btn-line:nth-child(1) {
  top: 0;
}
.menu__btn-line:nth-child(2) {
  top: 0.7rem;
}
.menu__btn-line:nth-child(3) {
  top: 1.4rem;
}
.menu__block {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: none;
  text-align: center;
}
.menu__block.visible {
  display: block;
}
$(document).ready(function() {
  
  var $scene = $(".scene"),
      $content = $(".content"),
      $back = $(".back"),
      $backBgs = $(".back__bg"),
      $front = $(".front"),
      $frontBgs = $(".front__bg"),
      $menuBlock = $(".menu__block"),
      $svgPath = $(".menu__block-svgPath"),
      animating = false,
      menuActive = false,
      menuAnimTime = 600,
      blockAnimTime = 1500,
      $sliderCont = $(".menu-slider__content"),
      curSlide = 1,
      sliderXDiff = 0,
      curPage = 1,
      nextPage = 0,
      numOfPages = $(".front__bg").length,
      scaleTime = 500,
      transTime = 500,
      totalTime = scaleTime + transTime,
      changeTimeout,
      timeoutTime = 8000,
      winW = $(window).width(),
      winH = $(window).height();
  
  // init nav element timeout animation
  $(".nav__el-1").addClass("active");
  
  //default debounce function from David Walsh blog
  function debounce(func, wait, immediate) {
    var timeout;
    return function() {
      var context = this, args = arguments;
      var later = function() {
        timeout = null;
        if (!immediate) func.apply(context, args);
      };
      var callNow = immediate && !timeout;
      clearTimeout(timeout);
      timeout = setTimeout(later, wait);
      if (callNow) func.apply(context, args);
    };
  };
  
  function changePages() {
    $(".back__bg, .front__bg, .nav__el").removeClass("active");
    $(".nav__el-"+curPage).addClass("active");
    $back.css("transform", "translate3d(0,"+(curPage-1)*-100+"%,0)");
    $front.css("transform", "translate3d(0,"+(curPage-1)*100+"%,0)");
    createTimeout();

    setTimeout(function() {
      $(".back__bg-"+curPage+", .front__bg-"+curPage).addClass("active");
    }, totalTime);
  };
  
  $(document).on("click", ".nav__el:not(.active)", function() {
    curPage = $(this).attr("data-page");
    changePages();
  });
  
  // ugly hack for animation reset when you coming back from menu section
  function resetTimeoutAnimation() {
    var $activeNavEl = $(".nav__el.active"),
        $activeParts = $activeNavEl.find(".nav__el-clone, .nav__el")
    $activeParts.addClass("instant");
    $activeNavEl.removeClass("active");
    $activeParts.css("top");
    $activeParts.removeClass("instant");
    $activeParts.css("top");
    $activeNavEl.addClass("active");
  }
  
  /* creates timeOut for change of slides.
  Call's itself from inside of changePages() function
  */
  function createTimeout() {
    window.clearTimeout(changeTimeout);
    resetTimeoutAnimation();
    changeTimeout = setTimeout(function() {
      if (curPage >= numOfPages) {
        curPage = 1;
      } else {
        curPage++;
      }
      changePages();
    }, timeoutTime);
  };
  
  createTimeout();
  
  /* creates path D attribute strings for animation
  initial d = fullScreen
  mid d = Q curves with 5% padding
  final d = centered 90% width/height block
  */
  function createD(type) {
    var types = {"init": ["M0,0",
                          "Q"+winW/2+",0",
                          winW+",0",
                          "Q"+winW+","+winH/2,
                          winW+","+winH,
                          "Q"+winW/2+","+winH,
                          "0,"+winH,
                          "Q0,"+winH/2,
                          "0,0"],
                 "mid": ["M0,0",
                         "Q"+winW/2+","+winH*0.05,
                         winW+",0",
                         "Q"+winW*0.95+","+winH/2,
                         winW+","+winH,
                         "Q"+winW/2+","+winH*0.95,
                         "0,"+winH,
                         "Q"+winW*0.05+","+winH/2,
                         "0,0"],
                 "final": ["M"+winW*0.05+","+winH*0.05,
                           "Q"+winW/2+","+winH*0.05,
                           winW*0.95+","+winH*0.05,
                           "Q"+winW*0.95+","+winH/2,
                           winW*0.95+","+winH*0.95,
                           "Q"+winW/2+","+winH*0.95,
                           winW*0.05+","+winH*0.95,
                           "Q"+winW*0.05+","+winH/2,
                           winW*0.05+","+winH*0.05]};
    return types[type].join(" ");
  }
  
  // animates path d with SnapSVG
  function animateBlock(reverse) {
    winW = $(window).width();
    winH = $(window).height();
    var initD = createD("init"),
        midD = createD("mid"),
        finalD = createD("final");
    
    if (!reverse) {
      $svgPath.attr("d", initD);
      Snap($svgPath[0]).animate({"path": midD}, blockAnimTime/2, mina.elastic, function() {
        Snap($svgPath[0]).animate({"path": finalD}, blockAnimTime/2, mina.elastic);
      });
    } else {
      Snap($svgPath[0]).animate({"path": midD}, blockAnimTime/2, mina.elastic, function() {
        Snap($svgPath[0]).animate({"path": initD}, blockAnimTime/2, mina.elastic);
      });
    }
    
  };
  
  // resizes opened menu path d block, because i can't change viewBox with js
  var resizeSvg = debounce(function() {
    winW = $(window).width();
    winH = $(window).height();
    $svgPath.attr("d", createD("final"));
  }, 50);
  
  // default madness
  $(document).on("click", ".menu__btn", function() {
    if (animating) return;
    animating = true;
    setTimeout(function() {
      animating = false;
    }, blockAnimTime + menuAnimTime);
    
    if (!menuActive) {
      menuActive = true;
      window.clearTimeout(changeTimeout);
      $content.addClass("inactive");
      $scene.addClass("menu-visible");
      $(".back__bg:not(.active)").addClass("hidden");
      $(window).on("resize", resizeSvg);
      setTimeout(function() {
        $menuBlock.addClass("visible");
        animateBlock();
      }, menuAnimTime);
    } else {
      menuActive = false;
      animateBlock(true);
      setTimeout(function() {
        $menuBlock.removeClass("visible");
        createTimeout();
        $(".back__bg").removeClass("hidden");
        $content.removeClass("inactive");
        $scene.removeClass("menu-visible");
      }, blockAnimTime);
      $(window).off("resize");
    }
  });
  
});