2010-12-07 34 views
14

J'ai un div dont j'ai besoin d'être fixé au bas de l'écran, jusqu'à ce qu'il atteigne un point après le défilement et s'arrête là et reste. Si un utilisateur commence à défiler vers le haut, rétablissez-le après avoir passé ce même point.Comment faire pour planer un élément fixe jusqu'à ce qu'il atteigne un certain point

Des idées sur comment cela peut être accompli?

EDIT: (voici mon code actuel qui ne fonctionne pas)

$(window).scroll(function() { 
    if ($(this).scrollTop() < $(document).height() - 81) { 
     $('#bottom_pic').css('bottom', "0px"); 
    } 
    else { 
     $('#bottom_pic').css('bottom', "81px"); 
    } 
}); 

CSS:

#bottom_pic 
{ 
    position: fixed; 
    bottom: 0px; 
} 

Merci!

+0

@roman nous pouvons facilement faire ce genre de choses, mais pouvez-vous expliquer encore plus clair ..si possible – kobe

+0

@gov - bien sûr. J'ai un élément div qui a la position: fixe et en bas: 0px; ce qui signifie qu'il est juste fixé au fond. Je souhaite qu'il cesse d'être réparé quand il atteint 80px par le bas (après que je défile vers le bas) et que je revienne à être réparé quand je remonte à nouveau vers le haut. J'espère que c'est mieux expliqué maintenant. – Roman

+0

@roman pouvez-vous s'il vous plaît modifier le code par 101010 symbole ou cntr-k – kobe

Répondre

-2
*@roman , the below function triggers the scroll event* , 

vous pouvez placer toute votre logique personnalisée dans ce /// calcul, positionnement, etc.

$(window).scroll(function() { 
    /* this function gets triggered whenever you do scroll. 
     Write all your logic inside this */ 
}); 
+0

c'est exactement ce que j'essaie de faire sans succès. Quelle logique devrait être là? (J'écrirai ce que j'ai essayé de faire) – Roman

+0

@roman définir cet événement dans votre code et faire un lert à l'intérieur et laissez-moi savoir s'il est en train de tirer, alors nous pouvons travailler sur votre logique pour le faire. – kobe

+0

sûr de tirer comme diable :) – Roman

0
$(window).scroll(function() { 
    checkPosition('#myelement'); 
}); 

function checkPosition(element){ 
//choose your limit 
var positionLimit = 416; 
var y = getOffsetY(); 

if(y <= positionLimit){ 
    $(element).css({'position':'fixed','bottom':'0'}); 
} 
else{ 
    $(element).css({'position':'relative'}); 
} 
} 

// pour la compatibilité du navigateur

function getOffsetY(){ 

var scrOfY = 0; 
    if(typeof(window.pageYOffset) == 'number') { 
     //Netscape compliant 
     scrOfY = window.pageYOffset; 
    } else if(document.body && (document.body.scrollTop)) { 
     //DOM compliant 
     scrOfY = document.body.scrollTop; 
    } else if(document.documentElement && ( document.documentElement.scrollTop)) { 
     //IE6 standards compliant mode 
     scrOfY = document.documentElement.scrollTop; 
    } 

return scrOfY; 
} 

Cela devrait être le travail. Pour obtenir le décalage de l'élément, vous devez utiliser une fonction afin d'avoir une compatibilité avec le navigateur. Tout ce que vous avez à faire est de régler la position limite correcte.

0

Il y a deux façons de s'y prendre:

  • soit aller avec une pos absolue, et compenser chaque mouvement scrollbar ci-dessous un certain niveau
  • ou aller avec une pos fixe, et compenser ci-dessus un certain niveau.

Dans les deux cas, ce que vous avez besoin est « une courbe linéaire avec une dent » en ce qui concerne la « valeur de position sur la valeur de défilement ». Les meilleurs pour y parvenir sont les fonctions Math.min/max. Astuce: L'approche fixe est moins wobbly pour la partie-arrêt. Sauf si vous avez besoin de support IE6 (qui ne sait pas fixe), allez avec la solution #fix.

<style type="text/css"> 
body { 
    height:1000px; /* create something to scroll*/ 
    border-left: 20px dotted blue; /* and something fancy */ 
} 

#abs { position:absolute; top: 200px; left:100px; background-color:#FCC; } 
#fix { position:fixed; top: 200px; left:200px; background-color:#CCF; }  
</style> 

<div id="abs">Absolute</div>   <div id="fix">Fixed</div> 

<script type="text/javascript"> <!-- have jQuery included before --> 
    $(window).scroll(function() { 
     $('#abs').css('top', 200 + Math.min(150, $(window).scrollTop())); 
     /* read: up to 150, compensate scrolling, 
        then stick with a fixed value (scroll along) */ 

     $('#fix').css('top', 200 - Math.max(0 , $(window).scrollTop() - 150)); 
     /* read: do nothing in the interval [0;150] */ 
    });   
</script> 
1

J'ai eu un problème similaire avec un site. J'ai eu un conteneur div qui avait deux colonnes. Une colonne de droite contenant des articles longs. Dans la colonne de gauche se trouvait une liste de navigation div contenant des liens d'ancrage pour chaque article de texte dans la colonne de droite. Je voulais que la navigation défile avec la page. Cependant, il ne devrait pas aller au-dessus des textes, ou au-dessous d'eux. J'ai écrit la fonction suivante pour elle:

HTML: 
<div id="texts-container"> 
    <div id="texts">Right column of long texts</div> 
    <div id="texts-sidebar">Left Column navigation that scrolls with page</div> 
</div> 

