ฉันจะทำให้ div stick ติดที่ด้านบนของหน้าจอได้อย่างไรเมื่อเลื่อนไปที่แล้ว?


305

ฉันต้องการสร้าง div ซึ่งตั้งอยู่ใต้บล็อกของเนื้อหา แต่เมื่อหน้าเว็บถูกเลื่อนพอที่จะติดต่อกับขอบเขตสูงสุดของมันได้รับการแก้ไขในสถานที่และเลื่อนด้วยหน้า


5
ตั้งแต่เดือนมิถุนายน 2014 ปลั๊กอิน jQuery Sticky-kitเป็นหนึ่งในตัวเลือกที่ง่ายที่สุดซึ่งเป็นอุปสรรคที่ต่ำมากในการเข้าและคุณสมบัติมากมาย สถานที่ที่เหมาะสำหรับการเริ่มต้นหากคุณกำลังมองหาวิธีที่ง่ายในการลงจากพื้นอย่างรวดเร็ว
user456584


32
การเพิ่ม CSS สามารถposition: sticky; top:0;ทำงานได้ในเบราว์เซอร์ส่วนใหญ่ในเดือนมกราคม 2017
Colin 't Hart

9
อึศักดิ์สิทธิ์นั่นposition: sticky;มันวิเศษมาก
tscizzle

คำตอบ:


259

คุณสามารถใช้ CSS เพียงแค่วางองค์ประกอบของคุณเป็นคงที่ :

.fixedElement {
    background-color: #c0c0c0;
    position:fixed;
    top:0;
    width:100%;
    z-index:100;
}

แก้ไข:คุณควรมีองค์ประกอบที่มีตำแหน่งที่แน่นอนเมื่อการเลื่อนการเลื่อนมาถึงองค์ประกอบแล้วควรเปลี่ยนเป็นคงที่และตำแหน่งบนสุดควรตั้งค่าเป็นศูนย์

คุณสามารถตรวจจับการเลื่อนด้านบนสุดของเอกสารด้วยฟังก์ชันscrollTop :

$(window).scroll(function(e){ 
  var $el = $('.fixedElement'); 
  var isPositionFixed = ($el.css('position') == 'fixed');
  if ($(this).scrollTop() > 200 && !isPositionFixed){ 
    $el.css({'position': 'fixed', 'top': '0px'}); 
  }
  if ($(this).scrollTop() < 200 && isPositionFixed){
    $el.css({'position': 'static', 'top': '0px'}); 
  } 
});

เมื่อการเลื่อนสโครลถึง 200 องค์ประกอบจะติดที่ด้านบนสุดของหน้าต่างเบราว์เซอร์เนื่องจากถูกวางเป็นค่าคงที่


4
ที่ไม่ได้รับสิ่งที่ฉันจะทำ ฉันต้องการให้องค์ประกอบเริ่มต้นที่ 200px ด้านล่างด้านบนของหน้า (เพื่อให้มีที่ว่างสำหรับเนื้อหาอื่น ๆ ) จากนั้นเมื่อผู้ใช้เลื่อนลงมาจะได้รับการแก้ไขที่ด้านบน
evanr

3
การแก้ไขของคุณเติมเต็มความต้องการของคำถามในขณะนี้ แต่คุณยังคงมีปัญหาเมื่อหน้าเลื่อนกลับไปที่ด้านบนอีกครั้ง คุณสามารถไปถึงองค์ประกอบ scrollTop เก็บไว้ที่ใดที่หนึ่งและเมื่อหน้าเว็บไปถึงตำแหน่งนั้นอีกครั้ง (เมื่อเลื่อนขึ้นไป) เปลี่ยน css กลับไปเป็นค่าเริ่มต้น ... น่าจะดีกว่าถ้าทำด้วย. สลับระดับแล้ว ...
Sander

9
นี่คือสิ่งที่ค่อนข้างมากเมื่อมี แต่ฉันไม่ต้องลบตำแหน่งคงที่เมื่อมีการเลื่อนหน้าต่างไปด้านบน if ($(this).scrollTop() < 200 && $el.css('position') == 'fixed') { $('.fixedElement').css({'position': 'static', 'top': '0px'}); }
ปั้นจั่น Petzold

1
@DerrickPetzold ฉันใส่ที่เป็นคำตอบที่รักสิ่งที่สำคัญ :)
MarioDS

1
new exampleเชื่อมโยงคุณให้เป็นไปอย่างสะอาดมากและชัดเจนว่าฉันจะไม่ได้เห็นมัน! -_-
sohaiby

