আমি কীভাবে jQuery ব্যবহার করে স্ক্রোল করার জন্য একটি উপাদান পেতে পারি?


169

গ্রিড ফর্ম্যাট ব্যবহার করে আমার সাথে একটি HTML ডকুমেন্ট রয়েছে <ul><li><img...। ব্রাউজার উইন্ডোটিতে উভয় উল্লম্ব এবং অনুভূমিক স্ক্রোলিং রয়েছে।

প্রশ্ন: আমি যখন কোনও ছবিতে ক্লিক করি , তখন আমি <img>কীভাবে পুরো দস্তাবেজটি এমন একটি অবস্থানে স্ক্রোল করতে পাব যেখানে আমি স্রেমে ক্লিক করা চিত্রটি top:20px; left:20px?

আমি অনুরূপ পোস্টগুলির জন্য এখানে একটি ব্রাউজ করেছি ... যদিও আমি জাভাস্ক্রিপ্টে বেশ নতুন, এবং কীভাবে এটি নিজের জন্য অর্জন করা যায় তা বুঝতে চাই।


উত্তর:


192

যেহেতু আপনি এটি কীভাবে কাজ করে তা জানতে চান, তাই আমি ধাপে ধাপে এটি ব্যাখ্যা করব।

প্রথমে আপনি চিত্রটির ক্লিক হ্যান্ডলার হিসাবে কোনও ফাংশন বাঁধতে চান:

$('#someImage').click(function () {
    // Code to do scrolling happens here
});

এটিতে একটি চিত্রের সাথে ক্লিক হ্যান্ডলারের প্রয়োগ হবে id="someImage"। আপনি যদি সমস্ত চিত্রের কাছে এটি করতে চান তবে এর '#someImage'সাথে প্রতিস্থাপন করুন 'img'

এখন আসল স্ক্রোলিং কোডের জন্য:

  1. চিত্রের অফসেটগুলি পান (দস্তাবেজের তুলনায়):

    var offset = $(this).offset(); // Contains .top and .left
  2. থেকে বিয়োগ 20 topএবং left:

    offset.left -= 20;
    offset.top -= 20;
  3. এখন সজীব এর স্ক্রোল উপরে এবং স্ক্রল-বাম CSS এর বৈশিষ্ট্য <body>এবং <html>:

    $('html, body').animate({
        scrollTop: offset.top,
        scrollLeft: offset.left
    });

3
এটি কেবল সাধারণ বিন্যাসের জন্য কাজ করে। .scrollIntoViewউপাদানগুলি একাধিক উপচে পড়া পাত্রে অন্তর্ভুক্ত হলে ডাব্লু 3 সি পদ্ধতিটি সমস্ত ক্ষেত্রে পরিচালনা করে না ।
natevw

2
চাকা পুনরুদ্ধার কেন? Element.scrollIntoView(): বিকাশকারী.মোজিলা.আর.ইন-
সার্জ

@ সার্জ কারণ এটি একটি কার্যনির্বাহী খসড়া যা সমস্ত ব্রাউজারগুলিতে প্রয়োগ করা হয়নি
জন স্মিথ

@ জনস্মিত দয়া করে আমার পোস্ট করা লিঙ্কটি, "ব্রাউজারের সামঞ্জস্যতা" বিভাগটি মনোযোগ সহকারে পড়ুন, আপনি দেখতে পাবেন যে কোনও ব্রাউজার সমর্থন করে নাscrollIntoView
সার্জ

@ সার্জে দুঃখিত, এ সম্পর্কে দুঃখিত, আমি বুঝতে পারি না, সেখানে স্ক্রোলইন্টোভিও অপশনও রয়েছে (এটিই যথেষ্ট যা সমর্থিত নয়)। আমার ধারণা এটি যথেষ্ট ভাল।
জন স্মিথ

377

একটি ডোম পদ্ধতি বলা হয় scrollIntoView, যা সমস্ত বড় ব্রাউজার দ্বারা সমর্থিত হয়, যা ভিউপোর্টের উপরের / বামে (বা যতটা সম্ভব কাছাকাছি) কোনও উপাদানকে সারিবদ্ধ করবে।

$("#myImage")[0].scrollIntoView();

সমর্থিত ব্রাউজারগুলিতে, আপনি বিকল্পগুলি সরবরাহ করতে পারেন:

$("#myImage")[0].scrollIntoView({
    behavior: "smooth", // or "auto" or "instant"
    block: "start" // or "end"
});

বিকল্পভাবে, যদি সমস্ত উপাদানগুলির স্বতন্ত্র আইডি থাকে তবে আপনি কেবল পিছনে / ফরোয়ার্ড বোতাম সমর্থনের জন্য অবজেক্টটির hashসম্পত্তি পরিবর্তন করতে পারেন location:

$(document).delegate("img", function (e) {
    if (e.target.id)
        window.location.hash = e.target.id;
});

তারপরে, কেবল -20 -র মধ্যে scrollTop/ scrollLeftবৈশিষ্ট্যগুলি সামঞ্জস্য করুন :

document.body.scrollLeft -= 20;
document.body.scrollTop -= 20;

2
ধন্যবাদ! 5 টি অন্যান্য এসও নিবন্ধ এবং আপনি একে একে পুরোপুরি পেরেক দিয়েছেন। আমার ব্যবহারের ক্ষেত্রে বুটস্ট্র্যাপ ডায়ালগের একটি ধারক ছিল যা দেখার জন্য স্ক্রোল করা দরকার।
স্টিফেন প্যাটেন

10
একটি নোট হিসাবে: $("#myImage")[0].scrollIntoView(false);উইন্ডোটির নীচে উপাদানটি সারিবদ্ধ করবে।
ফিলিপ

1
সাবধান: "মসৃণ" আচরণটি ব্যাপকভাবে সমর্থিত নয় এবং scrollIntoViewএটি কোনও ধরণের অ্যানিমেশন ছাড়াই ব্যবহারকারীদের জন্য বিভ্রান্তিকর অভিজ্ঞতা হতে পারে।
কোডি ডুভাল

1
@ জনহেন্কেল: এটি ভুল, এমনকি আইও 5.5 এর scrollIntoViewবুলিয়ান প্যারামিটারটি ছিল। আমি পরে চেষ্টা করব এবং caniuse.com এর জন্য একটি পুল অনুরোধ পাঠাব।
অ্যান্ডি ই

1
দ্রষ্টব্য: ক্রোম ব্যবহার করে, আমি <td>উপাদানগুলিকে দেখার জন্য স্ক্রোল করতে পারি না , পরিবর্তে তাদের পিতামাতাকে ( <tr>) স্ক্রোল করতে হয়েছিল এবং এটি কাজ করে।
ক্রেজিটাইম 8:58

13

সহজ সমাধান আমি দেখেছি

var offset = $("#target-element").offset();
$('html, body').animate({
    scrollTop: offset.top,
    scrollLeft: offset.left
}, 1000);

টিউটোরিয়াল এখানে


এটিকে কম সহজ করার ঝুঁকিতে, আমি এটিও অনুভূমিক স্ক্রোলিং সমর্থন করার জন্য সম্পাদনা করেছি।
jpaugh

7

উপাদানটিতে সরাসরি ভিউতে স্ক্রোল করার পদ্ধতি রয়েছে তবে আপনি যদি কোনও উপাদান থেকে কোনও বিন্দুতে স্ক্রোল করতে চান তবে আপনাকে এটি ম্যানুয়ালি করতে হবে:

ক্লিক হ্যান্ডলারের ভিতরে, নথির সাথে সম্পর্কিত উপাদানটির অবস্থান পান, বিয়োগ করুন 20এবং ব্যবহার করুন window.scrollTo:

var pos = $(this).offset();
var top = pos.top - 20;
var left = pos.left - 20;
window.scrollTo((left < 0 ? 0 : left), (top < 0 ? 0 : top));

7

কটাক্ষপাত আছে jQuery.scrollTo প্লাগইন। এখানে একটি ডেমো রয়েছে

এই প্লাগইনটিতে অনেকগুলি বিকল্প রয়েছে যা নেটিভ স্ক্রোলআইন্টো ভিউয়ের বাইরে চলে যায় আপনাকে দেয়উদাহরণস্বরূপ, আপনি স্ক্রোলিংটি মসৃণ করতে সেট করতে পারেন এবং তারপরে স্ক্রোলিং শেষ হওয়ার জন্য একটি কলব্যাক সেট করতে পারেন।

"স্ক্রোল" দিয়ে ট্যাগ করা সমস্ত JQuery প্লাগইনগুলিতে আপনি একবার দেখতে পারেন ।


