HTML sayfasını belirli bir bağlantıya nasıl kaydırırım?


264

Tarayıcının, yalnızca JavaScript'i kullanarak sayfayı belirli bir bağlantıya kaydırmasını sağlamak istiyorum.

HTML kodumda bir nameveya idözellik belirttim :

 <a name="anchorName">..</a>

veya

 <h1 id="anchorName2">..</h1>

Şuraya giderek elde ettiğiniz efekti elde etmek istiyorum http://server.com/path#anchorName. Sayfa, tutturucu sayfanın görünür kısmının üstüne yakın olacak şekilde kaydırılmalıdır.

Yanıtlar:


349
function scrollTo(hash) {
    location.hash = "#" + hash;
}

Hiçbir jQuery gerekli!


91
Bu aslında kaymaz, sadece atlar. Bu noktada, sadece çapa ile bağlantı kurabilirsiniz<a href="#anchorName">link</a>
— Ryan

52
Bunun yalnızca bir kez çalışacağını unutmayın. Karma ayarlandıktan sonra, sahte bir taneye değiştirip tekrar ayarlamadığınız sürece sayfa aynı karmaya kaydırmaz.
— Cristian Vrabie

13
Genel pencere nesnesi tarafından zaten kullanıldığı için scrollTo kullanmamalısınız. Ayrıca location.hash öğesi de tanımlandığından parametrenin hash olarak adlandırılmaması gerekir. Bu kodu kullanabilirsiniz:function scrollToHash(hashName) { location.hash = "#" + hashName; }
— Markus Zeller

3
@MarkusZeller, parametre neden hash olarak adlandırılmasın? Konumla çarpışmıyor, değil mi?
— Gherman

3
"scroll-behavior: smooth;" html elementinde
— istifleyiciler

225

Çok daha basit:

var element_to_scroll_to = document.getElementById('anchorName2');
// Or:
var element_to_scroll_to = document.querySelectorAll('.my-element-class')[0];
// Or:
var element_to_scroll_to = $('.my-element-class')[0];
// Basically `element_to_scroll_to` just have to be a reference
// to any DOM element present on the page
// Then:
element_to_scroll_to.scrollIntoView();

22
İlk önce Mandx'ın trol ettiğini düşündüm, sonra bunu denedim ve işe yaradı. Ötesinde bu yöntemle daha önce hiç karşılaşmadım. Bu yöntem için Mozilla Docs . Ayrıca, tarayıcılarda çok iyi destekleneceği görülüyor.
— Jonathan Dumaine

2
Jquery çözümleri kaydırma değil bir sürü sorun yaşadım. Bu beni çok hayal kırıklığına uğrattı.
— NuclearPeon

1
UYARI! Bu yöntem, üstündeki bir div yüzer öğeler içeriyorsa ve boyutunu kolayca belirleyemiyorsa sorun yaşayabilir.
— vogomatix

5
Bu temiz bir çözümdür, ancak şu anda herhangi bir düzenlemeye izin vermiyor, sert bir kaydırma yapıyor. scrollIntoViewOptionsBir behavior: "smooth"seçeneği olan deneysel bir parametre var , ancak şu anda yalnızca Firefox ile uyumlu.
— rocha

Bunu nasıl canlandırabilirim?
— SkuraZZ

124

JQuerys .animate () , .offset () ve öğelerini kullanabilirsiniz scrollTop. Sevmek

$(document.body).animate({
    'scrollTop':   $('#anchorName2').offset().top
}, 2000);

örnek bağlantı: http://jsbin.com/unasi3/edit

Eğer hareketlendirmek kullanımına istemiyorsanız .scrollTop () gibi

$(document.body).scrollTop($('#anchorName2').offset().top);

veya doğal location.hashgibi javascripts

location.hash = '#' + anchorid;

