2016-01-11 17 views
5

In questo momento sto provando a scrivere una funzione jquery che mi consente di espandere un div quando fai clic su di esso, quindi di tornare alla sua dimensione iniziale quando fai nuovamente clic su di esso. .Come trasformo questa funzione jQuery in un'istruzione 'if'

Ho provato ad aggiungere un pulsante per farlo ritirare, ma perché quando clicco lo script pensa che sto anche facendo clic sul div padre e si espande di nuovo. Idealmente, mi piacerebbe farlo senza avere un pulsante.

Il codice che ho è qui -

(jsfiddle): https://jsfiddle.net/Nikf/wykL6u7u/9/

<div class="grid"> 
     <div class="block" id="block1"> 
      <button class="retractor" id="ret1">back</button> 
     </div> 
     <div class="block" id="block2">2</div> 
     <div class="block" id="block3">3</div> 
     <div class="block" id="block4">4</div> 
     <div class="block" id="block5">5</div> 
     <div class="block" id="block6">6</div> 
</div> 

CSS

*{ 
    margin: 0; 
    padding: 0; 
} 

html, body{ 
    width: 100%; 
    height: 100%; 
} 

.grid{ 
    width: 100%; 
    height: 100%; 
    /*background-color: #114411;*/ 
} 

.block{ 
    width: 33.3%; 
    height: 50%; 
    float: left; 
    color: #FFFFFF; 
    position: relative; 
} 

.retractor{ 
    width: 50px; 
    height: 50px; 
    padding: 10px 0; 
    text-align: center; 
    background-color: #FF0000; 
    color: #FFFFFF; 
    font-family: 'Open Sans', sans-serif; 

    position: absolute; 
    bottom: 30px; 
    right: 30px; 
} 

#block1{ 
    background-color: #222222; 
}   

#block2{ 
    background-color: #999999; 
}   

#block3{ 
    background-color: #5555555; 
}   

#block4{ 
    background-color: #999999; 
} 

#block5{ 
    background-color: #333333; 
}  

#block6{ 
    background-color: #CCCCCC; 

Script

$('#block1').click(function(){ 
    $('#block1').animate({ 
     width: '100%', 
     height: '100%' 
    }); 
}); 

$('#block1').click(function(){ 
    $('#block1').animate({ 
     width: '33.3%', 
     height: '50%' 
    }); 
}); 
+0

il codice su JSFiddle e al codice postato qui sono diversi. –

+0

perché non dovrebbe? stai collegando entrambi i gestori di clic allo stesso div "genitore". Il tuo gestore di clic "vicino" dovrebbe essere collegato a "# ret1". –

+0

@MarcB Sì, è un grosso errore da parte mia. Ho copiato lo script da un precedente JSFiddle. La versione aggiornata ha il gestore dei clic collegato a ret1 – Uesls

risposta

7

È possibile utilizzare jQuery toggleClass in combinazione con le transizioni CSS per ottenere lo stesso risultato. Controlla https://jsfiddle.net/wykL6u7u/11/ e vedi se ciò soddisfa le tue esigenze.

quello che ho fatto:

.block { 
    width: 33.3%; 
    height: 50%; 
// ... 
    transition: all 1s; 
} 

.block.expanded { 
    width: 100%; 
    height: 100%; 
    transition: all 1s; 
} 

E il JS è solo la leva classe:

$('#block1').click(function(){ 
     $(this).toggleClass("expanded"); 
}); 
+0

È necessario aggiungere gli stili di compatibilità cross-browser, ma per il resto è interessante :) –

+0

Tutti i browser supportano la versione non prefissata di questo per un po 'di tempo. (http://www.w3schools.com/css/css3_transitions.asp) Naturalmente, se è assolutamente necessario supportare versioni precedenti, questo è necessario. –

+1

Tutti i "nuovi" browser supportano la versione non prefissata di questo. Sfortunatamente c'è ancora un sacco di vecchie versioni del browser in uso (di solito in luoghi con problemi di sicurezza, o non possono permettersi di aggiornare ancora tutti i PC). Dico speranza per il futuro, ma codice per il mondo reale :) –

1

Io suggerisco di usare "toggleClass" e basandosi su classi CSS anziché CSS hard-coded valori. D'accordo con @ sebastian-wramba

Il fatto è che non abbiamo davvero bisogno del pulsante Indietro qui. L'ho portato fuori con la consapevolezza che op preferirebbe non essere lì ma che il clic sul div do l'interruttore. Feedback benvenuto se non sto leggendo i requisiti correttamente.

https://jsfiddle.net/e15kxkdr/3/

<div class="grid"> 
     <div class="block" id="block1">1</div> 
     <div class="block" id="block2">2</div> 
     <div class="block" id="block3">3</div> 
     <div class="block" id="block4">4</div> 
     <div class="block" id="block5">5</div> 
     <div class="block" id="block6">6</div> 
</div> 

.grid{ 
    width: 100%; 
    height: 100%; 
    /*background-color: #114411;*/ 
} 

.block{ 
    width: 33.3%; 
    height: 50%; 
    float: left; 
    color: #FFFFFF; 
    position: relative; 
} 
.nodisplay { 
    display: none; 

} 

$('.grid').on("click", "div", function(){ 
     $(this).toggleClass("grid") 
     $(this).toggleClass("block") 
     $(this).siblings().toggleClass("nodisplay") 
    }) 

