jQuery เลื่อนไปที่องค์ประกอบ


2323

ฉันมีinputองค์ประกอบนี้:

<input type="text" class="textfield" value="" id="subject" name="subject">

จากนั้นฉันก็มีองค์ประกอบอื่น ๆ เช่นอินพุตข้อความอื่น ๆ textareas เป็นต้น

เมื่อผู้ใช้คลิกที่ว่าinputมี#subjectหน้าควรเลื่อนไปที่องค์ประกอบสุดท้ายของหน้าเว็บที่มีภาพเคลื่อนไหวที่ดี ควรเลื่อนไปด้านล่างและไม่ไปด้านบน

รายการสุดท้ายของหน้าคือsubmitปุ่มที่มี#submit:

<input type="submit" class="submit" id="submit" name="submit" value="Ok, Done.">

ภาพเคลื่อนไหวไม่ควรเร็วเกินไปและควรเป็นของเหลว

ฉันใช้ jQuery เวอร์ชั่นล่าสุด ฉันไม่ต้องการติดตั้งปลั๊กอินใด ๆ แต่ใช้คุณสมบัติ jQuery ที่เป็นค่าเริ่มต้นเพื่อให้ได้สิ่งนี้



scrollToถูกปิดการใช้งานสำหรับฉันเพราะปลั๊กอิน Chrome ไม่แน่ใจว่าอันไหน
Jacksonkr

คำตอบ:


4020

สมมติว่าคุณมีปุ่มที่มีรหัสbuttonลองตัวอย่างนี้:

$("#button").click(function() {
    $([document.documentElement, document.body]).animate({
        scrollTop: $("#elementtoScrollToID").offset().top
    }, 2000);
});

ผมได้รับรหัสจากบทความได้อย่างราบรื่นเลื่อนไปที่องค์ประกอบไม่มีปลั๊กอิน jQuery และฉันได้ทดสอบมันในตัวอย่างด้านล่าง

<html>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
    <script>
        $(document).ready(function (){
            $("#click").click(function (){
                $('html, body').animate({
                    scrollTop: $("#div1").offset().top
                }, 2000);
            });
        });
    </script>
    <div id="div1" style="height: 1000px; width 100px">
        Test
    </div>
    <br/>
    <div id="div2" style="height: 1000px; width 100px">
        Test 2
    </div>
    <button id="click">Click me</button>
</html>


24
สิ่งนี้จะไม่ทำงานในทุกกรณี ดูstackoverflow.com/questions/2905867/…
Jānis Elmeris

7
@BarryChapman ไม่ตรง หลังจาก googling ฉันได้พบสิ่งนี้ดังนั้นทั้งสองแท็กจึงจำเป็นถ้าคุณไม่ต้องการตรรกะเพิ่มเติมสำหรับแต่ละประเภทเบราว์เซอร์
s3m3n

73
หากคุณไม่ต้องการให้ภาพเคลื่อนไหวและแทนที่จะต้องการที่จะกระโดดทันทีที่องค์ประกอบที่ใช้แทน.scrollTop(…) .animate({scrollTop: …}, …)
Rory O'Kane

11
นอกจากวิธีแก้ปัญหาของคุณ (ซึ่งใช้งานได้ดี) คุณสามารถเพิ่มฟังก์ชั่นที่สมบูรณ์ซึ่งจะเพิ่มแฮชแท็กใน URL ในกรณีนี้มันจะไม่เลื่อนเนื่องจาก scrollTo เลื่อนไปยังตำแหน่งที่ถูกต้องแล้วและหากผู้ใช้คัดลอก URL มันจะรีบไปยังตำแหน่งที่ถูกต้องบนหน้าเว็บโดยอัตโนมัติ
Sander

10
หากคุณใช้การเรียกกลับเพื่อให้ทำงานเมื่อภาพเคลื่อนไหวเสร็จสมบูรณ์และสังเกตเห็นว่าการติดต่อกลับเกิดขึ้นสองครั้งด้วยวิธีนี้ให้ลองใช้ "$ ('html body'). animate (... " แทน "$ ('html, body') .animate (... "เครื่องหมายจุลภาคสร้างเหตุการณ์ภาพเคลื่อนไหวสองเหตุการณ์เหตุการณ์หนึ่งสำหรับ html เหตุการณ์หนึ่งสำหรับร่างกายคุณเพียงต้องการกิจกรรมหนึ่งสำหรับเนื้อหา HTML ขอบคุณ @TJ Crowder stackoverflow.com/questions/8790752/ …
BoatCode

