Ekrana kaydırıldıktan sonra ekranın üstüne bir div stick nasıl yapabilirim?


305

Bir içerik bloğunun altında bulunan bir div oluşturmak istiyorum, ancak sayfa üst sınırıyla temas edecek kadar kaydırıldığında, yerine sabitlenir ve sayfa ile kaydırılır.


5
Haziran 2014 itibariyle, Sticky-kit jQuery eklentisi , giriş ve çok sayıda özellik için son derece düşük bir bariyer sağlayan en kolay seçeneklerden biridir. Hızlı bir şekilde yerden kurtulmak için kolay bir yol arıyorsanız başlamak için harika bir yer.
user456584


32
CSS eklemek position: sticky; top:0;Ocak 2017'de çoğu tarayıcıda çalışır.
Colin 't Hart

9
Kutsal saçmalık, o position: sticky;şey büyülü.
tscizzle

Yanıtlar:


259

Öğenizi sabit olarak konumlandırarak css komutunu kullanabilirsiniz :

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

Düzenleme: Öğeyi mutlak konuma sahip olmalısınız, kaydırma ofseti öğeye ulaştığında sabit olarak değiştirilmeli ve üst konum sıfıra ayarlanmalıdır.

ScrollTop işleviyle belgenin üst kaydırma ofsetini algılayabilirsiniz :

$(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'}); 
  } 
});

Kaydırma ofseti 200'e ulaştığında, öğe sabit olarak yerleştirildiği için tarayıcı penceresinin üstüne yapışacaktır .


4
ne istediğimi başarmaz. Elemanın sayfanın üst kısmından 200 piksel altında başlamasını istiyorum (diğer içeriğe yer açmak için) ve sonra kullanıcı aşağı kaydırıldığında üstte sabit hale gelir.
evanr

3
düzenlemeniz gerçekten sorunun ihtiyaçlarını karşılıyor ancak sayfa tekrar en üste geldiğinde hala bir sorununuz var. scrollTop öğesine ulaştıktan sonra bir yerde saklayabilirsiniz ve sayfa tekrar bu konuma geldiğinde (yukarı kaydırırken) css'yi varsayılana geri döndürün ... muhtemelen bunu bir .toggleClass ile yapmak daha iyidir ...
Sander

9
Bu hemen hemen ne ile ne olduğunu ama pencerenin üstüne geri kaydırıldığında sabit konumlandırma kaldırmak zorunda kaldı. if ($(this).scrollTop() < 200 && $el.css('position') == 'fixed') { $('.fixedElement').css({'position': 'static', 'top': '0px'}); }
Derrick Petzold

1
@DerrickPetzold Cevabın içine koydum, oldukça önemli şeyler :)
MarioDS

1
new exampleVerdiğin bağlantı çok temiz ve berrak ben bile göremiyorum ki! -_-
sohaiby

245

Bu örneği Google Code'un sorun sayfasında ve (yalnızca son zamanlarda) Stack Overflow'ın düzenleme sayfasında gördünüz .

Geri gittiğinizde CMS'nin yanıtı konumlandırmayı geri döndürmez. Stack Overflow'un utanmazca çalınan kodu:

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> 

Ve basit bir canlı demo .

position: stickyChrome, Firefox ve Safari'de desteklenen yeni, komut dosyası içermeyen bir alternatiftir . HTML5Rocks ve demo ile Mozilla belgeleri hakkındaki makaleye bakın .


3
Bazı nedenlerden dolayı, {scroll: false} bana sorunlar veriyordu (jQuery 1.6.2). Onsuz çalışıyor gibi görünüyor. Bağlı demo çatal . Bir amaca hizmet edip etmediği hakkında bir fikrin var mı?
Eddie

Bu konuda bir sürü sorun yaşıyorum, hayatım için çoğaltamıyorum, hatta canlı demosu çoğaltmaya çalıştım ve çalışmıyor. Herkes adım adım talimatlar sağlayan bir öğretici bağlantı olabilir?
Trevor Dupp

