2015-03-03 12 views
8

Mam funkcję, która w tej chwili stopniowo zanika w elementach, ale jest identyczna jak kółko myszy, aby kontrolować ich przezroczystość, jeśli jest to możliwe.Elementy FadeIn na przewijanie

Czy ktoś może doradzić, jak to zrobić? Czy wymagałoby to wtyczki myszy? dzięki za każdym wejściem

http://jsfiddle.net/gLtgj54s/

$('.sector-link').each(function (i) { 
    $(this).delay(350 * i).fadeIn(800); 
}); 

HTML Markup

<div style="overflow:scroll;width:100%; border:0; height:300px; "> 
      <div style="height:3000px; position:relative;"> 
       <div style="position:fixed;left:0; top:50px;"> 
        sector links... 
        </div> 
       </div> 
      </div> 
+0

skrzypce robi praca –

+0

@MohitBhasi tak robi. Zanikanie przy ładowaniu strony. – Adjit

+0

Więc zamiast w pełni zautomatyzowanego fadeIn, chcesz dostosować krycie każdego wiersza tekstu na podstawie pozycji przewijania? – Terry

Odpowiedz

10

Jedno podejście można wykorzystać dane atrybuty, aby ustawić punkt, gdy element powinien fadeIn .

W JS sprawdzić, czy wartość przewijania znajduje się w przedziale między punktem przewijania elementu a punktem przewijania następnego elementu.

var arr = []; 
 
$('.sector-link').each(function(i) { 
 
    arr.push($(this).data("scroll-point")); 
 
}); 
 

 
$(window).scroll(function() { 
 
    var scrollTop = $(window).scrollTop(); 
 
    elementFade(scrollTop); 
 

 
}); 
 

 
elementFade = function(top) { 
 
    for (var i = 0; i < arr.length; i++) { 
 
    var min = arr[i]; 
 
    var max = i != (arr.length - 1) ? arr[i + 1] : (arr[i] + 100); 
 
    if (top >= min && top < max) { 
 
     $('[data-scroll-point="' + arr[i] + '"]').fadeIn(800); 
 
     $('p.info').html($('[data-scroll-point="' + arr[i] + '"]').html() + " visible at point " + arr[i]); 
 
    } 
 
    } 
 
}
body { 
 
    height: 3000px; 
 
} 
 
p.info { 
 
    position: fixed; 
 
    top: 0; 
 
    font-size: 11px; 
 
    color: #555; 
 
    background: #eee; 
 
    padding: 3px; 
 
} 
 
