2011-05-31 15 views
7

Ho visto diverse soluzioni che determinano quando un elemento è visibile nel viewport mentre si scorre la pagina, ma non ho visto nessuno che faccia ciò per gli elementi che sono contenuti in un contenitore a scorrimento div come nell'esempio qui.HTML come dire quali elementi sono visibili?

Come posso rilevare gli elementi mentre scorrono in visualizzazione tramite il div di scorrimento? E al contrario, come potrei rilevarli se cadessero fuori vista. In tutti i casi gli elementi di overflow non sono nascosti all'inizio.

HTML

<div id="mainContainer" class="main"> 
     <div id="scrollContainer"class="scroller"> 
      <div id="picturesContainer"class="holder"> 
       <div id="pictureContainer1" class="picture position1"> 
       pictureContainer1</div> 

       <div id="pictureContainer2" class="picture position2"> 
       pictureContainer2</div> 
       <div id="pictureContainer3" class="picture position3"> 
       pictureContainer3</div> 
       <div id="pictureContainer4" class="picture position4"> 
       pictureContainer4</div> 
       <div id="pictureContainer5" class="picture position5"> 
       pictureContainer5</div> 
       <div id="pictureContainer6" class="picture position6"> 
       pictureContainer6</div> 
       <div id="pictureContainer7" class="picture position7"> 
       pictureContainer7</div> 
       <div id="pictureContainer8" class="picture position8"> 
       pictureContainer8</div> 
       <div id="pictureContainer9" class="picture position9"> 
       pictureContainer9</div> 
      </div> 

     </div> 
    </div> 

CSS

.main{ 
     position:absolute; 
     top:0px; 
     left:0px; 
     height: 200px; 
     width:200px; 
     background-color: grey; 
     border: 1px solid black; 
    } 

    .scroller{ 
     position:absolute; 
     top:0px; 
     left:0px; 
     height: 250px; 
     width:250px; 
     background-color: lightblue; 
     border: 1px solid black; 
     overflow: scroll; 
    } 

    .picture{ 
     position:absolute; 
     height: 200px; 
     width: 200px; 
     background-color: lightyellow; 
     border: 1px solid black; 
    } 

    .position1{ 
     top:0px; 
     left:0px; 
    } 

    .position2{ 
     top:0px; 
     left:200px; 
    } 

    .position3{ 
     top:0px; 
     left:400px; 
    } 

    .position4{ 
     top:200px; 
     left:0px; 
    } 

    .position5{ 
     top:200px; 
     left:200px; 
    } 

    .position6{ 
     top:200px; 
     left:400px; 
    } 

    .position7{ 
     top:400px; 
     left:0px; 
    } 

    .position8{ 
     top:400px; 
     left:200px; 
    } 

    .position9{ 
     top:400px; 
     left:400px; 
    } 

    .holder{ 
     position:absolute; 
     top:0px; 
     left:0px; 
     width:600px; 
     height:600px; 
     background-color:lightgreen; 
    } 

risposta

2

include prima la libreria jQuery.

function getObjDims(obj){ 
    if (!obj) return false; 
    var off = $(obj).offset(); 
    var t = { 
     top:off.top, 
     left:off.left, 
     width:$(obj).width(), 
     height:$(obj).height() 
    }; 
    return {x1:t.left, y1:t.top, x2:t.left+t.width,y2:t.top+t.height} 
}; 
function testInside(pic,box){ 
    var d=getObjDims(pic); 
    return (box.x1<=d.x1 && box.y1<=d.y1 && box.x2>=d.x2 && box.y2>=d.y2)?1:-1; 
}; 
$(document).ready(function(){ 
    var inside={}; 
    var port=$('#scrollContainer'); 
    var box=getObjDims(port); 
    $(window).resize(function(){ 
     box=getObjDims(port); 
    }); 
    $(port).scroll(function(){  
     var str=[]; 
     $('.picture').each(function(i){ 
      var oldState = inside[this.id]!=undefined?inside[this.id]:0;    
      var newState = testInside(this,box); 
      inside[this.id]=newState; 
      if (oldState!=newState) 
       switch (newState){ 
        case 1:str.push(this.id);break;// go IN 
        case -1: break;// go OUT 
       } 
     }); 
     $('#picStatus').text(str.join(', ')); 
    }); 
}); 

Aggiungi in HTML per l'output risultati:

<div style='margin-top:280px;'>Pictures in window (numbers):</div> 
<div id='picStatus'></div> 

Si basa sul codice di coordinate dell'oggetto, strega vengono ricalcolate in evento scroll. Ci sono alcune cose da sapere. IE e, sembra, Opera prende in considerazione la larghezza e l'altezza delle barre di scorrimento stesse, che richiede l'ottimizzazione del codice tenda. Ho appena suggerito la direzione della soluzione e non ho impiegato molto tempo per eseguire il debug di questo.

Eppure, forse sarà seguito utile (da jquery api su offset):

Nota: jQuery non supporta ottenere le coordinate di offset di nascosto elementi o la contabilità per le frontiere, margini, o imbottitura sul corpo elemento .

+0

Sembra funzionare una volta che un oggetto è completamente visibile. Questo è molto importante per me - grazie Igor. Ho messo il codice [qui] (http://jsfiddle.net/PSjBN/54/) se qualcuno vuole vederlo funzionare. Lavorerò ulteriormente su questo un post aggiornamenti anche. – T9b

1

http://www.quirksmode.org/mobile/viewports.html discute questioni intorno finestre, determinando le loro dimensioni, e calcolando elemento delimita rispetto coordinare telaio di una finestra. La seconda parte di quel post del blog entra quindi nelle viewport implicite nei browser mobili. Non fornisce codice che risponda esattamente alla tua domanda, ma è sicuramente pertinente e merita una lettura.

+0

Ciao questo è molto interessante, ma di nuovo si riferisce principalmente al viewport e non all'elemento che lo racchiude. – T9b

+1

@ T9b, non è il caso che la visibilità del calcolo (che non presuppone l'occlusione degli elementi fluttuanti) consiste nel controllare ricorsivamente se un elemento si trova all'interno della porzione visibile di ciascun antenato che ha un overflow calcolato diverso da "show" o una regione di "clip" calcolata e che nessun antenato ha una visualizzazione calcolata di "nessuno" o una visibilità calcolata diversa da "visibile"? Ci sono ancora problemi con gli antenati 'il cui background è lo stesso del primo piano dei loro discendenti, ma a meno che tu non stia cercando di risolvere un problema difficile come il percorso fidato, probabilmente puoi ignorarlo. –

+0

sì hai ragione. Si tratta di controllare in modo ricorsivo se un elemento è visibile in relazione a molte cose, tra cui la posizione di scorrimento corrente e la dimensione degli elementi di delimitazione. So che questo è difficile e sto ignorando il fatto che potrebbero esserci altri elementi nella pagina, ma in realtà stavo chiedendo se qualcuno avesse una soluzione pronta (* tosse). Altrimenti sto facendo il mio da solo come si suol dire ... – T9b

Problemi correlati