2
Demo (1.3.2) ile aynı jQuery sürümünü kullandığımda, bu iyi çalışıyor gibi görünüyor. Bir noktada api.jquery.com/offsetoffset girdisi olarak bir nesneyi kabul etmeyi durdurmuş olmalıdır . @Eddie Değişikliğiniz mevcut jQuery ile güvenli olmalıdır.
Graeme

1
Değiştirmek olamazdı bir neden var mı var d = $("#scroller-anchor").offset().top;ile var d = $("#sidebar").offset().top;ve hep birlikte boş kaydirac çapa div kurtulmak? İşte benim neden bahsettiğimi gösteren çatalım .
Mike Deck

@MikeDeck Kenar boşlukları veya dolgu varsa, kaydırma çubuğunun konteynere göre nerede konumlandığını kontrol etmek istediğinizden şüpheleniyorum.
Josh Lee

72

Ocak 2017 ve Chrome 56'nın piyasaya sürülmesinden itibaren, ortak kullanımdaki çoğu tarayıcı CSS'deki position: stickymülkü desteklemektedir .

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

Firefox ve Chrome'da benim için hile yapıyor.

Safari'de hala kullanmanız gerekiyor position: -webkit-sticky.

Çoklu dolgular Internet Explorer ve Edge için kullanılabilir; https://github.com/wilddeer/stickyfill iyi bir şey gibi görünüyor.


5
Bu, günümüzde yaygın olarak kullanılan çoğu tarayıcıda desteklenmektedir. Bkz. Caniuse.com/#feat=css-sticky İkincisi, çok özel Javascript gerektiren bir sürüme 2 satır kod kadar kaynatılabilen bir çözümü tercih ederim. Ve bu da geleceğe hazır. Tarayıcı uyumluluğu konusunda endişeleriniz varsa bir çoklu dolgu kullanın.
Colin 't Hart

1
Bundan daha kolay olamaz :)
mestarted

1
Z-index: 99999; yapabileceğimiz bu yoruma eklemek isterim, çünkü eğer zirveye çıkmazsa, diğer içerik önce işlenecektir. Ancak bu kabul edilen çözüm olmalıdır.
dayanrr91

Sadece id = "thing_to_stick" ile bir div içinde kaydırın
Anton

Basit ve kolay bir çözüm. Ve benim durumumda diğer çözümlerden daha iyi çalışıyor.
fsevenm

33

Sizinle aynı sorunu yaşadım ve ilgilenmek için bir jQuery eklentisi hazırladım. Aslında insanların burada listelediği tüm sorunları çözüyor, ayrıca birkaç isteğe bağlı özellik de ekliyor.

Seçenekler

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

demo: http://htmlpreview.github.io/?https://github.com/donnyv/sticky-panel/blob/master/jquery.stickyPanel/Main.htm


1
Hey! Teşekkür ederim! Bu harika bir çözüm ve paylaştığınız için teşekkürler, kesinlikle çok zaman kazandım. Bu, bu soru için kabul edilen genel çözüm olmalıdır, çünkü okuduğum kadarıyla, en eksiksiz çözümdür. Temel olarak, diğerleri konumdan sonra bir bloğun orijinal X-konumu ile sorunu çözmedi: sabit stil uygulandı. Sizinki bu sorunu çözüyor. Gerçekten, çok teşekkürler!
Marcos Buarque

Hey Donny, eklentinizi de sevin (v1.4.1) ... bir sorunla karşılaştı, hiçbiri belirtilmezse Block elelments genişliklerini kaybetti. Sökürken çok değişti ... sadece genişliği aynı kalacak şekilde ayarlayarak. code// panel node.css ({"margin": 0, "left": nodeLeft, "top": newNodeTop, "position": "fixed", "width": node.width ()}); code
Will Hancock