245

คุณเคยเห็นตัวอย่างนี้ในหน้าปัญหาของ Google Code และ (เมื่อเร็ว ๆ นี้) ในหน้าแก้ไขของ Stack Overflow

คำตอบของ CMS จะไม่เปลี่ยนตำแหน่งเมื่อคุณเลื่อนกลับ นี่คือรหัสที่ขโมยมาจาก Stack Overflow:

function moveScroller() {
    var $anchor = $("#scroller-anchor");
    var $scroller = $('#scroller');

    var move = function() {
        var st = $(window).scrollTop();
        var ot = $anchor.offset().top;
        if(st > ot) {
            $scroller.css({
                position: "fixed",
                top: "0px"
            });
        } else {
            $scroller.css({
                position: "relative",
                top: ""
            });
        }
    };
    $(window).scroll(move);
    move();
}
<div id="sidebar" style="width:270px;"> 
  <div id="scroller-anchor"></div> 
  <div id="scroller" style="margin-top:10px; width:270px"> 
    Scroller Scroller Scroller
  </div>
</div>

<script type="text/javascript"> 
  $(function() {
    moveScroller();
  });
</script> 

และง่ายสาธิตสด

ทางเลือกใหม่ที่ไม่ใช้สคริปต์position: stickyซึ่งได้รับการสนับสนุนใน Chrome, Firefox และ Safari ดูบทความเกี่ยวกับ HTML5Rocksและการสาธิตและเอกสาร Mozilla


3
ด้วยเหตุผลบางอย่าง {scroll: false} ทำให้ฉันมีปัญหา (jQuery 1.6.2) ดูเหมือนว่าจะทำงานโดยไม่มีมัน แยกจากการสาธิตที่เชื่อมโยง ความคิดใด ๆ ถ้ามันมีวัตถุประสงค์?
Eddie

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

2
ดูเหมือนว่าจะทำงานได้ดีเมื่อฉันใช้ jQuery รุ่นเดียวกันกับตัวอย่าง (1.3.2) ในบางจุดที่offsetจะต้องมีการหยุดรับวัตถุเป็น input api.jquery.com/offset @Eddie การแก้ไขของคุณควรปลอดภัยด้วย jQuery ปัจจุบัน
แกรม

1
มีเหตุผลใดบ้างที่คุณไม่สามารถแทนที่var d = $("#scroller-anchor").offset().top;ด้วยvar d = $("#sidebar").offset().top;และกำจัด div scroller-anchor ที่ว่างเปล่าทั้งหมดเข้าด้วยกัน? นี่คือส้อมของฉันแสดงให้เห็นถึงสิ่งที่ฉันกำลังพูดถึง
Mike Deck

@ MikeDeck ฉันสงสัยว่าหากมีระยะขอบหรือช่องว่างภายในคุณต้องการควบคุมตำแหน่งที่ scroller อยู่เทียบกับภาชนะบรรจุ
Josh Lee

72

ตั้งแต่มกราคม 2017 และการเปิดตัว Chrome 56 เบราว์เซอร์ส่วนใหญ่ที่ใช้งานทั่วไปจะสนับสนุนposition: stickyคุณสมบัติใน CSS

#thing_to_stick {
  position: sticky;
  top: 0px;
}

เคล็ดลับสำหรับฉันใน Firefox และ Chrome

ใน Safari position: -webkit-stickyคุณยังคงต้องใช้

Polyfills พร้อมใช้งานสำหรับ Internet Explorer และ Edge https://github.com/wilddeer/stickyfillน่าจะดี


5
สิ่งนี้ได้รับการสนับสนุนในเบราว์เซอร์ส่วนใหญ่ที่ใช้กันทั่วไปในปัจจุบัน ดู caniuse.com/#feat=css-sticky ประการที่สองฉันชอบวิธีการแก้ปัญหามากซึ่งสามารถต้มโค้ดได้ถึง 2 บรรทัดในเวอร์ชันที่ต้องใช้ Javascript ที่กำหนดเอง และมันก็เป็นหลักฐานในอนาคตด้วย ใช้โพลีฟิลหากคุณกังวลเกี่ยวกับความเข้ากันได้ของเบราว์เซอร์
โคลิน 't ฮาร์ต

1
ไม่สามารถง่ายไปกว่านี้อีกแล้ว :)
mestarted

