2016-09-21 2 views
1

Ich versuche, Aktionen auszulösen, wenn der Benutzer in verschiedene DOM-Elemente scrollt (ich brauche dies für verschiedene Bildschirmgrößen reagieren). Ich bekomme zuerst die Positionen der jeweiligen Elemente mit offset().top dann berechne ich die Position der Rolle mit scrollTop(). Es funktioniert etwas, aber die Aktion wird zu weit nach dem Start des DOM-Elements ausgelöst. Ich habe alle Polsterung und Margen entfernt ...Auslöser beim Scrollen nach DOM-Element

var hT = $('#bioAG').offset().top; 
var hT2 = $('#bioTM').offset().top; 
var hT3 = $('#contact').offset().top; 

$(window).scroll(function() { 
    var ws = $(window).scrollTop()   
    if (ws > hT) { 
    $("#bioAG").addClass("fade-in"); 
     } else if (ws > hT2){ 
     $("#bioTM").addClass("fade-in"); 
     } else if (ws > hT3) { 
      $("#contact").addClass("fade-in"); 
      } else {console.log('none');}; 

}) `

+0

logisch auf Spirale (jeder einmal in eine Weile) Sie Ihre Variablen neu berechnet werden sollte .... –

+0

Ich glaube, ich verstehe mich zu kämpfen, warum das der Fall wäre, wenn das Ansichtsfenster nicht in der Größe geändert wird. Warum ändert sich die Position der DOM-Elemente, wenn sie bereits beim ersten Aufruf der Seite vorhanden sind? – eabates

+0

Ursache: 1: Sie scrollen die Seite, 2: Sie ändern die Größe des Fensters, 3: scrollen und JS ist nun vermasselt (naja ... es sei denn, Ihre Elemente sind immer auf festen NNpx Höhe - was ich weniger wahrscheinlich. –

Antwort

0

Auf Spirale (Last und die Größe) berechnen die .top Position jedes data-fadein Elemente.
filter() Dann geben Sie die Elemente zurück, deren obere Position kleiner als die Fensterhöhe ist - und fügen diesen Elementen die gewünschte Klasse hinzu.

var $ele = $("[data-fadein]"), 
 
    $win = $(window); 
 

 
function fadeInEl() { 
 

 
    var h = $win.height(); 
 

 
    $ele.filter(function() { 
 
    return this.getBoundingClientRect().top < h; 
 
    }).addClass("fade-in"); 
 

 
} 
 

 

 
// Call the above function on: 
 
$win.on("load resize scroll", fadeInEl);
*{box-sizing:border-box;} 
 
html,body{height:100%;margin:0;} 
 

 

 
[data-fadein] { 
 
    height:100vh; 
 
    opacity:0; 
 
    transition: 2s; 
 
} 
 
.fade-in { 
 
    opacity:1; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div data-fadein id="bioAG" style="background:#0af">ag</div> 
 
<div data-fadein id="bioTM" style="background:#f0a">tm</div> 
 
<div data-fadein id="contact" style="background:#0fa">contact</div>

https://developer.mozilla.org/en/docs/Web/API/Element/getBoundingClientRect

+0

Danke für den tollen Code. Es funktioniert ganz gut bis hin zu den mobilen Breakpoints, wo ich denke, dass die 100vh und die unterschiedlichen Textlängen meiner Divs die Haupthindernisse sind (ich beabsichtige zu versuchen, alle meine Div-Texte einheitlicher zu machen). Der Code hat mich definitiv auf eine bessere Spur gebracht, und ich habe ein paar neue Dinge gelernt. – eabates

+0

@eabates die div-Größe wäre am besten 100vh, aber es kann größer sein, es ist egal. - Ich habe jetzt ein Problem gesehen, das über Höhen spricht ... wird in einer Minute bearbeiten –

+0

Ok, ich werde versuchen, die 100vh mit Medienabfragen anzupassen, danke. – eabates