প্রদত্ত অ্যাঙ্করটিতে এইচটিএমএল পৃষ্ঠা কীভাবে স্ক্রোল করবেন?


264

আমি জাভাস্ক্রিপ্ট ব্যবহার করে কোনও প্রদত্ত নোঙ্গরে পৃষ্ঠাটি স্ক্রোল করতে ব্রাউজারটি তৈরি করতে চাই।

আমি আমার এইচটিএমএল কোডে একটি nameবা idবৈশিষ্ট্য নির্দিষ্ট করেছি:

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

অথবা

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

আমি নেভিগেট করে আপনি যেমন পেতেন তেমন প্রভাব পেতে চাই http://server.com/path#anchorName। পৃষ্ঠাটি স্ক্রোল করা উচিত যাতে অ্যাঙ্কর পৃষ্ঠার দৃশ্যমান অংশের শীর্ষের নিকটে থাকে।

উত্তর:


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

কোন jQuery প্রয়োজন হয় না!


91
এটি আসলে স্ক্রোল করে না, এটি কেবল লাফ দেয়। এই মুহুর্তে আপনি কেবল অ্যাঙ্করের সাথে লিঙ্ক করতে পারেন<a href="#anchorName">link</a>
রায়ান

52
মনে রাখবেন এটি কেবল একবারে কাজ করবে। হ্যাশটি সেট হয়ে যাওয়ার পরে পৃষ্ঠাটি একই হ্যাশটিতে স্ক্রোল করবে না যতক্ষণ না আপনি এটিকে একটি ডামি পরিবর্তন করে আবার সেট না করে।
ক্রিশ্চিয়ান ভ্রাবী

13
আপনার স্ক্রোলটো ব্যবহার করা উচিত নয়, কারণ এটি ইতিমধ্যে বিশ্বব্যাপী উইন্ডো অবজেক্ট দ্বারা ব্যবহৃত হয়েছে। এছাড়াও প্যারামিটারটির নাম হ্যাশ করা উচিত নয়, কারণ লোকেশন.হ্যাশও সংজ্ঞায়িত। আপনি এই কোডটি ব্যবহার করতে পারেন:function scrollToHash(hashName) { location.hash = "#" + hashName; }
মার্কাস জেলার

3
@ মারকুসজেলার, প্যারামিটারটিকে হ্যাশ বলা হবে না কেন? এটি অবস্থানের সাথে সংঘর্ষ হয় না, তাই না?
Gharman

3
আপনি যদি "স্ক্রোল-আচরণ: মসৃণ" সেট করেন তবে এটি স্ক্রোল করে; এইচটিএমএল উপাদানটিতে
স্ট্যাকার

225

উপায় সহজ:

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
আমি প্রথমে ভেবেছিলাম ম্যান্ডেক্স ট্রল করছে, তারপরে আমি এটি চেষ্টা করেছি এবং এটি কাজ করেছে। আমাকে ছাড়িয়ে আমি এই পদ্ধতিটি আগে কখনই পারিনি। এই পদ্ধতির জন্য মজিলা ডক্স । এছাড়াও, এটি ব্রাউজারগুলিতে খুব ভাল সমর্থন করা হবে বলে মনে হয়।
জোনাথন ডুমাইন

2
Jquery সমাধানগুলি স্ক্রোলিং না করে আমার অনেকগুলি সমস্যা ছিল। এটি আমাকে অনেক হতাশার হাত থেকে বাঁচিয়েছিল।
নিউক্লিয়ারপিয়ন

1
সতর্কবার্তা! এই পদ্ধতিতে সমস্যা থাকতে পারে যদি এটির উপরে একটি ডিভিটি ভাসমান উপাদান থাকে এবং সহজেই এটির আকার নির্ধারণ করতে না পারে।
ভোগোম্যাটিক্স

5
এটি একটি পরিষ্কার সমাধান, তবে এখন পর্যন্ত এটি কোনও টুইট করার অনুমতি দেয় না, এটি একটি হার্ড স্ক্রোল করে। একটি পরীক্ষামূলক প্যারামিটার scrollIntoViewOptionsরয়েছে যার একটি behavior: "smooth"বিকল্প রয়েছে তবে এটি বর্তমানে কেবল ফায়ারফক্সের সাথেই সামঞ্জস্যপূর্ণ।
রোচা