1
ฉันอยากจะเพิ่มความคิดเห็นนี้ที่เราสามารถดัชนี z: 99999 ;, เพราะถ้าไม่เมื่อมันไปด้านบนเนื้อหาอื่น ๆ จะถูกแสดงผลครั้งแรก แต่นี่ควรจะเป็นทางออกที่ได้รับการยอมรับ
dayanrr91

เพียงแค่ห่อมันใน div ด้วย id = "thing_to_stick"
แอนตัน

ทางออกที่ง่ายและสะดวก และทำงานได้ดีกว่าโซลูชันอื่น ๆ ในกรณีของฉันแน่นอน
fsevenm

33

ฉันมีปัญหาเช่นเดียวกับคุณและสิ้นสุดการสร้างปลั๊กอิน jQuery เพื่อดูแลมัน จริง ๆ แล้วมันแก้ปัญหาทั้งหมดที่ผู้คนมีอยู่ในรายการที่นี่รวมทั้งเพิ่มคุณสมบัติเพิ่มเติมบางอย่างเช่นกัน

ตัวเลือก

stickyPanelSettings = {
    // Use this to set the top margin of the detached panel.
    topPadding: 0,

    // This class is applied when the panel detaches.
    afterDetachCSSClass: "",

    // When set to true the space where the panel was is kept open.
    savePanelSpace: false,

    // Event fires when panel is detached
    // function(detachedPanel, panelSpacer){....}
    onDetached: null,

    // Event fires when panel is reattached
    // function(detachedPanel){....}
    onReAttached: null,

    // Set this using any valid jquery selector to 
    // set the parent of the sticky panel.
    // If set to null then the window object will be used.
    parentSelector: null
};

https://github.com/donnyv/sticky-panel

ตัวอย่าง: http://htmlpreview.github.io/?https://github.com/donnyv/sticky-panel/blob/master/jquery.stickyPanel/Main.htm


1
เฮ้! ขอบคุณ! นี่เป็นทางออกที่ยอดเยี่ยมและขอบคุณสำหรับการแบ่งปันแน่นอนช่วยให้ฉันประหยัดเวลาได้มาก นี่ควรเป็นโซลูชันที่ยอมรับโดยรวมสำหรับคำถามนี้เนื่องจากเท่าที่ฉันได้อ่านมันเป็นคำตอบที่สมบูรณ์ที่สุด โดยพื้นฐานแล้วคนอื่น ๆ ไม่ได้แก้ปัญหาด้วยตำแหน่ง X ดั้งเดิมของบล็อกหลังจากตำแหน่ง: สไตล์คงที่ถูกนำไปใช้ คุณแก้ปัญหานี้ ขอบคุณมากจริงๆ!
Marcos Buarque

สวัสดี Donny รักปลั๊กอินของคุณด้วย (v1.4.1) ... เจอปัญหาหนึ่งแล้วการบล็อกองค์ประกอบจะหายไปถ้าไม่มีใครระบุ ดังนั้นจึงเปลี่ยนเมื่อถอด ... เท่านั้นโดยการตั้งค่าความกว้างจึงยังคงเหมือนเดิม code// detach panel node.css ({"margin": 0, "left": nodeLeft, "top": newNodeTop, "position": "fixed", "width": node.width ()}); code
Will Hancock

มองหาและลองวิธีแก้ปัญหามากมายและสิ่งนี้ใช้งานได้ "ออกมานอกกรอบ" การทำงานที่น่าตื่นตาตื่นใจ! ขอบคุณ!
ajtatum

2
@WillHancock ฉันได้เพิ่มการสนับสนุน iPad แก้ไขข้อผิดพลาดในการรีเฟรชและเพิ่มในกิจกรรมที่ถูกลบ & onReattached กิจกรรมใหม่จะช่วยให้คุณสามารถเข้าถึงแผง & ตัวเว้นวรรคหลังจากที่แยกออกและติดตั้งใหม่แล้ว
Donny V.

4
เพิ่มตัวเลือก parentSelector เพื่อรองรับ divs การเลื่อน
Donny V.

24

และนี่คือวิธีที่ไม่มี jQuery (อัปเดต: ดูคำตอบอื่น ๆ ที่คุณสามารถทำได้ด้วย CSS เท่านั้น)

var startProductBarPos=-1;
window.onscroll=function(){
  var bar = document.getElementById('nav');
  if(startProductBarPos<0)startProductBarPos=findPosY(bar);

  if(pageYOffset>startProductBarPos){
    bar.style.position='fixed';
    bar.style.top=0;
  }else{
    bar.style.position='relative';
  }

};