1
Bir <h1 id="anchorName">veya seçici bulmak için kadar, ilk önce öğeyi arayacak ve yalnızca bir tane bulunamazsa a'ları aramaya başvuracak olan veya biraz optimize edilmiş <a name="anchorName">kullanın . $('#'+hash+',a[name='+hash+']')$(document.getElementById(hash) || 'a[name='+hash+']')
— gnarf

@gnarf - jQuery'deki '#' seçicilerini optimize etmeye gerek yoktur - bunlar sizin için zaten optimize edilmiştir. JQuery kaynak kodunu okuyup okumadığınızı görmek oldukça kolaydır.
— CodeJoust

3
@CodeJoust - jQuery ekibindeyim, birçok kez okudum ve evet $("#selector")optimize edildi, ancak $("#selector,a[name='selector']")aynı optimizasyonları hızlı bir şekilde geçmeyecek. Sanırım 2.5 yaşındaki yorumum biraz garip geliyor. "Optimizasyon", a[name='selector']kimliği bulursa aramayı engeller, kimliği aramayı optimize etmez.
— gnarf

1
Bu yaklaşımla biraz şansım oldu: <a data-hash="about"> Hakkında </a> <script> $ ("[veri karma]"). Tıklayın (function () {var data = $ (this) .attr ("data-hash"); $ (document.body) .animate ({'scrollTop': $ ("#" + veri) .offset (). top}, 500);}); </script>
— Jazzy

32

JAndy tarafından harika bir çözüm, ancak düzgün kaydırma firefox'ta çalışma sorunları yaşıyor gibi görünüyor.

Bu şekilde yazmak Firefox'ta da işe yarar.

(function($) {
    $(document).ready(function() {
         $('html, body').animate({
           'scrollTop':   $('#anchorName2').offset().top
         }, 2000);
    });
})(jQuery);

En son Chrome sürümünde bu, tutarlı bir şekilde çalışan bulduğum tek yöntem. Bahşiş için teşekkürler!
— gaborous

32

2018-2020 Saf js:

Öğeye kaydırmanın çok uygun bir yolu var:

el.scrollIntoView({
  behavior: 'smooth', // smooth scroll
  block: 'start' // the upper border of the element will be aligned at the top of the visible part of the window of the scrollable area.
})

Ama anladığım kadarıyla, aşağıdaki seçenekler gibi iyi bir desteği yok.

resim açıklamasını buraya girin

Yöntem hakkında daha fazla bilgi edinin.


Elemanın üstte olması gerekiyorsa:

const element = document.querySelector('#element')
const topPos = element.getBoundingClientRect().top + window.pageYOffset

window.scrollTo({
  top: topPos, // scroll so that the element is at the top of the view
  behavior: 'smooth' // smooth scroll
})

Codepen'de gösteri örneği


Elemanın merkezde olmasını istiyorsanız:

const element = document.querySelector('#element')
const rect = element.getBoundingClientRect() // get rects(width, height, top, etc)
const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);

window.scroll({
  top: rect.top + rect.height / 2 - viewHeight / 2,
  behavior: 'smooth' // smooth scroll
});

Codepen'de gösteri örneği


Destek:

введите сюда описание изображения

scrollAynı yöntemle yazıyorlar scrollTo, ancak destek daha iyi gösteriyorscrollTo .

Yöntem hakkında daha fazla bilgi


Bu çözüm çok iyi çalışıyor! Paylaşım için teşekkürler!
— gaborous

29

JQuery olmadan saf bir javascript çözümü. Chrome ve Ie'de test edildi, IOS'ta test edilmedi

function ScrollTo(name) {
  ScrollToResolver(document.getElementById(name));
}

function ScrollToResolver(elem) {
  var jump = parseInt(elem.getBoundingClientRect().top * .2);
  document.body.scrollTop += jump;
  document.documentElement.scrollTop += jump;
  if (!elem.lastjump || elem.lastjump > Math.abs(jump)) {
    elem.lastjump = Math.abs(jump);
    setTimeout(function() { ScrollToResolver(elem);}, "100");
  } else {
    elem.lastjump = null;
  }
}