Birçok çözüm aradı ve denedi, ve bu "kutudan çıkar çıkmaz" çalıştı. Harika iş! Teşekkür ederim!
ajtatum

2
@WillHancock iPad desteği ekledim, yenileme hatasını düzelttim ve Ayrıntılı & onReattached etkinliklerine ekledim. Yeni olaylar, ayrıldıktan ve yeniden takıldıktan sonra panel ve ara paneline erişmenizi sağlar.
Donny V.Kasım

4
Ayrıca kaydırma div'lerini desteklemek için parentSelector seçeneği eklendi.
Donny V.

24

Ve nasıl jquery olmadan (GÜNCELLEME: şimdi sadece CSS ile yapabileceğiniz diğer cevaplara bakın)

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
Teşekkür ederim! Bugünlerde yerel JS çözümleri bulmak zorlaşıyor. Bu mükemmel çalıştı.
Sherri

Çok teşekkür ederim, jquery projemdeki bazı eski kurumsal kodla çakıştığı için bu mükemmel çalıştı
sng

Ben sayfanın altına kaydırırsanız otomatik olarak üst beni geri pop bir sorun yaşıyorum rağmen.
sng

@sng Örnek sayfam bunu yapıyor mu?
Jim W, Monica'yı

@JimW Sorunu öğrendim. Soldaki ana içerik div yanında dikey tabanlı bir menü çubuğu ile kullanmaya çalışıyordu. Sayfanın altına ne zaman düzgün şekilde vurduğunu belirleyemediğinden aşağı kaydırdığınızda hata oluşuyordu. Kapsayıcı div yüksekliğini kaydırma olayı dinleyicisine pencere ekran boyutuna ayarlamak için bir kod satırı
ekledim

9

Ben jquery ile böyle yaptım. Tüm bunlar yığın taşması üzerindeki çeşitli cevaplardan birlikte kaldırıldı. Bu çözüm daha hızlı performans için seçicileri önbelleğe alır ve ayrıca yapışkan div yapışkan hale geldiğinde "atlama" sorununu çözer.

Jsfiddle üzerinde göz atın: 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

İşte başka bir seçenek:

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

Sizin #myElementToStickile başlamalıdır position:absoluteCSS özelliği.


1
Bence bu çok temiz ve kolay bir çözüm. Ben sadece "mutlak" eleman konumlandırmak olmaz - Bu düzeni bozabilir - Ben sadece statik olarak ayarlayın.
Gerfried

4

As Josh Lee ve Hart t Colin' söylediler, isteğe bağlı olarak sadece kullanabilirsiniz position: sticky; top: 0;en kaydırma istediğiniz div müracaat ...

Ayrıca, yapmanız gereken tek şey bunu sayfanızın üstüne kopyalamak veya harici bir CSS sayfasına sığacak şekilde biçimlendirmektir:

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

Sadece div'inizin #sticky_div's_name_hereadıyla değiştirin , yani div'iniz <div id="example">olsaydı #example { position: sticky; top: 0; }.


1

Benim çözümüm biraz ayrıntılı, ama ortalanmış düzenler için sol kenardan değişken konumlandırma işler.

// 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

İşte diğerleriyle sorunları olanları denemek için bir sürüm daha. Bu yinelenen soruda tartışılan teknikleri bir araya getirir ve gerekli yardımcı DIV'leri dinamik olarak üretir, böylece fazladan HTML gerekmez.

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

Bir öğeyi yapışkan hale getirmek için şunları yapın:

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

Eleman yapışkan hale geldiğinde, kod yapışkan içeriğin bıraktığı boşluğa atlamasını önlemek için kalan içeriğin konumunu yönetir. Ayrıca, üzerine geri kaydırırken yapışkan öğeyi orijinal yapışkan olmayan konumuna geri döndürür.