function findPosY(obj) {
  var curtop = 0;
  if (typeof (obj.offsetParent) != 'undefined' && obj.offsetParent) {
    while (obj.offsetParent) {
      curtop += obj.offsetTop;
      obj = obj.offsetParent;
    }
    curtop += obj.offsetTop;
  }
  else if (obj.y)
    curtop += obj.y;
  return curtop;
}
* {margin:0;padding:0;}
.nav {
  border: 1px red dashed;
  background: #00ffff;
  text-align:center;
  padding: 21px 0;

  margin: 0 auto;
  z-index:10; 
  width:100%;
  left:0;
  right:0;
}

.header {
  text-align:center;
  padding: 65px 0;
  border: 1px red dashed;
}

.content {
  padding: 500px 0;
  text-align:center;
  border: 1px red dashed;
}
.footer {
  padding: 100px 0;
  text-align:center;
  background: #777;
  border: 1px red dashed;
}
<header class="header">This is a Header</header>
<div id="nav" class="nav">Main Navigation</div>
<div class="content">Hello World!</div>
<footer class="footer">This is a Footer</footer>


4
ขอบคุณ! เริ่มยากที่จะหาวิธีแก้ปัญหา JS ดั้งเดิม มันทำงานได้อย่างสมบูรณ์แบบ
Sherri

ขอบคุณมากมันใช้งานได้อย่างสมบูรณ์แบบเนื่องจาก jquery ขัดแย้งกับรหัสองค์กรดั้งเดิมที่โครงการของฉันมี
sng

แม้ว่าฉันจะพบปัญหาที่ถ้าฉันเลื่อนไปที่ด้านล่างของหน้ามันจะปรากฏขึ้นโดยอัตโนมัติฉันกลับไปที่ด้านบน
sng

@sng หน้าตัวอย่างของฉันทำเช่นนั้นหรือไม่
Jim W กล่าวว่าคืนสถานะโมนิก้า

@JimW ฉันพบปัญหาแล้ว ฉันพยายามใช้กับแถบเมนูตามแนวตั้งถัดจาก div เนื้อหาหลักทางซ้าย เกิดข้อผิดพลาดขณะเลื่อนลงเนื่องจากไม่สามารถระบุได้ว่าเมื่อใดที่กดปุ่มด้านล่างของหน้า ฉันลงเอยด้วยการเพิ่มบรรทัดของรหัสเพื่อตั้งค่าความสูง div คอนเทนเนอร์เป็นขนาดหน้าจอหน้าต่างไปยังฟังเหตุการณ์เลื่อน
sng

9

นี่คือวิธีที่ฉันทำกับ jquery ทั้งหมดนี้ถูกปูด้วยหินด้วยกันจากคำตอบที่หลากหลายเกี่ยวกับสแต็คล้น วิธีนี้จะแคชตัวเลือกเพื่อประสิทธิภาพที่เร็วขึ้นและยังแก้ปัญหา "การกระโดด" เมื่อ div ที่เหนียวกลายเป็นเหนียว

ลองดูที่ jsfiddle: http://jsfiddle.net/HQS8s/

CSS:

.stick {
    position: fixed;
    top: 0;
}

JS:

$(document).ready(function() {
    // Cache selectors for faster performance.
    var $window = $(window),
        $mainMenuBar = $('#mainMenuBar'),
        $mainMenuBarAnchor = $('#mainMenuBarAnchor');

    // Run this on scroll events.
    $window.scroll(function() {
        var window_top = $window.scrollTop();
        var div_top = $mainMenuBarAnchor.offset().top;
        if (window_top > div_top) {
            // Make the div sticky.
            $mainMenuBar.addClass('stick');
            $mainMenuBarAnchor.height($mainMenuBar.height());
        }
        else {
            // Unstick the div.
            $mainMenuBar.removeClass('stick');
            $mainMenuBarAnchor.height(0);
        }
    });
});

7

นี่คือตัวเลือกอื่น:

JAVASCRIPT

var initTopPosition= $('#myElementToStick').offset().top;   
$(window).scroll(function(){
    if($(window).scrollTop() > initTopPosition)
        $('#myElementToStick').css({'position':'fixed','top':'0px'});
    else
        $('#myElementToStick').css({'position':'absolute','top':initTopPosition+'px'});
});

คุณ#myElementToStickควรเริ่มต้นด้วยposition:absoluteคุณสมบัติ CSS