আমি আমার ক্ষেত্রে প্রতিটি ব্রাউজারে বিভিন্ন অফসেট / পজিশন পাচ্ছিলাম এবং এই প্লাগইনটি এটি আমার জন্য স্থির করতে সহায়তা করেছিল! ধন্যবাদ!
লরেলবি

4

ব্রাউজারের কার্যকারিতা সুন্দরভাবে তৈরি করার জন্য এখানে একটি দ্রুত jQuery প্লাগইন রয়েছে:

$.fn.ensureVisible = function () { $(this).each(function () { $(this)[0].scrollIntoView(); }); };

...

$('.my-elements').ensureVisible();

3

পরীক্ষার এবং ত্রুটির পরে আমি এই ফাংশনটি নিয়ে এসেছি, iframe নিয়েও কাজ করি works

function bringElIntoView(el) {    
    var elOffset = el.offset();
    var $window = $(window);
    var windowScrollBottom = $window.scrollTop() + $window.height();
    var scrollToPos = -1;
    if (elOffset.top < $window.scrollTop()) // element is hidden in the top
        scrollToPos = elOffset.top;
    else if (elOffset.top + el.height() > windowScrollBottom) // element is hidden in the bottom
        scrollToPos = $window.scrollTop() + (elOffset.top + el.height() - windowScrollBottom);
    if (scrollToPos !== -1)
        $('html, body').animate({ scrollTop: scrollToPos });
}

2

শুধু একটি টিপ। শুধুমাত্র ফায়ারফক্সে কাজ করে

Element.scrollIntoView ();


4
এটি বুলিয়ান প্যারামিটার বা কোনও প্যারামিটার সহ সমস্ত ব্রাউজারের জন্য কাজ করছে। কেবলমাত্র আরও উন্নত অবজেক্ট প্যারামিটার কম সমর্থিত।
রিসর্ড


এটি এখন যথেষ্ট পরিমাণে কেবল অপেরা মিনি সমর্থিত: caniuse.com/#search=scrolIntoView
জন ম্যাগনোলিয়া

এর জন্য এখানে বেশ কয়েকটি হালকা ওজনের পলিফিলস রয়েছে।
মার্টিন জেমস

1

আমার ইউআইয়ের একটি থাম্ববারের মধ্যে থাম্বগুলির উল্লম্ব স্ক্রোলিং তালিকা রয়েছে লক্ষ্যটি ছিল থাম্ববারের ঠিক মাঝখানে বর্তমান থাম্বটি তৈরি করা। আমি অনুমোদিত উত্তরটি থেকে শুরু করেছিলাম তবে দেখতে পেলাম যে বর্তমান থাম্বটিকে সত্যিকার অর্থে কেন্দ্র করার জন্য কয়েকটি টুইট ছিল। আশাকরি এটি কাউকে সাহায্য করবে.

মার্কআপ:

<ul id='thumbbar'>
    <li id='thumbbar-123'></li>
    <li id='thumbbar-124'></li>
    <li id='thumbbar-125'></li>
</ul>

jQuery:

// scroll the current thumb bar thumb into view
heightbar   = $('#thumbbar').height();
heightthumb = $('#thumbbar-' + pageid).height();
offsetbar   = $('#thumbbar').scrollTop();


$('#thumbbar').animate({
    scrollTop: offsetthumb.top - heightbar / 2 - offsetbar - 20
});

0

নীচে বা নীচে স্ক্রোল করার জন্য সহজ 2 টি পদক্ষেপ।

পদক্ষেপ 1: স্ক্রোলযোগ্য (কথোপকথন) বিভাগের সম্পূর্ণ উচ্চতা পান।

পদক্ষেপ 2: ধাপ 1 এ প্রাপ্ত মানটি ব্যবহার করে সেই স্ক্রোলযোগ্য (কথোপকথন) ডিভিতে স্ক্রোলটপ প্রয়োগ করুন।

var fullHeight = $('#conversation')[0].scrollHeight;

$('#conversation').scrollTop(fullHeight);

কথোপকথনের প্রতিটি সংখ্যার জন্য উপরের পদক্ষেপগুলি প্রয়োগ করতে হবে div


0