JS Function: 
function shift_text_nav() { 
    var top = $(window).scrollTop(); 
    var t = $('#texts-container').offset().top; 
    var left = $('#texts-container').offset().left; 
    if (top > (t)) { 
      var text_height = $('#texts').height(); 
      var nav_height = $('#texts-sidebar').height(); 

      if(t + text_height - nav_height - 40< top){ 
       $('#texts-sidebar').css({'position':'absolute','top': (text_height - nav_height) + 'px','left':'0px'}); 
      }else{ 
       $('#texts-sidebar').css({'position':'fixed','top':'40px','left':left+'px'}); 
      } 
    } else { 
      $('#texts-sidebar').css({'position':'absolute','top':'40px','left':'0px'}); 
    } 
} 

$(window).scroll(function() { shift_text_nav(); }); 
$(window).resize(function() { shift_text_nav(); }); 
shift_text_nav(); 
0
$(window).scroll(function(){ 
    if($(this).scrollTop() < $(document).height() -1000){ 
    $(selector).css("position", "fixed"); 
    $(selector).css("bottom","0"); 
    } 
    else 
    { 
    $(selector).css('bottom', "81px"); 
    } 
}); 

J'ai essayé ce code et cela fonctionne pour $ (document) .height() -500). Mais pour une raison que je ne peux pas comprendre cela ne fonctionne pas lorsque la valeur 500 est réduite à 100 ou 81.

Essayez de changer cette valeur et voir la différence

0

Désolé pour ressusciter les « morts », mais je est tombé sur cette question avec la même question et j'ai pensé partager la solution que j'ai trouvée.Dans mon cas, j'ai des images (#rm_gutter_left and #rm_gutter_right) de chaque côté d'un site de largeur de repère aligné au centre et d'un en-tête et d'un pied de page de largeur de fluide. Vous pouvez l'ajuster pour être seulement pour un élément ou utiliser une classe, bien sûr.

J'espère que cela aidera quelqu'un d'autre.

// Height and footer settings 
var rm_header_height = 67; // px 
var rm_footer_height = 200; // px 

// Store so jquery only has to find them once 
var rm_gutters = $("#rm_gutter_left, #rm_gutter_right"); 

// Set initial gutter position 
rm_gutters.css("top", rm_header_height + "px"); 

// Attach to window's scroll event 
$(window).scroll(function() { 
    st = $(this).scrollTop(); 
    h = $(document).height() - $(window).height(); 

    // Is the header still in view? 
    if (st < rm_header_height) { 
     rm_gutters.css({"top": rm_header_height + "px", "bottom": "auto"}); 

    // Are neither the footer or header in view? 
    } else if (st < h - rm_footer_height) { 
     rm_gutters.css({"top": 0, "bottom": "auto"}); 

    // Is the footer in view? 
    } else { 
     rm_gutters.css({"top": "auto", "bottom": rm_footer_height + "px"}); 
    } 
}); 
0
$(window).scroll(function() { 
    if ($(this).scrollTop() < $(document).height() - 81) { 
     $('#bottom_pic').css("position", "fixed"); 
     $('#bottom_pic').css('bottom', "0px"); 
    } 
    else { 
     $('#bottom_pic').css("position", "absolute"); 
     $('#bottom_pic').css({'top':(($(document).height())-81)+'px'}); 
    } 
}); 

Cela fera la div fixe à fond jusqu'à ce que son 81px loin du haut. Une fois arrivé là, il restera là.

1

Je sais que c'est un vieux sujet ... mais je avais besoin pour mettre en œuvre quelque chose de cette nature récemment. Voici le code pour accomplir la tâche (gardez à l'esprit que vous devrez peut-être modifier le CSS pour l'afficher à l'endroit approprié pour vos besoins, le mien devait ancrer l'élément en haut de l'écran). En outre, cela dépend de jQuery.

$(document).ready(function() { 
    // initialize the dock 
    Dock(); 

    // add the scroll event listener 
    if (window.addEventListener) { 
     window.addEventListener('scroll', handleScroll, false); 
    } else { 
     window.attachEvent('onscroll', handleScroll); 
    } 
}); 

function Dock() { 
    Dock.GetDock = document.getElementById('dockable'); 
    Dock.NewScrollOffset = getScrollOffset(); 
    Dock.DockBottomPos = getDockBottomPos(); 
    Dock.DockTopPos = getDockTopPos(); 
} 

function getScrollOffset() { 
    var scrollOffset = window.pageYOffset 
       ? window.pageYOffset 
       : document.documentElement.scrollTop; 
    return scrollOffset; 
} 

function getDockBottomPos() { 
    var dockTopPos = getDockTopPos(); 
    var dockHeight = $('#dockable').height(); 
    return (dockTopPos + dockHeight); 
} 

function getDockTopPos() { 
    var dockTopPos = $('#dockable').offset().top; 
    return dockTopPos; 
} 

function handleScroll(){ 
    if (window.XMLHttpRequest) { 

      // determine the distance scrolled from top of the page 
      Dock.NewScrollOffset = getScrollOffset(); 

      if (Dock.NewScrollOffset >= Dock.DockBottomPos) { 
       Dock.GetDock.className = "fixed"; 
       return; 
      } 
      if (Dock.NewScrollOffset <= Dock.DockTopPos) { 
       Dock.GetDock.className = ""; 
      } 
     } 
} 

css:

#dockable 
{ 
    position: relative; 
    width: inherit; 
} 
#dockable.fixed 
{ 
    position: fixed; 
    top: 0px; 
} 

Un exemple d'une station d'accueil serait ...

#dockable div 
{ 
    display: inline; 
    *zoom: 1; 
    height: 25px; 
    line-height: 25px; 
    padding: 5px 10px 5px 10px; 
} 
<div id="dockable"> 
    <div><a href="#">Menu Item 1</div> 
    <div><a href="#">Menu Item 2</div> 
    <div><a href="#">Menu Item 3</div> 
</div>