1
ฉันคิดว่านี่เป็นวิธีที่สะอาดและง่ายมาก ฉันจะไม่วางตำแหน่งองค์ประกอบ "เด็ดขาด" - สิ่งนี้อาจทำให้เค้าโครงแตก - ฉันเพิ่งตั้งให้เป็นแบบคงที่
Gerfried

4

ดังที่Josh LeeและColin 't Hartกล่าวไว้คุณสามารถเลือกที่จะใช้position: sticky; top: 0;กับ div ที่คุณต้องการเลื่อน ...

นอกจากนี้สิ่งเดียวที่คุณต้องทำคือคัดลอกสิ่งนี้ไว้ที่ด้านบนของหน้าหรือจัดรูปแบบเพื่อให้พอดีกับแผ่น CSS ภายนอก:

<style>
#sticky_div's_name_here { position: sticky; top: 0; }
</style>

เพียงแค่เปลี่ยน#sticky_div's_name_hereที่มีชื่อของ div ของคุณเช่นถ้า div ของคุณคุณจะใส่<div id="example">#example { position: sticky; top: 0; }


1

โซลูชันของฉันมีรายละเอียดเล็กน้อย แต่จัดการตำแหน่งที่เปลี่ยนแปลงได้จากขอบซ้ายสำหรับเค้าโครงที่อยู่กึ่งกลาง

// Ensurs that a element (usually a div) stays on the screen
//   aElementToStick   = The jQuery selector for the element to keep visible
global.makeSticky = function (aElementToStick) {
    var $elementToStick = $(aElementToStick);
    var top = $elementToStick.offset().top;
    var origPosition = $elementToStick.css('position');

    function positionFloater(a$Win) {
        // Set the original position to allow the browser to adjust the horizontal position
        $elementToStick.css('position', origPosition);

        // Test how far down the page is scrolled
        var scrollTop = a$Win.scrollTop();
        // If the page is scrolled passed the top of the element make it stick to the top of the screen
        if (top < scrollTop) {
            // Get the horizontal position
            var left = $elementToStick.offset().left;
            // Set the positioning as fixed to hold it's position
            $elementToStick.css('position', 'fixed');
            // Reuse the horizontal positioning
            $elementToStick.css('left', left);
            // Hold the element at the top of the screen
            $elementToStick.css('top', 0);
        }
    }

    // Perform initial positioning
    positionFloater($(window));

    // Reposition when the window resizes
    $(window).resize(function (e) {
        positionFloater($(this));
    });

    // Reposition when the window scrolls
    $(window).scroll(function (e) {
        positionFloater($(this));
    });
};

1

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

CSS:

.sticky { position:fixed; top:0; }

JQuery:

function make_sticky(id) {
    var e = $(id);
    var w = $(window);
    $('<div/>').insertBefore(id);
    $('<div/>').hide().css('height',e.outerHeight()).insertAfter(id);
    var n = e.next();
    var p = e.prev();
    function sticky_relocate() {
      var window_top = w.scrollTop();
      var div_top = p.offset().top;
      if (window_top > div_top) {
        e.addClass('sticky');
        n.show();
      } else {
        e.removeClass('sticky');
        n.hide();
      }
    }
    w.scroll(sticky_relocate);
    sticky_relocate();
}

ในการทำให้องค์ประกอบเหนียวให้ทำ:

make_sticky('#sticky-elem-id');

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


แนวทางของคุณคล้ายกับแนวทางของ JohnBมาก เมื่อพิจารณาถึงความแตกต่างของคำตอบนั้นฉันสงสัยว่า (1) มีข้อได้เปรียบในการใช้ "ตัวช่วย div" ตัวที่สอง (แทนที่จะเป็น 1 อย่างที่ JohnB ใช้) และ (2) มีข้อดีในการใช้ hide () หรือไม่ show () แทนที่จะตั้งค่าความสูงของผู้ช่วย (เช่น JohnB ทำ) บางทีความแตกต่างด้านประสิทธิภาพหรือไม่ จนถึงตอนนี้ฉันยังไม่สามารถแยกแยะความแตกต่างได้ แต่บางทีสถานการณ์บางอย่างอาจมีความแตกต่าง (เช่นอาจเกี่ยวข้องกับองค์ประกอบแบบอินไลน์หรือบางอย่าง) ดังนั้นฉันจึงถาม ขอบคุณ
Jason Frank

1

