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.