কীভাবে এনিমেট করবেন?
স্কুরাজেড

124

আপনি jQuerys .animate () ব্যবহার করতে পারেন , .offset () এবংscrollTop । মত

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

উদাহরণ লিঙ্ক: http://jsbin.com/unasi3/edit

আপনি যদি ব্যবহার অ্যানিমেট করতে না চান .crolTop () পছন্দ করুন

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

বা জাভাস্ক্রিপ্টস নেটিভ location.hashপছন্দ

location.hash = '#' + anchorid;

1
যত তাড়াতাড়ি <h1 id="anchorName">বা নির্বাচিত হিসাবে নির্বাচক তৈরি করা যায় <a name="anchorName">, ব্যবহার $('#'+hash+',a[name='+hash+']')বা কিছুটা অপ্টিমাইজড $(document.getElementById(hash) || 'a[name='+hash+']')যা প্রথমে আইডি দ্বারা উপাদানটির জন্য অনুসন্ধান করবে এবং যদি এটি না পাওয়া যায় তবে কেবলমাত্র অনুসন্ধানের জন্যই অবলম্বন করবে।
gnarf

@gnarf - jQuery- তে '#' নির্বাচকদের অনুকূলকরণের কোনও প্রয়োজন নেই - তারা ইতিমধ্যে আপনার জন্য অনুকূলিত। আপনি jQuery উত্স কোডটি পড়েছেন কিনা তা দেখতে মোটামুটি সহজ।
কোডজাউস্ট

3
@ কোডজেস্ট - আমি jQuery দলে রয়েছি, আমি এটি বহুবার পড়েছি এবং হ্যাঁ $("#selector")অনুকূলিত হয়েছে তবে $("#selector,a[name='selector']")দ্রুত একই অপ্টিমাইজেশনের মধ্য দিয়ে যাব না। আমি মনে করি আমার 2.5 বছরের পুরানো মন্তব্যটি কিছুটা অদ্ভুত শোনাচ্ছে। "অপ্টিমাইজেশন" a[name='selector']আইডিটি অনুসন্ধান করে, যদি আইডির সন্ধানকে অপ্টিমাইজ করে না তবে অনুসন্ধান এড়ানো হচ্ছে ।
gnarf

1
এই পদ্ধতির সাথে আমার কিছু ভাগ্য ছিল: <a data-hash="about"> সম্পর্কে </a> <script> $ ("[ডেটা-হ্যাশ]") ক্লিক করুন (ফাংশন () {var ডেটা = $ (এটি) .attr ("ডেটা-হ্যাশ"); $ (ডকুমেন্ট.বিডি)। অ্যানিম্যাট ({'স্ক্রোলটপ': $ ("#" + ডেটা)। অফসেট () শীর্ষ}, 500);}); </script>
জাজি

32

জেন্ডির দুর্দান্ত সমাধান, তবে মসৃণ স্ক্রোলটিতে ফায়ার ফক্সে কাজ করার সমস্যা রয়েছে বলে মনে হচ্ছে।

এটি এইভাবে লেখা ফায়ারফক্সেও কাজ করে।

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

সর্বশেষতম ক্রোম রিলিজে এটি আমি একমাত্র পদ্ধতিটি পেয়েছি যা ধারাবাহিকভাবে কাজ করে। বখশিশের জন্য ধন্যবাদ!
চমত্কার

32

2018-2020 খাঁটি জেএস:

উপাদানটিতে স্ক্রোল করার খুব সুবিধাজনক উপায় রয়েছে:

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.
})

তবে যতদূর আমি বুঝতে পারি তার নীচের বিকল্পগুলির মতো ভাল সমর্থন নেই।

এখানে চিত্র বর্ণনা লিখুন

পদ্ধতি সম্পর্কে আরও জানুন।