นี่คือเวอร์ชั่นเพิ่มเติมสำหรับคำตอบของ Josh Lee หากคุณต้องการให้ div อยู่ในแถบด้านข้างทางขวาและลอยภายในช่วง (เช่นคุณต้องระบุตำแหน่งจุดยึดด้านบนและด้านล่าง) นอกจากนี้ยังแก้ไขข้อผิดพลาดเมื่อคุณดูสิ่งนี้บนอุปกรณ์มือถือ (คุณต้องตรวจสอบตำแหน่งเลื่อนด้านซ้ายมิฉะนั้น div จะย้ายออกจากหน้าจอ)

function moveScroller() {
    var move = function() {
        var st = $(window).scrollTop();
        var sl = $(window).scrollLeft();
        var ot = $("#scroller-anchor-top").offset().top;
        var ol = $("#scroller-anchor-top").offset().left;
        var bt = $("#scroller-anchor-bottom").offset().top;
        var s = $("#scroller");
        if(st > ot) {
            if (st < bt - 280) //280px is the approx. height for the sticky div
            {
                s.css({
                    position: "fixed",
                    top: "0px",
                    left: ol-sl
                }); 
            }
            else
            {
                s.css({
                    position: "fixed",
                    top: bt-st-280,
                    left: ol-sl
                }); 
            }
        } else {
            s.css({
                position: "relative",
                top: "",
                left: ""
            });

        }
    };
    $(window).scroll(move);
    move();
}

1

ฉันเจอสิ่งนี้เมื่อค้นหาสิ่งเดียวกัน ฉันรู้ว่ามันเป็นคำถามเก่า แต่ฉันคิดว่าฉันจะให้คำตอบล่าสุด

Scrollorama มีคุณสมบัติ 'ปักหมุด' ซึ่งเป็นสิ่งที่ฉันกำลังมองหา

http://johnpolacek.github.io/scrollorama/


0

ข้อมูลที่ให้ไว้เพื่อตอบคำถามอื่นอาจช่วยคุณได้อีวาน:

ตรวจสอบว่าองค์ประกอบสามารถมองเห็นได้หลังจากการเลื่อน

โดยทั่วไปคุณต้องการแก้ไขสไตล์ขององค์ประกอบเพื่อกำหนดให้คงที่หลังจากตรวจสอบแล้วว่าค่า document.body.scrollTop เท่ากับหรือสูงกว่าส่วนบนขององค์ประกอบของคุณ


0

คำตอบที่ยอมรับใช้งานได้ แต่ไม่ย้ายกลับไปยังตำแหน่งก่อนหน้าถ้าคุณเลื่อนไปด้านบน มันติดอยู่ด้านบนเสมอหลังจากวางไว้ที่นั่น

  $(window).scroll(function(e) {
    $el = $('.fixedElement');
    if ($(this).scrollTop() > 42 && $el.css('position') != 'fixed') {
      $('.fixedElement').css( 'position': 'fixed', 'top': '0px');

    } else if ($(this).scrollTop() < 42 && $el.css('position') != 'relative') {
      $('.fixedElement').css( 'relative': 'fixed', 'top': '42px');
//this was just my previous position/formating
    }
  });

คำตอบของ jleedev จะใช้ได้ แต่ฉันไม่สามารถทำงานได้ หน้าตัวอย่างของเขาก็ใช้ไม่ได้ (สำหรับฉัน)


0

คุณสามารถเพิ่ม 3 แถวพิเศษได้ดังนั้นเมื่อผู้ใช้เลื่อนกลับไปด้านบน div จะติดอยู่ที่เดิม:

นี่คือรหัส:

if ($(this).scrollTop() < 200 && $el.css('position') == 'fixed'){
    $('.fixedElement').css({'position': 'relative', 'top': '200px'});
}

0

ฉันมีการตั้งค่าลิงก์ใน div ดังนั้นจึงเป็นรายการแนวตั้งของตัวอักษรและลิงก์จำนวน

#links {
    float:left;
    font-size:9pt;
    margin-left:0.5em;
    margin-right:1em;
    position:fixed;
    text-align:center;
    width:0.8em;
}

จากนั้นฉันตั้งค่าฟังก์ชั่น jQuery ที่ใช้งานง่ายนี้เพื่อบันทึกตำแหน่งที่โหลดแล้วเปลี่ยนตำแหน่งเป็นคงที่เมื่อเลื่อนไปไกลกว่าตำแหน่งนั้น

หมายเหตุ: ใช้งานได้เฉพาะในกรณีที่ลิงค์ปรากฏในการโหลดหน้าเว็บ !!

