Как сделать плавную прокрутку сайта как в примере?

подскажите пожалуйста как можно сделать такую плавную прокрутку? https://www.carineroitfeld.com/en


Ответы (2 шт):

Автор решения: MaximLensky

Я уже показывал этот эффект здесь, покажу ещё раз - на дыры в svg не обращайте внимания так как вам же плавный скролл нужен

В самом низу подписал я что отвечает за плавный scroll

Выполнено на jQuery

(function($) {
  jQuery.scrollSpeed = function(step, speed, easing) {
    var $document = $(document),
      $window = $(window),
      $body = $('html, body'),
      option = easing || 'default',
      root = 0,
      scroll = false,
      scrollY,
      view;

    if (window.navigator.msPointerEnabled) return false;

    $window.on('mousewheel DOMMouseScroll', function(e) {
      if ($('.js-aDialogOpened').length == 0) {
        var deltaY = e.originalEvent.wheelDeltaY,
          detail = e.originalEvent.detail;
        scrollY = $document.height() > $window.height();
        scroll = true;

        if (scrollY) {
          view = $window.height();
          if (deltaY < 0 || detail > 0)
            root = (root + view) >= $document.height() ? root : root += step;
          if (deltaY > 0 || detail < 0)
            root = root <= 0 ? 0 : root -= step;
          $body.stop().animate({
            scrollTop: root
          }, speed, option, function() {
            scroll = false;
          });
        }

        return false;
      }

    }).on('scroll', function() {
      if (scrollY && !scroll) root = $window.scrollTop();
    }).on('resize', function() {
      if (scrollY && !scroll) view = $window.height();
    });
  };

  jQuery.easing.default = function(x, t, b, c, d) {
    return -c * ((t = t / d - 1) * t * t * t - 1) + b;
  };

})(jQuery);

$.scrollSpeed(100, 20000); // cкорость прокрутки
html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}

body {
  background: url(https://avatars.mds.yandex.net/get-pdb/1386879/03fb902f-440e-40ac-ac1b-967d07d274c3/s1200);
  background-size: cover;
  background-attachment: fixed;
}

.pattern {
  width: 100%;
  height: 500px;
}

.heading {
  font-size: 30px;
  text-transform: uppercase;
  font-family: sans-serif;
  fill: #999;
}

.title {
  font-size: 16px;
}

.btn {
  font-family: sans-serif;
  font-size: 24px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>


<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<svg viewBox="0 0 1000 500" preserveAspectRatio='none'>
 <defs>
   <mask id="mask">
    <path d="M0,600 1000,600 1000,0 0,0
             M150,50 250,100 250,200 150,250 50,200 50,100
             M300, 200 400,250 400,350 300,400 200,350 200,250" fill="#fff"/>
   </mask>
  </defs>
  <image xlink:href="https://www.publicdomainpictures.net/pictures/40000/velka/tiny-white-dots-on-yellow.jpg" 
         x="0" y="0" 
         preserveAspectRatio="none"
         mask="url(#mask)"/>
  <g>
   <text x="450" y="60" class="heading"> secundary heading</text>
   <text class="title">
    <tspan x="380" y="90">Lorem ipsum, dolor sit amet consecteturadipisicing elit. Incidunt adipisci </tspan>        
    <tspan x="380" y="110">recusandae ea nesciunt ratione Laboriosam numquam, deserunt,quisquam<tspan>
    <tspan x="480" y="130">commodi consequatur fuga minima provident</tspan>    
  </text>
   
      <a target="_blank" xlink:href="http://yandex.kz">
       <text x="530" y="197" class="btn">learn more</text>
       <path d="M500,150 700,150 700,225 450,225 450,190z" fill="transparent" stroke=" #999" stroke-width="2"/>
      </a>
      <a target="_blank" xlink:href="http://google.kz">
        <text x="500" y="322" class="btn">request invite</text>
      <path d="M450,275 700,275 700,325 650,350 450,350z" fill="transparent" stroke=" #999" stroke-width="2"/>
      </a>

  </g>
</svg>


<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

→ Ссылка
Автор решения: MaximLensky

Тоже самое на нативном javascript, не добавлял контент но для эмитации высоты задал для body высоту ....

var animating = false;
var timeoutID;

function onWheel(event) {
  event = event || window.event;
  var pos = event.deltaY || event.detail || event.wheelDelta;
  console.log(pos);
  if (animating) {
    finalPos = finalPos + pos;
    event.preventDefault();
    return false;
  }
  if (pos > 0 || pos < 0) {
    if (!animating) {
      animating = true;
      finalPos = pos;
      event.preventDefault();
      clearTimeout(timeoutID);
      timeoutID = setTimeout(function() {
        console.log('scroll to ' + finalPos);
        window.scrollTo(window.scrollX, window.scrollY + finalPos);
        setTimeout(function() {
          animating = false;
        });
      });
    }
  }
}

if (window.addEventListener) {
  if ('onwheel' in document) {
    window.addEventListener("wheel", onWheel, {
      passive: false,
      capture: true
    });
  } else if ('onmousewheel' in document) {
    window.addEventListener("mousewheel", onWheel);
  } else {
    window.addEventListener("MozMousePixelScroll", onWheel);
  }
} else {
  window.attachEvent("onmousewheel", onWheel);
}
html,
body {
  height: 3000px;
}

→ Ссылка