.sector-link { 
 
    float: left; 
 
    margin: 5px; 
 
    padding: 5px; 
 
    border-radius: 2px; 
 
    background: #abcdef; 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p class="info">Not visible</p> 
 
<div style="position:fixed;left:0; top:50px;"> 
 
    <div class="sector-link" data-scroll-point="100">Link 1</div> 
 
    <div class="sector-link" data-scroll-point="300">Link 2</div> 
 
    <div class="sector-link" data-scroll-point="500">Link 3</div> 
 
    <div class="sector-link" data-scroll-point="700">Link 4</div> 
 
    <div class="sector-link" data-scroll-point="1000">Link 5</div> 
 
    <div class="sector-link" data-scroll-point="1200">Link 6</div> 
 
    <div class="sector-link" data-scroll-point="2000">Link 7</div> 
 
    <div class="sector-link" data-scroll-point="2500">Link 8</div> 
 
</div>

Updated fiddle

+0

Dzięki za ten @Anpsmn, mój znacznik jest w div jednak, jak by to działało z scrolltopem? Ive zaktualizowałem moje pytanie ... – Liam

+0

@Liam Możesz powiązać zdarzenie przewijania z okna z kontenerem div, takim jak [this] (http://jsfiddle.net/s7mufpzv/). Mam nadzieję, że tego właśnie chcesz. – anpsmn

+0

Dzięki @Anpsmn, czy ich sposób na ich zniknięcie po przewinięciu w górę? ill award the bounty w 6 godzin (najwcześniej mogę to zrobić!) ... – Liam

0
  1. że to, co trzeba?

    JsFiddle

    var cpt = 0; 
    $(window).scroll(function() { 
        $('.sector-link:eq('+cpt+')').fadeIn(800); 
        cpt = cpt + 1; 
    }); 
    

    usunąłem opóźnienia (350) na jsfiddle, ale można umieścić go z powrotem, jeśli potrzebne: JsFiddle

  2. Nie wiem, jeśli jest to potrzebne, ale jeśli tak, jest pewien kod JsFiddle (nie doskonały) który robi to, co chcesz, plus odwrotnie.

    • Na przewijania w dół: twoja sprawa pojawia się jeden po drugim
    • Na przewijania w górę: swoje rzeczy znikają jeden po drugim
0

mam zaktualizowane fiddle, to mam nadzieję, że czego szukałeś?

To właśnie wykorzystuje .fadeIn/.fadeOut każdego elementu w zależności od pozycji przewijania

na przykład:

if ($(document).scrollTop() > 50) { 
    $('#2').fadeIn(800);  
} else { 
    $('#2').fadeOut(800); 
} 
0

Można korzystać z biblioteki, a mianowicie scrollReveal.js, co jest dość miłe.

tutaj jest Code Pen zrobiłem przy użyciu biblioteki. Uproszczona z this Code Pen

Twój kod może być tak proste, jak:

<html> 
    <body> 
     <p data-scrollreveal='ease in 50px'> Thing </p> 
     <p data-scrollreveal='ease in 50px'> Thing </p> 
     <p data-scrollreveal='ease in 50px'> Thing </p> 
     ... 
    </body> 
</html> 

https://github.com/julianlloyd/scrollReveal.js

0

W związku z decyzją Apple nie wysłać „przewijania” wydarzenie dopiero po jej zakończeniu przewijania sugeruję coś jak to w zamian -

pierwsze ustawić wszystko na display: block i krycie: 0

var scrollTop; 
var $elements = $(...); 
window.setTimeout(function(){ // Better to use requestAnimationFrame if available 
    if (scrollTop !== window.scrollTop) { 
     scrollTop = window.scrollTop; 
     for (var i=0; i<elements.length; i++) { 
      var rect = elements[i].getBoundingClientRect(); 
      elements[i].style.opacity = Math.min(1, Math.max(0, rect.top, rect.bottom > 0 ? window.innerHeight - rect.bottom : 0)/20); 
      // ie, Put in something to control it based on the difference between the top/bottom of the element and the display 
     } 
    } 
}, 50); 

Pomimo tego, że jest to pytanie typu jQuery - uruchamianie takiego kodu na każdej klatce, że rzeczy się zmieniają, może być drogie, dlatego użyłem bezpośredniego kodu DOM, który jest znacznie szybszy!

0

Oto jest modified fiddle. W twoim pytaniu nie jest całkiem jasne, ale zakładam, że chcesz ustawić krycie na podstawie tego, gdzie element znajduje się w widocznym obszarze.

$(document).ready(function() { 
    $('.sector-pink').css({ 
     opacity: 0, 
     visibility: 'visible' 
    }); 

    var setOpacity = function() { 
     var container = $(this); 

     $('.sector-link').each(function() { 
      var self = $(this); 
      var fromBottom = container.height() - self.offset().top; 


      var opacity = fromBottom/100; 
      //100 is a magic number that will control how far from the bottom of the viewport things become fully visible. 

      self.find('span').text(opacity.toFixed(2)); 
      self.css({ 
       'opacity': opacity 
      }); 


     }); 
    }; 
    $('#container').scroll(function() { 
     setOpacity(); 
    }); 
    setOpacity(); 
}); 
0

Jeśli dobrze Cię rozumiem, chcesz, aby po przewinięciu strony użytkownik stopniowo znikał. (Uruchom fragmenty kodu, aby zobaczyć, czy to, co chcesz lub nie)

var showing = false; 
 
$(document).scroll(function() { 
 
    if (!showing && isElementInViewport($('.sector-link:last'))) { 
 
    showing = true; 
 
    $('.sector-link').each(function(i) { 
 
     $(this) 
 
     .delay(100 * i) 
 
     .css('visibility', 'visible') 
 
     .hide() 
 
     .fadeIn(400); 
 
    }); 
 
    } 
 
}) 
 

 
// This function determines if the given element is inside the current view port 
 
function isElementInViewport(el) { 
 

 
    //special bonus for those using jQuery 
 
    if (typeof jQuery === "function" && el instanceof jQuery) { 
 
    el = el[0]; 
 
    } 
 

 
    var rect = el.getBoundingClientRect(); 
 

 
    return (
 
    rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ 
 
    rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */); 
 
}
body { 
 
    height: 100000px; 
 
} 
 
.sector-link { 
 
    font-size: x-small; 
 
    visibility: hidden; 
 
    border: 1px solid yellowgreen; 
 
    padding: 0.1em; 
 
    width: 120px; 
 
    text-align: center; 
 
    color: white; 
 
} 
 
div.placeholder { 
 
    text-align: center; 
 
    padding: 0.1em; 
 
    height: 500px; 
 
    width: 120px; 
 
    background: yellowgreen; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="placeholder">Scroll down slowly</div> 
 
<div> 
 
    <div class="sector-link" style="background:#563895">THING</div> 
 
    <div class="sector-link" style="background:#765835">THING</div> 
 
    <div class="sector-link" style="background:#068865">THING</div> 
 
    <div class="sector-link" style="background:#a468f5">THING</div> 
 
    <div class="sector-link" style="background:#56ffab">THING</div> 
 
    <div class="sector-link" style="background:#563895">THING</div> 
 
    <div class="sector-link" style="background:#8f68f5">THING</div> 
 
    <div class="sector-link" style="background:#a6b8f5">THING</div> 
 
</div>

1

Zawsze można użyć kółka myszy do przewijania, zmiany kryjące aby uczynić go bardziej lub mniej widoczne. Wykorzystuje się zdarzenie DOMMouseScroll lub zdarzenie mousewheel. Zobacz następujący kod:

function moveObject(event){ 
    var delta=0; 
    if(!event)event=window.event; 
    if(event.wheelDelta){ 
     delta=event.wheelDelta/600; 
    }else if(event.detail){ 
     delta=-event.detail/20; 
    } 
    var target = $('body > div'); 
    var adj = parseFloat(target.css('opacity')); 
    target.css('opacity',Math.max(0,Math.min(1,adj+Math.max(0.6,adj)*delta))); 
} 
if(window.addEventListener){ 
    document.addEventListener('DOMMouseScroll',moveObject,false); 
}else{ 
    document.onmousewheel=moveObject; 
} 

Oto jsFiddle aby spróbować samemu: http://jsfiddle.net/gLtgj54s/14/

dzięki: http://viralpatel.net/blogs/javascript-mouse-scroll-event-down-example/

0

można po prostu użyć Twitter Bootstrap's Scrol Spy, a nie próbować wyważać otwartych drzwi. Aby osiągnąć pożądane zachowanie z nią, wystarczy postępować zgodnie z instrukcjami i dodaj następujący kod CSS:

.active ~ li { 
    opacity: 0; 
    transition: 1s; 
} 

Nawiasem mówiąc, można także spróbować go tam. Otwórz linkowaną witrynę internetową, dodaj fragment na konsoli i przewiń dokumentację.

0

Więc tu jest moje rozwiązanie problemu:

przedmioty, które mają klasę .sectrol-link zanikanie lub jeden po drugim w oparciu o sposób przewijania.

Aby ta metoda działała, nie trzeba mieć rzeczywistego paska przewijania. Rozwiązanie nie śledzi pozycji przewijania, jest oparte na zdarzeniu "scrollwheel".

To również zanika elementy podczas przewijania w górę.

Jestem pewien, że możesz dostosować rozwiązanie do swoich potrzeb.

// Constants 
var pxPerItem = 720; 
var sectorLinks = $('.sector-link'); 
var scrollYMax = sectorLinks.length * pxPerItem; 

//Fade controller variable 
var currentScrollY = 0; 


//Calculates fade value for the item based on current 'scroll' position 
function calculateFade(itemNo) { 
    var relativeScroll = (currentScrollY - pxPerItem * itemNo)/pxPerItem; 
    return Math.min(Math.max(0, relativeScroll), 1) 
} 

//Keeps the controller scroll variable within the bounds based on the amount of elements. 
function normalizeCurrentScroll() { 
    currentScrollY = Math.min(Math.max(0, currentScrollY), scrollYMax); 
} 

//The actual event that controls items fade 
$(window).bind('mousewheel DOMMouseScroll', function(event){ 
    var delta = event.originalEvent.wheelDelta == 0 ? event.originalEvent.detail : event.originalEvent.wheelDelta; 
    currentScrollY -= delta; 
    for (var i = 0; i < sectorLinks.length; i++) { 
     $(sectorLinks[i]).fadeTo(20, calculateFade(i)); 
    }  
    normalizeCurrentScroll(); 
}); 

Ilość rolka potrzebne ani wygaszać się związek jest sterowany przez zmienną "pxPerItem. Jeśli chcesz umieścić coś takiego poniżej na stronie, musisz zmodyfikować zmienną scrollYMax i obliczyć wartośćFadeFunction tak, aby pasowały do ​​Twojego wzrostu.

Fiddle: https://jsfiddle.net/gLtgj54s/18/

0

Użyłem tego skutecznie dokonać tego, czego szukasz zrobić:

$(window).bind("scroll", function() { 
    if ($(this).scrollTop() > 800) { //Fade in at a level of height 
     $(".XX").fadeIn("fast"); 
     checkOffset(); //Call function 
    } else { 
     $(".XX").stop().fadeOut("fast"); 
    } 
}); 
function checkOffset() { 
    if ($('.XX').offset().top + 500 + $('#myDiv').height() >= $('.Container').offset().top) { 
     $(".XX").stop().fadeOut("fast"); 
    } 
    if ($(window).scrollTop() + $(window).height() < $('.Container').offset().top) { 
     $('.XX').css('position', 'fixed'); //Restore when you scroll up 
    } 
}