var listposition=false;
jQuery(function(){
     try{
        ///// stick the list links to top of page when scrolling
        listposition = jQuery('#links').css({'position': 'static', 'top': '0px'}).position();
        console.log(listposition);
        $(window).scroll(function(e){
            $top = $(this).scrollTop();
            $el = jQuery('#links');
            //if(typeof(console)!='undefined'){
            //    console.log(listposition.top,$top);
            //}
            if ($top > listposition.top && $el.css('position') != 'fixed'){
                $el.css({'position': 'fixed', 'top': '0px'});
            }
            else if ($top < listposition.top && $el.css('position') == 'fixed'){
                $el.css({'position': 'static'});
            }
        });

    } catch(e) {
        alert('Please vendor admin@mydomain.com (Myvendor JavaScript Issue)');
    }
});

0

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

รหัส jsfuddle

function scrollErrorMessageToTop() {
    var flash_error = jQuery('#flash_error');
    var flash_position = flash_error.position();

    function lockErrorMessageToTop() {
        var place_holder = jQuery("#place_holder");
        if (jQuery(this).scrollTop() > flash_position.top && flash_error.attr("position") != "fixed") {
            flash_error.css({
                'position': 'fixed',
                'top': "0px",
                "width": flash_error.width(),
                "z-index": "1"
            });
            place_holder.css("display", "");
        } else {
            flash_error.css('position', '');
            place_holder.css("display", "none");
        }

    }
    if (flash_error.length > 0) {
        lockErrorMessageToTop();

        jQuery("#flash_error").after(jQuery("<div id='place_holder'>"));
        var place_holder = jQuery("#place_holder");
        place_holder.css({
            "height": flash_error.height(),
            "display": "none"
        });
        jQuery(window).scroll(function(e) {
            lockErrorMessageToTop();
        });
    }
}
scrollErrorMessageToTop();​

นี่เป็นวิธีการเลื่อนแบบไดนามิกเล็กน้อย มันจำเป็นต้องใช้งานบ้างและฉันก็จะทำสิ่งนี้ให้กลายเป็นปลั๊กอิน แต่นี่คือสิ่งที่ฉันเกิดขึ้นหลังเลิกงาน



0

ไม่ใช่ทางออกที่แน่นอน แต่เป็นทางเลือกที่ดีในการพิจารณา

นี้CSS เฉพาะด้านบนของแถบเลื่อนหน้าจอ แก้ไขปัญหาทั้งหมดด้วยCSS เท่านั้น , ไม่มี JavaScript, NO JQuery, ไม่มีสมองทำงาน ( lol )

สนุกกับซอของฉัน : D รหัสทั้งหมดรวมอยู่ในนั้น :)

CSS

#menu {
position: fixed;
height: 60px;
width: 100%;
top: 0;
left: 0;
border-top: 5px solid #a1cb2f;
background: #fff;
-moz-box-shadow: 0 2px 3px 0px rgba(0, 0, 0, 0.16);
-webkit-box-shadow: 0 2px 3px 0px rgba(0, 0, 0, 0.16);
box-shadow: 0 2px 3px 0px rgba(0, 0, 0, 0.16);
z-index: 999999;
}

.w {
    width: 900px;
    margin: 0 auto;
    margin-bottom: 40px;
}<br type="_moz">

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

CSS เท่านั้นด้านบนสุดของแถบเลื่อนหน้าจอ


แตกต่างเล็กน้อย;)
Tokk

ฉันไม่ได้เป็นทางออกที่ดี แต่รหัสในคำตอบของคุณเป็นวิธีที่จะทำให้เมนูเหมือนติดอยู่ด้านบนเสมอ แต่นั่นไม่ใช่คำถาม ...
Tokk

คุณเพียงแค่แก้ไข div และไม่ทำอะไรที่ยากในการเลื่อน
yogihosting

0

นี่คือตัวอย่างที่ใช้ปลั๊กอิน jQuery มองเห็น: http://jsfiddle.net/711p4em4/

HTML:

<div class = "wrapper">
    <header>Header</header>
    <main>
        <nav>Stick to top</nav>
        Content
    </main>
    <footer>Footer</footer>
</div>

CSS:

* {
    margin: 0;
    padding: 0;
}

body {
    background-color: #e2e2e2;
}

.wrapper > header,
.wrapper > footer {
    font: 20px/2 Sans-Serif;
    text-align: center;
    background-color: #0040FF;
    color: #fff;
}