526

jQuery .scrollTo () วิธีการ

jQuery .scrollTo (): ดู - สาธิต, API, แหล่งที่มา

ฉันเขียนปลั๊กอินขนาดเล็กนี้เพื่อให้การเลื่อนหน้า / องค์ประกอบง่ายขึ้นมาก มีความยืดหยุ่นที่คุณสามารถส่งผ่านองค์ประกอบเป้าหมายหรือค่าที่ระบุ บางทีนี่อาจเป็นส่วนหนึ่งของการเปิดตัวอย่างเป็นทางการครั้งต่อไปของ jQuery คุณคิดอย่างไร?


ตัวอย่างการใช้งาน:

$('body').scrollTo('#target'); // Scroll screen to target element

$('body').scrollTo(500); // Scroll screen 500 pixels down

$('#scrollable').scrollTo(100); // Scroll individual element 100 pixels down

ตัวเลือก:

scrollTarget : องค์ประกอบสตริงหรือหมายเลขที่ระบุตำแหน่งการเลื่อนที่ต้องการ

offsetTop : ตัวเลขที่กำหนดระยะห่างเพิ่มเติมเหนือเป้าหมายการเลื่อน

Duration : สตริงหรือตัวเลขที่กำหนดว่าจะให้นิเมชั่นทำงานนานแค่ไหน

easing : สตริงที่ระบุว่าฟังก์ชัน easing ใดที่จะใช้สำหรับการเปลี่ยนแปลง

เสร็จสมบูรณ์ : ฟังก์ชั่นโทรเมื่อภาพเคลื่อนไหวเสร็จสมบูรณ์


2
มันใช้งานได้จนถึงการอัปเดตล่าสุดของ chrome ฉันมีเวอร์ชันที่ใช้งานได้ในปัจจุบันบน memoryboxweddings.com/photography-posts (หากคุณต้องการลอง) ฉันจะโพสต์การอัปเดตเมื่อได้รับการแก้ไข
Timothy Perez

แก้ไขกลายเป็นไฟล์ JS จาก jquery.com ที่กำลังฆ่ามัน ควรทำงานตอนนี้ถ้าคุณลอง
Timothy Perez

4
@ TimothyPerez: ฉันแน่ใจว่านั่นหมายความว่าสิ่งที่อนุญาตสำหรับการใช้งานเชิงพาณิชย์หรือไม่ ฉันแน่ใจว่ามีหลายคนที่ต้องการใช้ข้อมูลโค้ดในเว็บไซต์ของพวกเขาและที่จะช่วยให้พวกเขานอนหลับได้ง่ายขึ้นในเวลากลางคืน? อาจจะเป็นเช่นนั้นใบอนุญาต MIT อาจเหมาะกับความต้องการของคุณ? en.wikipedia.org/wiki/MIT_License
Robert Massaioli

13
$ ('body') ไม่ทำงานใน FF ลองใช้ $ ('html, body') ซึ่งใช้งานได้
kiranvj

5
หากใครต้องการเป็นแหล่งสคริปต์นี้จากที่นี่คุณสามารถรับได้flesler.com/jquery/scrollTo/js/jquery.scrollTo-min.js
Arturs

370

หากคุณไม่สนใจเอฟเฟกต์การเลื่อนที่ราบรื่นและสนใจการเลื่อนไปยังองค์ประกอบเฉพาะคุณไม่จำเป็นต้องใช้ฟังก์ชั่น jQuery สำหรับสิ่งนี้ Javascript ได้ครอบคลุมกรณีของคุณ:

https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView

ดังนั้นสิ่งที่คุณต้องทำคือ: $("selector").get(0).scrollIntoView();

.get(0) ถูกใช้เพราะเราต้องการดึงองค์ประกอบ DOM ของ JavaScript และไม่ใช่องค์ประกอบ DOM ของ JQuery


12
คุณสามารถใช้$(selector)[0]หรือไม่
RobW