যদি প্রয়োজন হয় যে উপাদানটি শীর্ষে রয়েছে:

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
})

কোডেপেনের প্রতিবাদের উদাহরণ


আপনি যদি চান যে উপাদানটি কেন্দ্রের মধ্যে রয়েছে:

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
});

কোডেপেনের প্রতিবাদের উদাহরণ


সহায়তা:

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

তারা লিখেছে যে scrollএকই পদ্ধতি scrollTo, কিন্তু সমর্থন ভাল দেখায় scrollTo

পদ্ধতি সম্পর্কে আরও


এই সমাধান খুব ভাল কাজ করে! ভাগ করে নেওয়ার জন্য ধন্যবাদ!
চমত্কার

29

JQuery ছাড়াই একটি খাঁটি জাভাস্ক্রিপ্ট সমাধান। আইওএস-তে পরীক্ষিত নয়, ক্রোম ও আইইতে পরীক্ষিত

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;
  }
}

ডেমো: https://jsfiddle.net/jd7q25hg/12/


1
কোনও পুরানো বিষয়ে মন্তব্য করার জন্য ক্ষমা চাইছি তবে আমার প্রকল্পটি জ্যাকুয়েরি ব্যবহার না করায় এটি আমার পক্ষে সবচেয়ে ভাল কাজ করে। কেবলমাত্র আমি লক্ষ্য করেছি যে আপনি খুব শীর্ষে স্ক্রোল করলে এটি 5 পিক্সেল বা মিস করে।
অ্যান্টবার্চ

খাঁটি জেএস সংস্করণটি দেখতে খুব সতেজকর। আমি শিক্ষার্থীদের সর্বদা হুবহু দেখতে এবং জিক্যুয়ারি তাদের জন্য কী করে তা বুঝতে শেখাই, তাই এটি একটি দুর্দান্ত উদাহরণ।
ডেভ এভারিট

2
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত: এটি একটি খাঁটি জেএস উদাহরণ এবং এটি পছন্দসই স্ক্রোলিং অ্যানিমেশন প্রভাব অর্জন করে। আমি টাইমআউট মান 20 এডজাস্ট করেছি এবং এটি নির্বিঘ্নে কাজ করে।
মার্ক ব্যারাসো

আপনাকে ধন্যবাদ আমি খাঁটি জাভাস্ক্রিপ্ট সমাধানগুলি পছন্দ করি
R01010010

2
আইওএস-এ কাজ করে এটি কেবল পরীক্ষা করে।
ডেবি কুর্থ

23

2018 এ, এর মতো সাধারণ কিছু করার জন্য আপনার jQuery দরকার নেই। বিল্ট ইন scrollIntoView()পদ্ধতিটি "behavior পৃষ্ঠার যে কোনও উপাদানগুলিতে সহজে স্ক্রোল করার জন্য " সম্পত্তি করে। এমনকি আপনি এটি ব্রাউজারযোগ্য করে তুলতে ব্রাউজারের URL টি হ্যাশ দিয়ে আপডেট করতে পারেন।

এইচটিএমএল বুকমার্কগুলি স্ক্রোল করার এই টিউটোরিয়াল থেকে , আপনার পৃষ্ঠায় সমস্ত অ্যাঙ্কর লিঙ্কগুলিতে স্বয়ংক্রিয়ভাবে স্ক্রোলিং যুক্ত করার একটি স্থানীয় উপায়:

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 এর উপর নির্ভরতা সরিয়ে দেয়
জাই চ্যাং

কি দারুন! দুর্দান্ত কাজ!
আলেকজান্দ্রু ট্রান্ডাফির ক্যাটালিন

14

মসৃণভাবে সঠিক অবস্থানে স্ক্রোল করুন (2019)

সঠিক y সমন্বয় এবং ব্যবহার পানwindow.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'});

অফসেট সহ

scrollIntoViewএটিও একটি ভাল বিকল্প তবে এটি কিছু ক্ষেত্রে পুরোপুরি কার্যকর নাও হতে পারে। উদাহরণস্বরূপ যখন আপনার অতিরিক্ত অফসেট প্রয়োজন । আপনার সাথে scrollToকেবল এটির মতো অফসেটটি যুক্ত করা দরকার:

const yOffset = -10; 

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

আমি মনে করি আপনার সিএসএস শৈলীর ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করা উচিত: css html { scroll-behavior: smooth; }
প্যারিসিমগেল

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

5

সিএসএস-ট্রিকস থেকে সমাধান আর jQuery 2.2.0 এ কাজ করে না। এটি একটি নির্বাচক ত্রুটি নিক্ষেপ করবে:

জাভাস্ক্রিপ্ট রানটাইম ত্রুটি: সিনট্যাক্স ত্রুটি, অচেনা এক্সপ্রেশন: একটি [href * = #]: না ([href = #])

আমি নির্বাচক পরিবর্তন করে এটি স্থির করেছি। পূর্ণ স্নিপেটটি হ'ল:

$(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

বেশিরভাগ উত্তর অহেতুক জটিল।

আপনি যদি কেবলমাত্র লক্ষ্য উপাদানটিতে ঝাঁপিয়ে পড়তে চান তবে আপনার জাভাস্ক্রিপ্টের দরকার নেই:

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

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

আপনি যদি অ্যানিমেটেডভাবে লক্ষ্যতে স্ক্রোল করতে চান তবে দয়া করে @ শাহিলের উত্তরটি দেখুন।


কখনও কখনও, আপনি গতিশীল এটি করা প্রয়োজন, যদিও; অর্থাত্ ব্যবহারকারীর সরাসরি পদক্ষেপের মাধ্যমে নয়। আমি বিশ্বাস করি ওপি এটিই চায়।
jpaugh

1
হ্যাঁ, স্পষ্টতই ওপি অ্যাঙ্কর লিঙ্ক কার্যকারিতা সম্পর্কে ইতিমধ্যে সচেতন ছিল।
ইশারউড

4

এইটা কাজ করে:

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

  e.preventDefault();

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

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

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

  }, 2000);

});

https://jsfiddle.net/68pnkfgd/

আপনার সঞ্জীবিত করতে চাইলে যে কোনও লিঙ্কগুলিতে কেবল 'স্ক্রোল' শ্রেণি যুক্ত করুন


সমাধানটি ব্যবহার করার জন্য দুর্দান্ত, সহজ। ধন্যবাদ!
স্মিট্টি-ওয়ারবেন-জাগার-মানজেনসন

3

এটি একটি কার্যকারী স্ক্রিপ্ট যা পৃষ্ঠাটি অ্যাঙ্কারে স্ক্রোল করবে। সেটআপ করার জন্য কেবল অ্যাঙ্করটিকে একটি আইডি দিন যা আপনি স্ক্রোল করতে চান এমন অ্যাঙ্কারের নামের বৈশিষ্ট্যের সাথে মেলে।

<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

আমি জানি এই প্রশ্নটি আসলেই পুরানো, তবে আমি সিএসএস-ট্রিক্সে একটি সহজ এবং সাধারণ jQuery সমাধান পেয়েছি । এটিই এখন আমি ব্যবহার করছি।

$(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
নির্বাচক jquery 2.2.0 এ একটি ব্যতিক্রম ছুঁড়ছেন। 0x800a139e - জাভাস্ক্রিপ্ট রানটাইম ত্রুটি: সিনট্যাক্স ত্রুটি, অজানা অভিব্যক্তি: একটি [href * = #]: না ([href = #])
বিল শিহর


2

একটি vue2 সমাধান ... সহজ আপডেট আপডেট করার জন্য সহজ তথ্য সম্পত্তি যুক্ত করুন

  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

প্রদত্ত অ্যাঙ্কারে পৃষ্ঠাটি স্ক্রোল করার জন্য ব্রাউজারটি তৈরি করার সহজতম উপায় হ'ল আপনার স্টাইল। CSS * * স্ক্রোল-আচরণ: মসৃণ; in টাইপ করা এবং আপনার এইচটিএমএল নেভিগেশনে #NameOfTheSੈਕਸ਼ਨ ব্যবহার করুন

*{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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.