.wrapper > main {
    position: relative;
    height: 500px;
    background-color: #5e5e5e;
    font: 20px/500px Sans-Serif;
    color: #fff;
    text-align: center;
    padding-top: 40px;
}

.wrapper > main > nav {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    font: 20px/2 Sans-Serif;
    color: #fff;
    text-align: center;
    background-color: #FFBF00;
}

.wrapper > main > nav.fixed {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
}

JS (รวมถึงปลั๊กอินที่มองเห็นได้ด้วย jquery):

(function($){

    /**
     * Copyright 2012, Digital Fusion
     * Licensed under the MIT license.
     * http://teamdf.com/jquery-plugins/license/
     *
     * @author Sam Sehnert
     * @desc A small plugin that checks whether elements are within
     *       the user visible viewport of a web browser.
     *       only accounts for vertical position, not horizontal.
     */
    var $w = $(window);
    $.fn.visible = function(partial,hidden,direction){

        if (this.length < 1)
            return;

        var $t        = this.length > 1 ? this.eq(0) : this,
            t         = $t.get(0),
            vpWidth   = $w.width(),
            vpHeight  = $w.height(),
            direction = (direction) ? direction : 'both',
            clientSize = hidden === true ? t.offsetWidth * t.offsetHeight : true;

        if (typeof t.getBoundingClientRect === 'function'){

            // Use this native browser method, if available.
            var rec = t.getBoundingClientRect(),
                tViz = rec.top    >= 0 && rec.top    <  vpHeight,
                bViz = rec.bottom >  0 && rec.bottom <= vpHeight,
                lViz = rec.left   >= 0 && rec.left   <  vpWidth,
                rViz = rec.right  >  0 && rec.right  <= vpWidth,
                vVisible   = partial ? tViz || bViz : tViz && bViz,
                hVisible   = partial ? lViz || rViz : lViz && rViz;

            if(direction === 'both')
                return clientSize && vVisible && hVisible;
            else if(direction === 'vertical')
                return clientSize && vVisible;
            else if(direction === 'horizontal')
                return clientSize && hVisible;
        } else {

            var viewTop         = $w.scrollTop(),
                viewBottom      = viewTop + vpHeight,
                viewLeft        = $w.scrollLeft(),
                viewRight       = viewLeft + vpWidth,
                offset          = $t.offset(),
                _top            = offset.top,
                _bottom         = _top + $t.height(),
                _left           = offset.left,
                _right          = _left + $t.width(),
                compareTop      = partial === true ? _bottom : _top,
                compareBottom   = partial === true ? _top : _bottom,
                compareLeft     = partial === true ? _right : _left,
                compareRight    = partial === true ? _left : _right;

            if(direction === 'both')
                return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop)) && ((compareRight <= viewRight) && (compareLeft >= viewLeft));
            else if(direction === 'vertical')
                return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop));
            else if(direction === 'horizontal')
                return !!clientSize && ((compareRight <= viewRight) && (compareLeft >= viewLeft));
        }
    };

})(jQuery);

$(function() {
    $(window).scroll(function() {
        $(".wrapper > header").visible(true) ?
            $(".wrapper > main > nav").removeClass("fixed") :
            $(".wrapper > main > nav").addClass("fixed");
    });
});

-1

เหนียวจนส่วนท้ายกระทบ div:

function stickyCostSummary() {
    var stickySummary = $('.sticky-cost-summary');
    var scrollCostSummaryDivPosition = $(window).scrollTop();
    var footerHeight = $('#footer').height();
    var documentHeight = $(document).height();
    var costSummaryHeight = stickySummary.height();
    var headerHeight = 83;
    var footerMargin = 10;
    var scrollHeight = 252;
    var footerPosition = $('#footer').offset().top;

    if (scrollCostSummaryDivPosition > scrollHeight && scrollCostSummaryDivPosition <= (documentHeight - footerHeight - costSummaryHeight - headerHeight - footerMargin)) {
        stickySummary.removeAttr('style');
        stickySummary.addClass('fixed');

    } else if (scrollCostSummaryDivPosition > (documentHeight - footerHeight - costSummaryHeight - headerHeight - footerMargin)) {
        stickySummary.removeClass('fixed');
        stickySummary.css({
          "position" : "absolute",
          "top" : (documentHeight - footerHeight - costSummaryHeight - headerHeight - footerMargin - scrollHeight) + "px"
      });
    } else {
        stickySummary.removeClass('fixed');
        stickySummary.css({
            "position" : "absolute",
            "top" : "0"
        });
    }
}

$window.scroll(stickyCostSummary);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.