16
RobW ใช่คุณสามารถใช้ [0] ได้ แต่ get (0) ปกป้องคุณจากดัชนีที่ไม่ได้กำหนดหรือลบ ดูแหล่งที่มา: james.padolsey.com/jquery/#v=1.10.2&fn=jQuery.fn.get
corbacho

21
หากคุณไม่ต้องการที่จะใช้ jQuery document.getElementById('#elementID').scrollIntoView()ที่ทุกคนเพียงแค่ใช้ ไม่ใช้การโหลดไลบรารี ~ 100k เพียงเพื่อเลือกองค์ประกอบแล้วแปลงเป็น JavaScript ปกติ
Gavin

62
@ กาวินฉันแน่ใจว่าคุณหมายถึงว่าเป็น:document.getElementById('elementID').scrollIntoView()
Brian

3
เย็น. แต่ก่อนใช้ให้ตรวจสอบว่าเบราว์เซอร์รองรับสิ่งนี้ ตาม Mozilla "นี่เป็นเทคโนโลยีทดลอง"
Tejasvi Hegde

48

ใช้สคริปต์ง่าย ๆ นี้

if($(window.location.hash).length > 0){
        $('html, body').animate({ scrollTop: $(window.location.hash).offset().top}, 1000);
}

จะจัดเรียงว่าหากพบแท็กแฮชใน URL ให้เลื่อนเพื่อสร้างภาพเคลื่อนไหวไปยัง ID หากไม่พบแท็กแฮชให้ละเว้นสคริปต์


$(window.location.hash)จะไม่ทำงานกับแฮชที่ล้มเหลวในการตรวจจับ regex id ของ jQuery ตัวอย่างเช่นแฮชที่มีตัวเลข มันอันตรายนิดหน่อย รูปแบบของอินพุตควรได้รับการตรวจสอบความถูกต้องดังนั้นคุณไม่ต้องเลือกองค์ประกอบอื่น
dchacke

35