Yaklaşımınız JohnB'nin yaklaşımına çok benziyor . Bu cevaba olan farklarınızı göz önünde bulundurursak, merak ediyorum (1) İkinci bir "yardımcı div" (JohnB'nin kullandığı gibi sadece 1 yerine) kullanmanın bir avantajı var mı, ve (2) hide () kullanmanın bir avantajı var mı ve show () sadece yardımcı div yüksekliğini ayarlamak yerine (JohnB gibi)? Belki de bir performans farkı? Şimdiye kadar farklılıkları ayırt edemedim, ancak belki de belirli senaryoların farklılıkları olabilir (belki satır içi öğeleri veya bir şeyi dahil etmek gibi), bu yüzden soruyorum. Teşekkürler.
Jason Frank

1

Josh Lee'nin cevabı için genişletilmiş bir versiyon. Div'in sağ taraftaki kenar çubuğunda olmasını ve bir aralık içinde yüzmesini istiyorsanız (yani, üst ve alt bağlantı konumlarını belirtmeniz gerekir). Ayrıca bunu mobil cihazlarda görüntülediğinizde bir hatayı düzeltir (sol kaydırma konumunu kontrol etmeniz gerekir, aksi takdirde div ekrandan çıkar).

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



0

Kabul edilen cevap çalışır, ancak üzerine kaydırırsanız önceki konuma geri gitmez. Oraya yerleştirildikten sonra her zaman tepeye yapışır.

  $(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'in cevabı kim işe yarayabilir, ama işe yarayamadım. Örnek sayfası da işe yaramadı (benim için).


0

3 ekstra satır ekleyebilirsiniz, böylece kullanıcı en üste geri döndüğünde div eski yerine yapışır:

İşte kod:

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

0

Bir div içinde bağlantılar kurulum var, bu yüzden harf ve sayı bağlantılarının dikey bir listesi.

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

Daha sonra yüklenen konumu kaydetmek için bu kullanışlı jQuery işlevini ayarladım ve ardından bu konumun ötesine geçerken konumu sabit olarak değiştirdim.

NOT: Bu yalnızca bağlantılar sayfa yüklemesinde görünürse çalışır !!

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

Bu teknolojiyi oluşturmak için yukarıdaki çalışmalardan bazılarını kullandım. Biraz geliştirdim ve çalışmamı paylaşacağımı düşündüm. Bu yardımcı olur umarım.

jsfuddle Kodu

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();​

Bu kaydırma yapmak için biraz daha dinamik. Biraz çalışma gerektiriyor ve bir noktada bunu bir tıkaç haline getireceğim, ancak bu, bir saatlik çalışmadan sonra bulduğum şeydi.


0

Javascript'te şunları yapabilirsiniz:

var element = document.getElementById("myid");
element.style.position = "fixed";
element.style.top = "0%";

0

Kesin bir çözüm değil, dikkate alınması gereken harika bir alternatif

SADECE bu CSS Ekran kaydırma çubuğunun üstünde . SADECE CSS , NO JavaScript, NO JQuery, No Brain work ( lol ) ile tüm sorunu çözdü .

Benim keman keyfini çıkarın : D tüm kodları orada dahil :)

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">

İçeriği burada görebilmek için yeterince uzun koyun :) Oh, ve referansı da orada, çünkü kredisini hak ediyor

YALNIZCA CSS Ekranın üst kısmındaki kaydırma çubuğu


Biraz offtopik;)
Tokk

Ben iyi bir çözüm karşı değilim, ama cevabınızdaki kod her zaman üstüne yapışmak için bir menü gibi bir şey yapmak için bir yol sağlar. Ama soru bu değildi ...
Tokk

sadece div'ı düzeltiyorsunuz ve kaydırma konusunda yapışkan bir şey yapmıyorsunuz.
yogihosting

0

İşte jquery-görünür eklentiyi kullanan bir örnek: 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-görünür eklentiyi içerir):

(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

altbilgi div isabet kadar yapışkan:

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