Aggiornamento: Ho cambiato questo per lavorare fuori i bambini del principale elemento "griglia" tramite il jquery "on" sottoelemento piuttosto che utilizzare una classe separata. Poi ho aggiunto una nuova classe "nodisplay" per nascondere gli altri elementi.

+2

Il pulsante Indietro ancora rimbalza. –

+0

Ok, trascurato di considerarlo un requisito. – saranicole

+0

Sei riuscito a ottenere un upvote su una risposta errata ... potresti decidere di aggiustarlo per guadagnare quello :) –

-1

Vorrei suggerire di modificare la logica. È più facile se aggiungi una classe specifica e lasci che il CSS faccia l'animazione.

$('.block').click(function(ev){ 
    $(ev.target).toggleClass('active'); 
}); 

In questo modo è possibile rimuovere il pulsante dagli elementi di blocco.

Aggiungere l'animazione e la nuova classe al CSS:

.block{ 
    -webkit-transition: all 1s ease-in-out; 
    -moz-transition: all 1s ease-in-out; 
    -o-transition: all 1s ease-in-out; 
    transition: all 1s ease-in-out; 
} 

.block.active{ 
    width: 100%; 
    height:100%; 
} 

non ho ancora testato questo codice. Spero che funzioni

--EDIT--

ev.target non è un elemento jQuery. L'ho avvolto in $ (ev.target) altrimenti non ce l'aveva.toggleClass();

+0

Aggiungi il tuo esempio a un JSFiddle. Non riesco ancora a far funzionare questo. –

0

Prova questo:

$(document).ready(function(){ 
    var expand = true; 
    $('#block1').click(function(){ 
     var width='33.3%', height="50%"; 
     if(expand){ 
      width='100%'; 
      height='100%'; 
      expand=false; 
     }else{ 
      expand=true; 
     } 
     $('#block1').animate({ 
      width: width, 
      height: height 
     }); 
    }); 

}); 
+0

Funziona solo una volta e rimane chiuso. –

+0

Ho aggiunto un'altra istruzione. Ora funziona perfettamente :) grazie! – nach0

+0

Molto meglio ... Personalmente non mi piace usare le variabili locali per mantenere lo stato di animazione. È inoltre necessario interrompere qualsiasi animazione esistente nella coda (fare clic molto velocemente per vedere) :) –

0

Prova memorizzare valori in una matrice, utilizzando Array.prototype.reverse()

Credo @BillGarrison sia corretto. Senza spiegazione non è ovvio come funziona il codice.

Spiegazione:

Approccio è una procedura "toggle". Utilizzare il valore a arr[0] per un processo; invertire arr; utilizzare il valore a arr[0] per il processo successivo; invertire arr.

L'approccio potrebbe essere implementato senza utilizzare Array.prototype.reverse(); utilizzando 0 e 1, undefined; vedi Has .toggle() been deprecated in the latest jQuery releases?.

L'approccio può anche essere esteso per scorrere, o alternare i valori n in successione, ritornando al valore iniziale una volta che tutti gli elementi dell'array sono stati ripetuti.

var arr = [ 
     ["100%", "100%"], 
     ["33.3%", "50%"] 
    ]; 

    $("#block1").click(function() { 
      $(this).animate({ 
      // at initial click, set `width` to `arr[0][0]` : `100%`, 
      // set `height` to `arr[0][1]` : `100%` 
      // reverse `arr` 
      // at second click `arr[0]` : `["33.3%", "50%"]`; 
      // set `width` to `arr[0][0]` : `33.3%` 
      // set `height` to `arr[0][1]` : `50%`; 
      // repeat procedure 
      width: arr[0][0], 
      height: arr[0][1] 
      }, function() { 
      arr.reverse() 
      }); 
    }) 

jsfiddle https://jsfiddle.net/wykL6u7u/14/

1

Così, dopo averci pensato su ho fatto in questo modo. Fa 2 calcoli per scoprire la percentuale della larghezza e dell'altezza della griglia e fa un animato basato su quello. L'ho impostato per espandere e contrarre in base al clic della griglia, ma se si desidera utilizzare il pulsante basta cambiare il bind di clic sull'ID pulsanti indietro.

$('.grid').click(function() { 
    var heightPercentage = (100 * parseFloat($('.grid').css('height'))/parseFloat($('.grid').parent().css('height'))) + '%'; 
    var widthPercentage = (100 * parseFloat($('.grid').css('width'))/parseFloat($('.grid').parent().css('width'))) + '%'; 
    var toggleWidth = widthPercentage === "100%" ? "33%" : "100%"; 
    var toggleHeight = heightPercentage === "100%" ? "50%" : "100%"; 
    $('.grid').animate({ 
    width: toggleWidth, 
    height: toggleHeight 
    });  
}); 

https://jsfiddle.net/bgarrison25/o7k2y25q/1

+0

Quello funziona ... perché non pubblicare quello invece del link interrotto? Non importa, lo hai già cambiato per te +1 per lo sforzo (ora funziona) :) –

+0

Scusa per la confusione ... sto lavorando allo stesso tempo in cui rispondo .... probabilmente non è la migliore combinazione ... tecnicamente è possibile rimuovere l'aggiunta del segno di percentuale e quindi cercare "100" anziché "100%" ma ho pensato che fosse leggibile non era un grosso problema –

+0

BTW il motivo per cui preferisco questo a differenza della risposta selezionata è perché Preferirei avere la retrocompatibilità offerta da Jquery invece di gestire tutti i problemi di compatibilità della transizione css3. –

Problemi correlati