2015-01-26 15 views
5

Ho una pagina con div cliccabili che attivano o disattivano il contenuto quando si fa clic. Quando il div viene cliccato la seconda volta (chiudendo il contenuto), la pagina torna indietro in alto.attiva il salto indietro all'inizio della pagina

Vedo che questo è un problema che altre persone hanno avuto, ma tutte le soluzioni che ho trovato sono legate al tag di ancoraggio, che non è il problema qui.

Ho provato a cambiare il mio codice per la soluzione here e ad aggiungere return false; e event.preventDefault(); ma nessuno di quelli ha funzionato. Che cosa sto facendo di sbagliato?

jQuery:

$(document).ready(function(){ 
     $('h1').animate({"right":"147px"},3000); 
     $('.more').toggle(
       function(){ 
        $(this).css({ 
         'z-index':'100', 
         'background-position': '41px 0px' 
         }); 
        $('#heroFullColor').hide(); 
        $('#heroNoColor').show(); 
        $('div.' + $(this).attr('id')).fadeIn('fast'); 
        $('.more').not(this).hide(); 
       }, 
       function(){ 
        $(this).css({ 
         'background-position': '0px 0px' 
          }); 
        $('div.' + $(this).attr('id')).fadeOut('fast');     
        $('#heroNoColor, .infoWindow').hide(); 
        $('#heroFullColor').fadeIn('fast');     
        $('.more').not(this).show(); 
       }); 
    }); 

struttura HTML (questo si ripete più volte nella pagina):

<div class="more" id="franceFlag"></div> 
    <div class="infoWindow franceFlag"> 
     <img class="imageOn" src="images/lp_foundry_on-franceFlag.jpg" width="71" height="213" alt="French Flag" id="franceFlagOn" /> 
     <p class="franceFlag">blah blah blah</p> 
    </div>  
    <div class="more" id="heliBoth"></div> 
    <div class="infoWindow heliBoth"> 
     <img class="imageOn" src="images/lp_foundry_on-heliBoth.jpg" width="296" height="750" alt="Helicopters" id="heliBothOn" /> 
     <p class="heliBoth">blah blah blah</p> 
    </div>  

Here is a fiddle - Se si scorre in basso a destra, e fare clic sul + segno accanto alla bandiera, vedrai cosa intendo.

+1

Puoi pubblicare un esempio funzionante su http://jsfiddle.net/ per favore? – pyb

+0

@BobM http://jsfiddle.net/11cptbmz/ ha aggiornato anche la domanda. Grazie. – surfbird0713

risposta

4

È perché si nasconde l'elemento che ha dato la vostra altezza del contenitore, mostrando poi un altro. Quindi per un breve periodo non ha altezza.

Se si assegna espressamente un'altezza al contenitore, ciò non accadrà. per esempio.

#lp-foundry-container { 
height: 940px; 
} 

La stessa cosa non accade al primo clic, perché si nasconde e si mostra istantaneamente. Se si dovesse cambiare

$('#heroNoColor').show(); 

a

$('#heroNoColor').fadeIn('fast'); 

Come è sulla funzione di chiusura, poi la stessa cosa sarebbe accaduto al primo scatto.

+0

È bello averlo spiegato correttamente. L'uso della correzione solo CSS richiede comunque un po 'di riflessione, poiché le cose tendono a saltare dopo "hide()" sul trasporto di elementi.Ancora questo è il modo di andare se il layout lo consente. –

+0

Vero spesso non è così semplice nella pratica - c'è anche la possibilità di impostare l'altezza con javascript prima di fare un hide(). Ma CSS-only è bello se possibile. –

+0

Grazie! Ho scelto questa risposta perché sono d'accordo: una soluzione per soli css è carina quando possibile. – surfbird0713

1

Prova questo


JQuery

$(document).ready(function(){ 
     $('h1').animate({"right":"147px"},3000); 
     $('.more').toggle(
       function(){ 
        $(this).css({ 
         'z-index':'100', 
         'background-position': '41px 0px' 
         }); 
        $('#heroFullColor').hide(); 
        $('#heroNoColor').show(); 
        $('div.' + $(this).attr('id')).fadeIn('fast'); 
        $('.more').not(this).hide(); 
       }, 
       function(){ 
        $(this).css({ 
         'background-position': '0px 0px' 
          }); 
        $('div.' + $(this).attr('id')).fadeOut('fast');     
        $('#heroNoColor, .infoWindow').hide(); 
        $('#heroFullColor').fadeIn('fast');     
        $('.more').not(this).show(); 
       }); 

       //What I added 
       $(".more").click(function() 
       { 
        var div = $(this); 
        $(window).scrollTop(div.offset().top).scrollLeft(div.offset().left); 
       }); 
    }); 

In sostanza si sta solo prendendo la parte superiore corrente e le posizioni di sinistra del div cliccato e l'impostazione della pagina di posizionarsi in quel punto una volta che si sono fatti.

Fiddle Demo

BTW questo è un idea piuttosto fresco, Bel lavoro!

+1

grazie per aver pesato! Questo ha senso per me, ma è andato con l'altra soluzione come CSS-solo è bello quando possibile – surfbird0713

0

L'unica soluzione che so è questo:

$(document).ready(function(){ 
     .... 
     $('.more').toggle(
       function(){ 
        ... 
       }, 
       function(){ 
        var tempTop = $(window).scrollTop(); //<----remember Y 
        var tempLeft = $(window).scrollleft(); //<----remember X 
        .... your code here ... 
        //----> now restore the position 
        $(window).scrollTop(tempTop); 
        $(window).scrollLeft(tempLeft); 

       } 
     ); 
Problemi correlati