প্রতিটি পরিস্থিতি পরিচালিত এমন কোনও সন্ধানের চেষ্টা করার পরে (স্ক্রোলটি অ্যানিমেট করার বিকল্পগুলি, বস্তুর চারপাশে প্যাডিং একবারে এটি স্ক্রোল হয়ে যায়, এমনকি আইফ্রেমে যেমন অস্পষ্ট পরিস্থিতিতেও কাজ করে), অবশেষে আমি নিজের সমাধানটি লিখে শেষ করেছি। যেহেতু এটি অন্যান্য অনেকগুলি সমাধান ব্যর্থ হওয়ার পরে কাজ করে বলে মনে হচ্ছে, আমি এটিকে ভাগ করে নিই:

function scrollIntoViewIfNeeded($target, options) {

    var options = options ? options : {},
    $win = $($target[0].ownerDocument.defaultView), //get the window object of the $target, don't use "window" because the element could possibly be in a different iframe than the one calling the function
    $container = options.$container ? options.$container : $win,        
    padding = options.padding ? options.padding : 20,
    elemTop = $target.offset().top,
    elemHeight = $target.outerHeight(),
    containerTop = $container.scrollTop(),
    //Everything past this point is used only to get the container's visible height, which is needed to do this accurately
    containerHeight = $container.outerHeight(),
    winTop = $win.scrollTop(),
    winBot = winTop + $win.height(),
    containerVisibleTop = containerTop < winTop ? winTop : containerTop,
    containerVisibleBottom = containerTop + containerHeight > winBot ? winBot : containerTop + containerHeight,
    containerVisibleHeight = containerVisibleBottom - containerVisibleTop;

    if (elemTop < containerTop) {
        //scroll up
        if (options.instant) {
            $container.scrollTop(elemTop - padding);
        } else {
            $container.animate({scrollTop: elemTop - padding}, options.animationOptions);
        }
    } else if (elemTop + elemHeight > containerTop + containerVisibleHeight) {
        //scroll down
        if (options.instant) {
            $container.scrollTop(elemTop + elemHeight - containerVisibleHeight + padding);
        } else {
            $container.animate({scrollTop: elemTop + elemHeight - containerVisibleHeight + padding}, options.animationOptions);
        }
    }
}

$target আপনি যদি প্রয়োজন হয় তবে ভিউতে স্ক্রোল করতে ইচ্ছুক এমন একটি jQuery অবজেক্ট।

options (alচ্ছিক) একটি অবজেক্টে নিম্নলিখিত নিম্নলিখিত বিকল্পগুলি থাকতে পারে:

options.$container- একটি jQuery অবজেক্ট $ টার্গেটযুক্ত উপাদানটিকে নির্দেশ করে (অন্য কথায়, স্ক্রোলবারগুলির সাথে ডোমের উপাদানটি)। উইন্ডোতে ডিফল্ট যেটিতে $ টার্গেট এলিমেন্ট রয়েছে এবং এটি একটি আইফ্রেমে উইন্ডো নির্বাচন করতে যথেষ্ট স্মার্ট। সম্পত্তির নামটিতে include অন্তর্ভুক্ত করতে ভুলবেন না।

options.padding- বস্তুটির উপরে বা নীচে যুক্ত করার জন্য পিক্সেলগুলিতে প্যাডিং যখন এটিকে দেখায় স্ক্রোল করা হয়। এইভাবে উইন্ডোর প্রান্তের বিরুদ্ধে সঠিক নয়। ডিফল্ট 20।

options.instant- যদি সত্যতে সেট করা থাকে, jQuery অ্যানিমেট ব্যবহার করা হবে না এবং স্ক্রোলটি তাত্ক্ষণিকভাবে সঠিক অবস্থানে চলে যাবে। মিথ্যা ডিফল্ট।

options.animationOptions- আপনি jQuery অ্যানিমেট ফাংশনটিতে যেতে চান এমন যে কোনও jQuery বিকল্পগুলি (দেখুন http://api.jquery.com/animate/ )। এটির সাহায্যে আপনি অ্যানিমেশনের সময়কাল পরিবর্তন করতে পারেন বা স্ক্রোলিং সম্পূর্ণ হয়ে গেলে একটি কলব্যাক ফাংশন কার্যকর করতে পারেন। এটি কেবল যদি options.instantমিথ্যাতে সেট করা থাকে তা কাজ করে । আপনার যদি একটি তাত্ক্ষণিক অ্যানিমেশন প্রয়োজন তবে একটি কলব্যাক সহ, options.animationOptions.duration = 0ব্যবহারের পরিবর্তে সেট করুন options.instant = true

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