jQuery(document).ready(function($) {
  $('a[href^="#"]').bind('click.smoothscroll',function (e) {
    e.preventDefault();
    var target = this.hash,
        $target = $(target);

    $('html, body').stop().animate( {
      'scrollTop': $target.offset().top-40
    }, 900, 'swing', function () {
      window.location.hash = target;
    } );
  } );
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<ul role="tablist">
  <li class="active" id="p1"><a href="#pane1" role="tab">Section 1</a></li>
  <li id="p2"><a href="#pane2" role="tab">Section 2</a></li>
  <li id="p3"><a href="#pane3" role="tab">Section 3</a></li>
</ul>

<div id="pane1"></div>
<div id="pane2"></div>
<div id="pane3"></div>


1
เพื่อให้เป็นสากลมากขึ้นและเพื่อลบการวางแฮชแท็กในหน้าต่างลิงค์ของเบราว์เซอร์โดยไม่จำเป็นฉันเพิ่งปรับเปลี่ยนโค้ดดังต่อไปนี้:jQuery(document).ready(function($) { $(document).on( "click", 'a[href^="#"]', function( e ) { e.preventDefault(); var target = this.hash, $target = $(target); $('html, body').stop().animate({ scrollTop: $target.offset().top - 100}, 1000); }); });
bubencode

31

การแก้ปัญหาโดยสตีฟและปีเตอร์ทำงานได้ดีมาก

แต่ในบางกรณีคุณอาจต้องแปลงค่าเป็นจำนวนเต็ม น่าแปลกที่ค่ากลับมาจากการเป็นบางครั้งใน$("...").offset().top ใช้:float
parseInt($("....").offset().top)

ตัวอย่างเช่น:

$("#button").click(function() {
    $('html, body').animate({
        scrollTop: parseInt($("#elementtoScrollToID").offset().top)
    }, 2000);
});

22

โซลูชัน "animate" รุ่นกะทัดรัด

$.fn.scrollTo = function (speed) {
    if (typeof(speed) === 'undefined')
        speed = 1000;

    $('html, body').animate({
        scrollTop: parseInt($(this).offset().top)
    }, speed);
};

การใช้งานขั้นพื้นฐาน: $('#your_element').scrollTo();


21

นี่คือวิธีที่ฉันทำ

document.querySelector('scrollHere').scrollIntoView({ behavior: 'smooth' })

ทำงานได้ในเบราว์เซอร์ใด ๆ

สามารถห่อเป็นฟังก์ชันได้อย่างง่ายดาย

function scrollTo(selector) {
    document.querySelector(selector).scrollIntoView({ behavior: 'smooth' })
}

นี่คือตัวอย่างการทำงาน

$(".btn").click(function() {
  document.getElementById("scrollHere").scrollIntoView( {behavior: "smooth" })
})
.btn {margin-bottom: 500px;}
.middle {display: block; margin-bottom: 500px; color: red;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button class="btn">Scroll down</button>

<h1 class="middle">You see?</h1>

<div id="scrollHere">Arrived at your destination</div>

เอกสาร


6
ค่อนข้างสั้นและหวาน สิ่งหนึ่งที่ควรทราบ - ฉันคิดว่านี่เป็นเพียงเลื่อนลงในมุมมอง (อาจอยู่ที่ด้านล่างของวิวพอร์ต) แทนที่จะเลื่อนไปที่ด้านบนของวิวพอร์ตขณะที่การตั้งค่า scrollTop
OG ฌอน

20

ฉันรู้วิธีที่ไม่มี jQuery:

document.getElementById("element-id").scrollIntoView();

แก้ไข: สองปีแล้วและฉันยังคงได้รับชื่อเสียงจากการโพสต์นี้ lmao


18

focus()หากคุณเป็นเพียงการจัดการการเลื่อนไปเป็นองค์ประกอบการป้อนข้อมูลคุณสามารถใช้ ตัวอย่างเช่นหากคุณต้องการเลื่อนไปยังอินพุตแรกที่มองเห็นได้:

$(':input:visible').first().focus();

หรืออินพุตแรกที่มองเห็นได้ในคอนเทนเนอร์ที่มีคลาส.error:

$('.error :input:visible').first().focus();

ขอบคุณTricia Ball ที่ชี้ให้เห็นสิ่งนี้!


17

ด้วยโซลูชันนี้คุณไม่ต้องการปลั๊กอินใด ๆ และไม่จำเป็นต้องตั้งค่าใด ๆนอกเหนือจากการวางสคริปต์ไว้ด้านหน้า</body>แท็กปิดของคุณ

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

if ($(window.location.hash).length > 1) {
  $("html, body").animate({
    scrollTop: $(window.location.hash).offset().top
  }, 1000);
}

ในการโหลดหากมีแฮชในที่อยู่เราจะเลื่อนไปที่ที่อยู่นั้น

และ - เมื่อใดก็ตามที่คุณคลิกaลิงก์ที่มีhrefแฮชเช่น#topเราจะเลื่อนไปที่ลิงค์นั้น


นี่น่าจะเป็น> 1แทนที่จะเป็น0เพราะ/#บทนี้ทำให้สคริปต์แตก
Tallboy

คุณไม่ควรลงท้ายด้วยแฮช URL ว่างเปล่าในทางเทคนิคยกเว้นว่าลิงก์นั้นสร้างมาไม่ดี แต่เป็น TY (ถึงแม้ว่ารหัสเวอร์ชั่นของฉันเองจะมีแพตช์นี้รวมอยู่แล้ว ^^)
Jonathan

มีกระวนกระวายใจที่เกี่ยวข้องกับรหัสนี้ แต่มันสามารถแก้ไขได้อย่างง่ายดาย คุณต้องดำเนินการreturn false;เมื่อสิ้นสุดเหตุการณ์การคลิกเพื่อป้องกันการกระทำเริ่มต้น - เลื่อนไปที่จุดยึดทันที - ไม่เกิดขึ้น
roncli

2
@roncli จุดดี - หรือคุณสามารถทำได้e.preventDefault();
Jonathan

e.preventDefault()แต่จะไม่อัปเดตแฮชใน URL เมื่อคลิกมันจะเป็น URL ที่ไม่มีแฮชเสมอ
jayasurya_j

8

ในกรณีส่วนใหญ่การใช้ปลั๊กอินจะเป็นการดีที่สุด อย่างจริงจัง. ฉันจะชักชวนให้ซื้อเหมืองที่นี่ แน่นอนมีคนอื่นด้วย แต่โปรดตรวจสอบว่าพวกเขาหลีกเลี่ยงหลุมพรางที่คุณต้องการให้มีปลั๊กอินหรือไม่ - ไม่ใช่ทั้งหมด

ผมได้เขียนเกี่ยวกับสาเหตุของการใช้ปลั๊กอินอื่น ๆ สั้นซับหนึ่งหนุนคำตอบส่วนใหญ่ที่นี่

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

UX ไม่ดี

  • ภาพเคลื่อนไหวไม่ตอบสนองต่อการกระทำของผู้ใช้ มันยังคงดำเนินต่อไปแม้ว่าผู้ใช้จะคลิกแตะหรือพยายามเลื่อน

  • หากจุดเริ่มต้นของภาพเคลื่อนไหวใกล้กับองค์ประกอบเป้าหมายภาพเคลื่อนไหวจะช้าอย่างเจ็บปวด

  • หากองค์ประกอบเป้าหมายอยู่ใกล้ด้านล่างของหน้าจะไม่สามารถเลื่อนไปที่ด้านบนของหน้าต่างได้ ภาพเคลื่อนไหวการเลื่อนหยุดทันทีในการเคลื่อนไหวกลาง

เพื่อจัดการกับปัญหาเหล่านี้ (และพวงของคนอื่น ๆ ), คุณสามารถใช้ปลั๊กอินของฉันjQuery.scrollable การโทรจะกลายเป็น

$( window ).scrollTo( targetPosition );

และนั่นคือมัน แน่นอนว่ายังมีตัวเลือกมากขึ้น

เกี่ยวกับตำแหน่งเป้าหมาย$target.offset().topทำงานในกรณีส่วนใหญ่ แต่โปรดทราบว่าค่าที่ส่งคืนไม่ได้นำเส้นขอบของhtmlองค์ประกอบมาพิจารณา ( ดูตัวอย่างนี้ ) หากคุณต้องการตำแหน่งเป้าหมายให้มีความแม่นยำไม่ว่าในกรณีใด ๆ ก็จะดีกว่าที่จะใช้

targetPosition = $( window ).scrollTop() + $target[0].getBoundingClientRect().top;

ใช้งานได้แม้ว่าจะมีการกำหนดเส้นขอบของhtmlองค์ประกอบ


8

ภาพเคลื่อนไหว:

// slide to top of the page
$('.up').click(function () {
    $("html, body").animate({
        scrollTop: 0
    }, 600);
    return false;
});

// slide page to anchor
$('.menutop b').click(function(){
    //event.preventDefault();
    $('html, body').animate({
        scrollTop: $( $(this).attr('href') ).offset().top
    }, 600);
    return false;
});

// Scroll to class, div
$("#button").click(function() {
    $('html, body').animate({
        scrollTop: $("#target-element").offset().top
    }, 1000);
});

// div background animate
$(window).scroll(function () {

    var x = $(this).scrollTop();

    // freezze div background
    $('.banner0').css('background-position', '0px ' + x +'px');

    // from left to right
    $('.banner0').css('background-position', x+'px ' +'0px');

    // from right to left
    $('.banner0').css('background-position', -x+'px ' +'0px');

    // from bottom to top
    $('#skills').css('background-position', '0px ' + -x + 'px');

    // move background from top to bottom
    $('.skills1').css('background-position', '0% ' + parseInt(-x / 1) + 'px' + ', 0% ' + parseInt(-x / 1) + 'px, center top');

    // Show hide mtop menu  
    if ( x > 100 ) {
    $( ".menu" ).addClass( 'menushow' );
    $( ".menu" ).fadeIn("slow");
    $( ".menu" ).animate({opacity: 0.75}, 500);
    } else {
    $( ".menu" ).removeClass( 'menushow' );
    $( ".menu" ).animate({opacity: 1}, 500);
    }

});

// progres bar animation simple
$('.bar1').each(function(i) {
  var width = $(this).data('width');  
  $(this).animate({'width' : width + '%' }, 900, function(){
    // Animation complete
  });  
});

8

หากคุณต้องการเลื่อนภายในคอนเทนเนอร์ล้น (แทนที่จะ$('html, body')ตอบข้างบน) ทำงานด้วยการกำหนดตำแหน่งแบบสัมบูรณ์นี่คือวิธีทำ:

var elem = $('#myElement'),
    container = $('#myScrollableContainer'),
    pos = elem.position().top + container.scrollTop() - container.position().top;

container.animate({
  scrollTop: pos
}

7

วิธีง่ายๆในการเลื่อนหน้าเพื่อกำหนดรหัส div

var targetOffset = $('#divID').offset().top;
$('html, body').animate({scrollTop: targetOffset}, 1000);

6

นี่คือวิธีการของฉันสรุป ID และ href โดยใช้ตัวเลือกคลาสทั่วไป

$(function() {
  // Generic selector to be used anywhere
  $(".js-scroll-to").click(function(e) {

    // Get the href dynamically
    var destination = $(this).attr('href');

    // Prevent href=“#” link from changing the URL hash (optional)
    e.preventDefault();

    // Animate scroll to destination
    $('html, body').animate({
      scrollTop: $(destination).offset().top
    }, 500);
  });
});
<!-- example of a fixed nav menu -->
<ul class="nav">
  <li>
    <a href="#section-1" class="nav-item js-scroll-to">Item 1</a>
  </li>
  <li>
    <a href="#section-2" class="nav-item js-scroll-to">Item 2</a>
  </li>
  <li>
    <a href="#section-3" class="nav-item js-scroll-to">Item 3</a>
  </li>
</ul>


6

ปลั๊กอิน jQuery ที่กำหนดเองง่ายมากและใช้งานง่าย เพียงเพิ่มแอททริบิวscroll=ให้กับองค์ประกอบที่คลิกได้ของคุณและตั้งค่าเป็นตัวเลือกที่คุณต้องการเลื่อนไป

<a scroll="#product">Click me</a>เพื่อต้องการ: มันสามารถใช้กับองค์ประกอบใด ๆ

(function($){
    $.fn.animateScroll = function(){
        console.log($('[scroll]'));
        $('[scroll]').click(function(){
            selector = $($(this).attr('scroll'));
            console.log(selector);
            console.log(selector.offset().top);
            $('html body').animate(
                {scrollTop: (selector.offset().top)}, //- $(window).scrollTop()
                1000
            );
        });
    }
})(jQuery);

// RUN
jQuery(document).ready(function($) {
    $().animateScroll();
});

// IN HTML EXAMPLE
// RUN ONCLICK ON OBJECT WITH ATTRIBUTE SCROLL=".SELECTOR"
// <a scroll="#product">Click To Scroll</a>

4
var scrollTo = function($parent, $element) {
    var topDiff = $element.position().top - $parent.position().top;

    $parent.animate({
        scrollTop : topDiff
    }, 100);
};

4

$('html, body').animate(...) ไม่ได้สำหรับฉันบนเบราว์เซอร์ซาฟารี Chrome Android สำหรับ iPhone

ฉันต้องกำหนดเป้าหมายองค์ประกอบเนื้อหารากของหน้า

$ ( '# cotnent'). ภาพเคลื่อนไหว ( ... )

นี่คือสิ่งที่ฉันได้ลงเอยด้วย

if (navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/)) {           
    $('#content').animate({
    scrollTop: $("#elementtoScrollToID").offset().top
   }, 'slow');
}
else{
    $('html, body').animate({
    scrollTop: $("#elementtoScrollToID").offset().top
    }, 'slow');
}

เนื้อหาร่างกายทั้งหมดเชื่อมต่อกันด้วย div #content

<html>
....
<body>
<div id="content">
....
</div>
</body>
</html>

คุณไม่ควรใช้ตัวแทนผู้ใช้ในการดมกลิ่น webaim.org/blog/user-agent-string-history
Alex Podworny

เพิ่มตัวแบ่งคำ: ตัวแบ่งทั้งหมด; ถึงองค์ประกอบ CSS ของคุณที่มีปัญหา jQuery.animate webview Android / iOS ({scrollTop: y}) ตำแหน่งไม่ถูกต้อง medium.com/@ellery.leung/…
daliaessam

4

นี่คือคำตอบของ Atharva จาก: https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView ต้องการเพิ่มถ้าเอกสารของคุณอยู่ใน iframe คุณสามารถเลือกองค์ประกอบในเฟรมหลักเพื่อเลื่อนดู:

 $('#element-in-parent-frame', window.parent.document).get(0).scrollIntoView();

3
$('html, body').animate({scrollTop: 
  Math.min( 
    $(to).offset().top-margintop, //margintop is the margin above the target
    $('body')[0].scrollHeight-$('body').height()) //if the target is at the bottom
}, 2000);

3

เมื่อผู้ใช้คลิกที่อินพุตด้วย #subject หน้าควรเลื่อนไปที่องค์ประกอบสุดท้ายของหน้าด้วยภาพเคลื่อนไหวที่ดี ควรเลื่อนไปด้านล่างและไม่ไปด้านบน

รายการสุดท้ายของหน้าคือปุ่มส่งที่มี #submit

$('#subject').click(function()
{
    $('#submit').focus();
    $('#subject').focus();
});

สิ่งนี้จะเลื่อนลงมาก่อนเพื่อ#submitคืนค่าเคอร์เซอร์กลับไปเป็นอินพุตที่ถูกคลิกซึ่งเลียนแบบการเลื่อนลงและทำงานบนเบราว์เซอร์ส่วนใหญ่ นอกจากนี้ยังไม่จำเป็นต้องใช้ jQuery เนื่องจากสามารถเขียนด้วย JavaScript บริสุทธิ์

วิธีการใช้focusภาพเคลื่อนไหวเลียนแบบฟังก์ชั่นนี้สามารถทำได้ดีกว่าผ่านการรับfocusสาย ฉันไม่ได้ทดสอบทฤษฎีนี้ แต่มันจะมีลักษณะเช่นนี้:

<style>
  #F > *
  {
    width: 100%;
  }
</style>

<form id="F" >
  <div id="child_1"> .. </div>
  <div id="child_2"> .. </div>
  ..
  <div id="child_K"> .. </div>
</form>

<script>
  $('#child_N').click(function()
  {
    $('#child_N').focus();
    $('#child_N+1').focus();
    ..
    $('#child_K').focus();

    $('#child_N').focus();
  });
</script>

3

ฉันจะตั้งค่าโมดูลเลื่อนองค์ประกอบ npm install scroll-elementมันได้ผลเช่นนี้:

import { scrollToElement, scrollWindowToElement } from 'scroll-element'

/* scroll the window to your target element, duration and offset optional */
let targetElement = document.getElementById('my-item')
scrollWindowToElement(targetElement)

/* scroll the overflow container element to your target element, duration and offset optional */
let containerElement = document.getElementById('my-container')
let targetElement = document.getElementById('my-item')
scrollToElement(containerElement, targetElement)

เขียนด้วยความช่วยเหลือจากโพสต์ SO ดังต่อไปนี้:

นี่คือรหัส:

export const scrollToElement = function(containerElement, targetElement, duration, offset) {
  if (duration == null) { duration = 1000 }
  if (offset == null) { offset = 0 }

  let targetOffsetTop = getElementOffset(targetElement).top
  let containerOffsetTop = getElementOffset(containerElement).top
  let scrollTarget = targetOffsetTop + ( containerElement.scrollTop - containerOffsetTop)
  scrollTarget += offset
  scroll(containerElement, scrollTarget, duration)
}

export const scrollWindowToElement = function(targetElement, duration, offset) {
  if (duration == null) { duration = 1000 }
  if (offset == null) { offset = 0 }

  let scrollTarget = getElementOffset(targetElement).top
  scrollTarget += offset
  scrollWindow(scrollTarget, duration)
}

function scroll(containerElement, scrollTarget, duration) {
  let scrollStep = scrollTarget / (duration / 15)
  let interval = setInterval(() => {
    if ( containerElement.scrollTop < scrollTarget ) {
      containerElement.scrollTop += scrollStep
    } else {
      clearInterval(interval)
    }
  },15)
}

function scrollWindow(scrollTarget, duration) {
  let scrollStep = scrollTarget / (duration / 15)
  let interval = setInterval(() => {
    if ( window.scrollY < scrollTarget ) {
      window.scrollBy( 0, scrollStep )
    } else {
      clearInterval(interval)
    }
  },15)
}

function getElementOffset(element) {
  let de = document.documentElement
  let box = element.getBoundingClientRect()
  let top = box.top + window.pageYOffset - de.clientTop
  let left = box.left + window.pageXOffset - de.clientLeft
  return { top: top, left: left }
}

2

ในการแสดงองค์ประกอบทั้งหมด (ถ้าเป็นไปได้กับขนาดหน้าต่างปัจจุบัน):

var element       = $("#some_element");
var elementHeight = element.height();
var windowHeight  = $(window).height();

var offset = Math.min(elementHeight, windowHeight) + element.offset().top;
$('html, body').animate({ scrollTop: offset }, 500);

2

ฉันเขียนฟังก์ชันวัตถุประสงค์ทั่วไปที่เลื่อนไปยังวัตถุ jQuery ตัวเลือก CSS หรือค่าตัวเลข

ตัวอย่างการใช้งาน:

// scroll to "#target-element":
$.scrollTo("#target-element");

// scroll to 80 pixels above first element with class ".invalid":
$.scrollTo(".invalid", -80);

// scroll a container with id "#my-container" to 300 pixels from its top:
$.scrollTo(300, 0, "slow", "#my-container");

รหัสของฟังก์ชั่น:

/**
* Scrolls the container to the target position minus the offset
*
* @param target    - the destination to scroll to, can be a jQuery object
*                    jQuery selector, or numeric position
* @param offset    - the offset in pixels from the target position, e.g.
*                    pass -80 to scroll to 80 pixels above the target
* @param speed     - the scroll speed in milliseconds, or one of the
*                    strings "fast" or "slow". default: 500
* @param container - a jQuery object or selector for the container to
*                    be scrolled. default: "html, body"
*/
jQuery.scrollTo = function (target, offset, speed, container) {

    if (isNaN(target)) {

        if (!(target instanceof jQuery))
            target = $(target);

        target = parseInt(target.offset().top);
    }

    container = container || "html, body";
    if (!(container instanceof jQuery))
        container = $(container);

    speed = speed || 500;
    offset = offset || 0;

    container.animate({
        scrollTop: target + offset
    }, speed);
};

2

สำหรับสิ่งที่คุ้มค่านี่คือวิธีที่ฉันจัดการเพื่อให้บรรลุพฤติกรรมดังกล่าวสำหรับองค์ประกอบทั่วไปซึ่งสามารถอยู่ใน DIV ด้วยการเลื่อน ในกรณีของเราเราไม่ได้เลื่อนตัวเต็ม แต่เป็นองค์ประกอบเฉพาะที่มีการล้น: อัตโนมัติ; ภายในเค้าโครงที่ใหญ่ขึ้น

มันสร้างการป้อนข้อมูลปลอมของความสูงขององค์ประกอบเป้าหมายแล้วให้ความสำคัญกับมันและเบราว์เซอร์จะดูแลส่วนที่เหลือไม่ว่าลึกภายในลำดับชั้นที่เลื่อนได้คุณ ทำงานเหมือนจับใจ

var $scrollTo = $('#someId'),
inputElem = $('<input type="text"></input>');

$scrollTo.prepend(inputElem);
inputElem.css({
  position: 'absolute',
  width: '1px',
  height: $scrollTo.height()
});
inputElem.focus();
inputElem.remove();


2

jQuery(document).ready(function($) {
  $('a[href^="#"]').bind('click.smoothscroll',function (e) {
    e.preventDefault();
    var target = this.hash,
        $target = $(target);

    $('html, body').stop().animate( {
      'scrollTop': $target.offset().top-40
    }, 900, 'swing', function () {
      window.location.hash = target;
    } );
  } );
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<ul role="tablist">
  <li class="active" id="p1"><a href="#pane1" role="tab">Section 1</a></li>
  <li id="p2"><a href="#pane2" role="tab">Section 2</a></li>
  <li id="p3"><a href="#pane3" role="tab">Section 3</a></li>
</ul>

<div id="pane1"></div>
<div id="pane2"></div>
<div id="pane3"></div>


2

หนึ่งในสายการบิน

subject.onclick = e=> window.scroll({ top: submit.offsetTop, behavior: 'smooth'});


1
มันทำงานได้อย่างสมบูรณ์แบบ!
jjoselon

1

อัปเดตคำตอบเมื่อวันที่ 2019:

$('body').animate({
    scrollTop: $('#subject').offset().top - $('body').offset().top + $('body').scrollTop()
}, 'fast');

คุณควรเลือกตัวเลือกนี้สำหรับเนื้อความ: [document.documentElement, document.body] และไม่จำเป็นต้องมีเนื้อหาตรงข้ามในสมการ $ ('# subject'). offset (). top ก็เพียงพอแล้ว
ali6p
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.