demo: https://jsfiddle.net/jd7q25hg/12/


1
Eski bir konu hakkında yorum yaptığınız için özür dilerim, ancak projem JQuery kullanmadığı için bu benim için en iyisi. Fark ettiğim tek sorun, en üste kaydırırsanız 5 pikseli kaçırdığıdır.
— AntBirch

Saf js sürümünü görmek çok ferahlatıcı. Öğrencilere her zaman kaputun altına bakmayı ve JQuery'nin onlar için ne yaptığını anlamalarını öğretiyorum, bu yüzden bu güzel bir örnek.
— Dave Everitt

2
Bu kabul edilen cevap olmalıdır: saf bir js örneğidir VE istenen kaydırma animasyonu efektini elde eder. Zaman aşımı değerini 20'ye ayarladım ve kusursuz çalışıyor.
— Mark Barrasso

Teşekkür ederim saf javascript çözümlerini seviyorum
— R01010010

2
IOS'ta çalışır, sadece test etti.
— Debbie Kurth

23

2018'de böyle basit bir şey için jQuery'ye ihtiyacınız yok. Yerleşik scrollIntoView()yöntem behavior, sayfadaki herhangi bir öğeye düzgün bir şekilde kaydırmak için " " özelliğini destekler . Yer işareti koymak için tarayıcı URL'sini bir karma ile bile güncelleyebilirsiniz.

Gönderen HTML imleri kaydırma bu öğretici , burada otomatik olarak sayfadaki tüm çapa bağlantıları düzgün kaydırma eklemek için bir yerli yoludur:

let anchorlinks = document.querySelectorAll('a[href^="#"]')
 
for (let item of anchorlinks) { // relitere 
    item.addEventListener('click', (e)=> {
        let hashval = item.getAttribute('href')
        let target = document.querySelector(hashval)
        target.scrollIntoView({
            behavior: 'smooth',
            block: 'start'
        })
        history.pushState(null, null, hashval)
        e.preventDefault()
    })
}

2
JQuery bağımlılığını ortadan kaldıran mükemmel cevap
— zai chang

Vaov! Harika çalışıyor!
— Alexandru Trandafir Catalin

14

Düzgün bir şekilde doğru konuma gelin (2019)

Doğru y koordinatı alın ve kullanınwindow.scrollTo({top: y, behavior: 'smooth'})

const id = 'anchorName2';
const yourElement = document.getElementById(id);
const y = yourElement.getBoundingClientRect().top + window.pageYOffset;

window.scrollTo({top: y, behavior: 'smooth'});

Ofset ile

scrollIntoViewiyi bir seçenektir, ancak bazı durumlarda mükemmel çalışmayabilir. Örneğin ek ofsete ihtiyacınız olduğunda . İle scrollTosenin sadece bu gibi offset eklemek gerekir:

const yOffset = -10; 

window.scrollTo({top: y + yOffset, behavior: 'smooth'});

CSS stil dosyasına aşağıdakileri eklemeniz gerektiğini düşünüyorum: css html { scroll-behavior: smooth; }
— parismiguel

5
$(document).ready ->
  $("a[href^='#']").click ->
    $(document.body).animate
      scrollTop: $($(this).attr("href")).offset().top, 1000

5

CSS-Tricks'in çözümü artık jQuery 2.2.0'da çalışmıyor. Bir seçici hatası atar:

JavaScript çalışma zamanı hatası: Sözdizimi hatası, tanınmayan ifade: a [href * = #]: değil ([href = #])

Seçiciyi değiştirerek düzelttim. Tam snippet şudur:

$(function() {
  $("a[href*='#']:not([href='#'])").click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
    var target = $(this.hash);
    target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
    if (target.length) {
      $('html,body').animate({
        scrollTop: target.offset().top
      }, 1000);
      return false;
    }
  }
 });
});

