2012-10-22 17 views
13

Come posso animare la pagina: cambiare con i turbolinks?pagina animata: modifica con turbolinks

È possibile?

Ho provato una transizione css sul corpo ma non ha funzionato come previsto. Non so come aggiornare solo una parte della finestra e fatto una richiamata quando è finita, o se è addirittura possibile.

Grazie in anticipo

risposta

13

Qualcosa di simile potrebbe funzionare (in CoffeeScript utilizzando jQuery):

$(document).on 'page:fetch', -> 
    $('#content').fadeOut 'slow' 

$(document).on 'page:restore', -> 
    $('#content').fadeIn 'slow' 

Si potrebbe anche usare le animazioni CSS o JavaScript alcuni più complicato. Here's a great post che approfondisce con alcuni esempi e demo.

Inoltre, mi sono imbattuto in un turbolink transitions ruby gem (che non ho testato).

+15

LOL, questo è quello che ho fatto per risolvere questo problema, e anche la gemma è stata creata da me =) – caarlos0

+2

Avrei dovuto notare che era lo stesso soprannome. È piuttosto divertente. haha. –

+0

Sì, haha, beh, almeno il problema è risolto. – caarlos0

3

Non si può davvero aggiornare solo una parte della finestra con turbolinks, si consiglia di utilizzare pjax invece. Ma potresti fare alcune cose complicate per far sembrare che stia cambiando e aggiornando solo parte della pagina con i turbolinks.

Ho una pagina di indice che elenca alcuni articoli e se si fa clic su un elemento si passa alla pagina di presentazione. Ma dalla pagina dello show voglio ancora essere in grado di navigare direttamente alle pagine degli show degli altri oggetti. Nella pagina indice l'elenco degli elementi è largo sei colonne e lo animo per essere più ristretto nella pagina dello spettacolo per fare spazio ai dettagli.

// items.css.sass 
.width-trans 
    +transition(width 400ms ease-in) 

Definire una semplice classe CSS per il passaggio delle modifiche alla larghezza dell'elemento.

<!-- index.html.erb -> 
<div id="target_div" class="width-trans six columns"> 
    <%= link_to "Item", 
       item_path(@item.id), 
       :'data-no-turbolink' => true, 
       :class => 'trans' %> 
</div> 

Abbiamo set di dati-no-TurboLink true sui link stiamo transizione dal modo che possiamo avere un po 'più di controllo.

# items.js.coffee 
$(document).on 'page:restore', (e) -> 
    if window.location.href.match(/\/items\/\d$/) || window.location.href.match(/\/items$/) 
    $("#target_div").removeClass("three").addClass("six") 
    else 
    $("#target_div").removeClass("six").addClass("three") 

target_page = undefined # Sorry, this 'target_page' stuff is a little janky. 

if Modernizr.csstransitions 
    eventEndNames = 
    'WebkitTransition': 'webkitTransitionEnd' 
    'MozTransition': 'transitionend' 
    'OTransition':  'oTransitionEnd' 
    'msTransition':  'MSTransitionEnd' 
    'transition':  'transitionend' 

    eventName = eventEndNames[Modernizr.prefixed('transition')] 

    $(document).on eventName, '#target_div',() -> 
    Turbolinks.visit(target_name) if target_page 
    target_page = undefined 

$(document).on 'click', '.trans', (e) -> 
    e.preventDefault() 

    target_name = e.target.href 
    $(e.target).closest("#target_div").toggleClass("three six") 
    false 

Okay, questo è un po 'pazzo e forse possiamo trovare un modo più generale di fare questo. Ma ecco il malconcio su cosa sta succedendo:

Abbiamo disabilitato i Turbolink sui nostri link .trans in modo che Turbolinks non recuperi immediatamente la nuova pagina (diremo esplicitamente a Turbolinks quando recuperarlo). Quando facciamo clic su un collegamento .trans, si cerca #target_div e si alternano le classi .six e .three. Io uso Foundation, quindi tre e sei fanno parte del mio sistema di griglia e definiscono la larghezza dei miei div .. quindi quando cambio da sei a tre questo cambia la larghezza.

Che attiva la transizione CSS, #target_div si riduce in larghezza e poi spegne l'evento di fine transizione. Al termine della transizione, chiamiamo Turbolinks.visit() sul nostro URL di destinazione.

Il #target_div deve essere visualizzato sia dall'indice che dalle azioni di visualizzazione. Abbiamo la parte che ascolta la pagina: ripristina quale imposta le colonne di # target_div a sei o tre a seconda dell'azione che lo sta eseguendo.

Il risultato finale è che #target_div sembra animare come stiamo cambiando le pagine, ma in realtà si tratta di transizione prima cambiamo pagine e entrambe le pagine rendiamo lo stesso div solo nei suoi diversi stati.

+0

troppo lavoro/codice per non tanto la funzionalità. Ma grazie comunque. – caarlos0

+0

Sì, sono d'accordo. Ecco perché ho detto in anticipo che questo potrebbe probabilmente essere trasformato in qualcosa di più generalizzato; forse qualcuno sarà interessato abbastanza da scrivere un plugin riutilizzabile basato su di esso o qualcosa del genere. – bratsche

+0

Oh, e come ho detto all'inizio del commento ... potresti prendere in considerazione l'utilizzo di pjax. È un po 'più flessibile e ti permetterà di aggiornare sezioni specifiche della pagina. Questo è anche ciò che Github usa e si animano tra le pagine con esso. – bratsche

0

Forse questo http://turbolinks-transitions.herokuapp.com/ è più vicino a quello che volevi. Aspettatevi questa funzionalità nelle versioni future dei turbolinks ... o rendete il futuro più vicino inventandolo e contribuendo)

+1

Grazie per il link, ma S.O. mira a raccogliere la risposta effettiva alla domanda qui, e non solo un link a dove la risposta potrebbe essere trovata. Per favore considera di scrivere una spiegazione o un riassunto di quale parte del post sarebbe applicabile alla domanda (dichiaratamente a risposta aperta). – beroe

+0

@beroe Se segui il collegamento fornito, vedrai che non si tratta di un post, ma di un esempio di animazione di transizione della pagina. –

+0

Che ancora non si adatta al modo in cui S.O. sollecita risposte È la loro politica, non la mia, e stavo solo cercando di aiutarti a evitare i downvotes. Avrei dovuto collegarmi a [questa pagina] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) nel mio commento originale. – beroe

Problemi correlati