4

Çoğu cevap gereksiz yere karmaşıktır.

Yalnızca hedef öğeye atlamak istiyorsanız JavaScript'e ihtiyacınız yoktur:

# the link:
<a href="#target">Click here to jump.</a>

# target element:
<div id="target">Any kind of element.</div>

Hedefe animasyonlu olarak ilerlemek istiyorsanız , lütfen @ Shahil'in cevabına bakın.


Bazen, bunu dinamik olarak yapmanız gerekir; yani, kullanıcının doğrudan eylemi olmaksızın. OP'nin bunu istediğine inanıyorum.
— jpaugh

1
Evet, açıkça OP OP bağlantı bağlantısı işlevinin farkındaydı.
— isherwood

4

Bu çalışıyor:

$('.scroll').on("click", function(e) {

  e.preventDefault();

  var dest = $(this).attr("href");

  $("html, body").animate({

    'scrollTop':   $(dest).offset().top

  }, 2000);

});

https://jsfiddle.net/68pnkfgd/

Animasyon eklemek istediğiniz bağlantılara "kaydırma" sınıfını eklemeniz yeterlidir


Güzel, kullanımı kolay bir çözüm. Teşekkürler!
— Smitty-Werben-Jager-Manjenson

3

Bu, sayfayı bağlantıya kaydırmak için çalışan bir komut dosyasıdır. Kurulumu yapmak için bağlantı bağlantısına, kaydırmak istediğiniz bağlantı noktasının ad özniteliğiyle eşleşen bir kimlik verin.

<script>
jQuery(document).ready(function ($){ 
 $('a').click(function (){ 
  var id = $(this).attr('id');
  console.log(id);
  if ( id == 'cet' || id == 'protein' ) {
   $('html, body').animate({ scrollTop: $('[name="' + id + '"]').offset().top}, 'slow'); 
  }
 }); 
});
</script>

2

Sorunun gerçekten eski olduğunu biliyorum, ama css-tricks'te kolay ve basit bir jQuery çözümü buldum . Şu an kullandığım bu.

$(function() {
  $('a[href*=#]:not([href=#])').click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
      var target = $(this.hash);
      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
      if (target.length) {
        $('html,body').animate({
          scrollTop: target.offset().top
        }, 1000);
        return false;
      }
    }
  });
});

1
Seçici, jquery 2.2.0'da bir istisna atıyor. 0x800a139e - JavaScript çalışma zamanı hatası: Sözdizimi hatası, tanınmayan ifade: a [href * = #]: değil ([href = #])
— Bill Shihara

2

jQuery("a[href^='#']").click(function(){
    jQuery('html, body').animate({
        scrollTop: jQuery( jQuery(this).attr('href') ).offset().top
    }, 1000);
    return false;
});


2

bir vue2 çözümü ... güncellemeyi zorlamak için basit veri özelliği ekleyin

  const app = new Vue({ 
  ... 

  , updated: function() {
           this.$nextTick(function() {
           var uri = window.location.href
           var anchor = ( uri.indexOf('#') === -1 ) ? '' : uri.split('#')[1]
           if ( String(anchor).length > 0 && this.updater === 'page_load' ) {
              this.updater = "" // only on page-load !
              location.href = "#"+String(anchor)
           }
         })
        }
     });
     app.updater = "page_load"

 /* smooth scrolling in css - works in html5 only */
 html, body {
     scroll-behavior: smooth;
 }

0

tarayıcının sayfayı belirli bir bağlantıya kaydırmasını sağlamanın en kolay yolu style.css * {scroll-behavior: smooth;} ve html navigasyonunuzda #NameOfTheSection kullanın

*{scroll-behavior: smooth;}
<a href="#scroll-to">Home<a/>

<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>

<section id="scroll-to">
<p>it will scroll down to this section</p>
</section>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.