2016-04-19 17 views
7

Sto provando a creare un cursore di immagini (precedente/successivo) in modo che le immagini scorrano verso sinistra quando faccio clic su "precedente" ea destra quando faccio clic su "Avanti" con 0,5s di lentezza, quindi ci vuole un po 'di animazione. E quando raggiungo l'ultima immagine e clicco su "avanti", voglio che le immagini "scorrano all'indietro" al primo, lo stesso quando sono nel primo e clicco su "precedente", quindi "avanza" fino a quando il l'ultimo.Cursore delle immagini con altezza non definita

Voglio lo stesso comportamento this JSFiddle spettacoli. (ma non ho bisogno del timer per spostare le immagini automaticamente e non ho bisogno dei pulsanti "grilletti", solo "precedente" e "successivo").

Il problema qui è che le mie immagini non hanno dimensioni fisse. Definisco una larghezza in percentuale e non posso definire un'altezza perché ho un design reattivo, l'immagine viene ridimensionata mentre ridimensiono la finestra del browser.

Il jQuery per le azioni precedenti/successive è piuttosto semplice, ma non riesco a trovare un modo per aggiungere questa animazione quando rimuovo/aggiungo la classe "attiva" alle mie immagini (in modo che diventino visibili o meno).

Ho già provato a mettere tutte le immagini una accanto all'altra e mostrare solo la prima (l'impostazione della larghezza del contenitore equivale alla larghezza dell'immagine), quindi quando faccio clic su "Avanti", "sposta" il contenitore a sinistra in modo che inizi per visualizzare l'immagine successiva, ma non funziona perché una volta che non riesco a definire l'altezza delle immagini, esse appariranno una sotto l'altra, non una accanto all'altra.

JSFiddle

HTML

<div class="images"> 
    <img class="active" src="1.jpg"> 
    <img src="2.jpg"> 
    <img src="3.jpg"> 
</div> 

<div class="previous">previous</div> 

<div class="next">next</div> 

CSS

img { 
    width: 100px; 
    display: none; 
    float: left; 
} 

img.active { 
    display: block; 
} 

jQuery

$('.next').on('click', function() { 
    var active = $('img.active'); 
    var next = active.next('img'); 

    if (next.length) { 
     active.removeClass('active'); 
     next.addClass('active'); 
    } else { 
     active.removeClass('active'); 
     $('.images img:first').addClass('active'); 
    } 
}); 
+0

Se si desidera un effetto di scorrimento, perché non si dovrebbe spostare ogni immagine a sinistra, quindi utilizzare la transizione css3 in 'img.active' per ottenere ogni immagine attiva su' left: 0px; 'ho limitato css3 - animazione abilità ma è il concetto che vedo le persone usano. – ArchNoob

risposta

0

ho finalmente arrivato.

HERE è il violino con la soluzione che ho sviluppato.

Il problema principale nell'implementazione di questo cursore immagine era che le immagini, sebbene fossero tutte della stessa dimensione, hanno larghezza dinamica (definita in % su CSS) e altezza dinamica (non definita su CSS).

La soluzione è stata fondamentalmente collocata un'immagine "falsa" (con opacity: 0) nel mio contenitore in modo che il contenitore ottenga la dimensione effettiva delle immagini che utilizzerò nel dispositivo di scorrimento; metti un div per "tenere" le immagini reali con position: absolute e assegnagli una larghezza calcolata da number of images * 100%; e per ultimo, dai a ciascuna immagine del mio slider una larghezza di x%, in base al numero di immagini.

Nella jQuery, "spostare" il "divisore di immagini" sempre da %, mai da valori statici, una volta che la larghezza di tutto può cambiare se ridimensiono la finestra.

Se si inizia a far scorrere le immagini a sinistra ea destra e quindi ridimensionare la finestra, si vedrà che continua a funzionare perfettamente.

0

Forse non è la situazione ideale ma almeno ti darà un'idea. puoi usare la funzione di animazione di jQuery e ho anche cambiato un po 'il tuo codice. Vedere demo here

Entro il codice HTML, direi che questo:

<div id="images"> 
    <div class="images-wrapper"> 
     <img src="http://www.cutestpaw.com/wp-content/uploads/2016/02/In-the-spotlight.jpg"> 
     <img src="http://www.cutestpaw.com/wp-content/uploads/2016/02/Bath-time-with-ducky.jpg"> 
     <img src="http://www.cutestpaw.com/wp-content/uploads/2016/03/FB_IMG_1452981788903.jpg"> 
     <img src="http://www.pictures-of-cats.org/images/Pixiebob-cat-list-of-cat-breeds-pictures-of-cats.jpg" /> 
    </div>  
</div> 

<div class="previous"> 
    previous 
</div> 

<div class="next"> 
    next 
</div> 

e nel rispetto del codice jQuery è possibile animare la larghezza:

$('.images-wrapper img:gt(0)').hide(); 

$('.next').click(function() { 
    $('.images-wrapper img:first-child').animate({width:'toggle'},350).next().fadeIn().end().appendTo('.images-wrapper'); 
}); 

$('.previous').click(function() { 
    $('.images-wrapper img:first-child').animate({width:'toggle'},350); 
    $('.images-wrapper img:last-child').prependTo('.images-wrapper').fadeOut(); 
    $('.images-wrapper img:first-child').fadeIn(); 
}); 

Con questa implementazione l'intero processo di modifica e aggiungendo la active classe per l'immagine viene rimosso e sostituito da funzioni di animazione

+0

Grazie, ma questo non mi va bene, una volta che non c'è animazione "scorrevole" da un lato all'altro. –

-1

Ho implementato utilizzando css3 ani mazioni. Tuttavia, ciò richiederà la modifica dei valori di animazione in CSS ogni volta che una diapositiva viene aggiunta o rimossa.

@keyframes slideAnim { 
    0% { 
    transform: translateX(0) 
    } 
    12.5% { 
    transform: translateX(0%); 
    } 
    25% { 
    transform: translateX(-25%); 
    } 
    37.5% { 
    transform: translateX(-25%) 
    } 
    50% { 
    transform: translateX(-50%) 
    } 
    62.5% { 
    transform: translateX(-50%) 
    } 
    75% { 
    transform: translateX(00%); 
    } 
    89.5% { 
    transform: translateX(00%) 
    } 
    100% { 
    transform: translateX(00%) 
    } 
} 

Qui i valori di animazione sono impostati in modo tale che vi sia una pausa tra le transizioni della diapositiva. Ho aggiunto un frame principale per mostrare solo una diapositiva alla volta.

Si prega di fare riferimento a questo fiddle.

5

Bene, il problema è l'altezza per lo scorrimento.

Per prima cosa è necessario disporre di un elemento che sia la "cornice dell'immagine" che contiene tutte le altre immagini. È importante. Per una migliore immaginazione un'immagine:

Picture Frame example

Ora si hanno diverse tecniche per mostrare e nascondere le immagini. Uno potrebbe essere quello di impostare l'opacità. Quando si usa transition: opacity .15s ease-in-out; L'immagine si sta dissolvendo e quella successiva si sta sbiadendo.

Per l'effetto di presentazione viene assegnato alla posizione dell'immagine visibile alla sua larghezza a sinistra e l'immagine precedentemente puramente nuova alla sua larghezza a a destra, quindi a 0. Quindi, sposta l'immagine corrente a sinistra e il nuovo esce.

Ed ecco la difficoltà se l'altezza non è la stessa. Se l'immagine attuale è alta 300 px e la nuova 400 px, quindi la cornice dell'immagine qui regolerà immediatamente la sua altezza una volta che la nuova immagine inizierà a essere visibile.

Il contenuto seguente inizia a saltare a ogni diapositiva.

È così desiderato ???

Se sì, posso farti un esempio di come funziona.

5

Si può effettivamente fare questo in Pure CSS!

Si utilizza un ID e un'etichetta (con un attributo for = per l'id mirata)

Questo è fondamentalmente. Tutto quello che ti rimane è di stile! (Forcella da Penna Joshua Hibbert s')

body { 
 
    background: #f7f4e2; 
 
} 
 

 
/* Slides */ 
 
.slider input { 
 
    display: none; 
 
} 
 

 
/* Buttons */ 
 
.slider label { 
 
    display: none; 
 
    cursor: pointer; 
 
    position: absolute; 
 
    top: 6em; 
 
    left: 50%; 
 
    transform: translateX(-50%); 
 
    color: #fff; 
 
    background: #000; 
 
    padding: 1.36em .5em; 
 
    opacity: .6; 
 
    font-size: 19px; 
 
    font-family: fantasy; 
 
    font-weight: bold; 
 
    transition: .25s; 
 
} 
 
.slider label:hover { 
 
    opacity: 1; 
 
} 
 
.previous { 
 
    margin-left: -188px; 
 
} 
 
.next { 
 
    margin-left: 188px; 
 
} 
 

 
#slide1:checked ~ .buttons .slide1 { 
 
    display: block; 
 
} 
 
#slide2:checked ~ .buttons .slide2 { 
 
    display: block; 
 
} 
 
#slide3:checked ~ .buttons .slide3 { 
 
    display: block; 
 
} 
 
#slide4:checked ~ .buttons .slide4 { 
 
    display: block; 
 
} 
 

 
/* Images */ 
 
.slider { 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    width: 400px; 
 
    height: 300px; 
 
    margin-top: -150px; 
 
    margin-left: -200px; 
 
    white-space: nowrap; 
 
    padding: 0; 
 
    float: left; 
 
    transition: .25s; 
 
    overflow: hidden; 
 
    box-shadow: 0 0 0 3.12px #e8e8e8, 
 
       0 0 0 12.64px #eaebe4, 
 
       0 0 0 27.12px #000, 
 
       0 24px 3.824em 5.12px #000; 
 
} 
 
.slide { 
 
    width: 500em; 
 
    transition: .25s; 
 
} 
 
.slider img { 
 
    float: left; 
 
    width: 400px; 
 
    height: 300px; 
 
} 
 

 
#slide1:checked ~ .slide { 
 
    margin: 0; 
 
} 
 
#slide2:checked ~ .slide { 
 
    margin: 0 0 0 -400px; 
 
} 
 
#slide3:checked ~ .slide { 
 
    margin: 0 0 0 -800px; 
 
} 
 
#slide4:checked ~ .slide { 
 
    margin: 0 0 0 -1200px; 
 
}
<div class="slider"> 
 
    <input type="radio" name="slide" id="slide1" checked="true" /> 
 
    <input type="radio" name="slide" id="slide2" /> 
 
    <input type="radio" name="slide" id="slide3" /> 
 
    <input type="radio" name="slide" id="slide4" /> 
 
    
 
    <div class="buttons"> 
 
    <!-- Slide 1 --> 
 
    <label for="slide4" class="slide1 previous">&lt;</label> 
 
    <label for="slide2" class="slide1 next">&gt;</label> 
 
    
 
    <!-- Slide 2 --> 
 
    <label for="slide1" class="slide2 previous">&lt;</label> 
 
    <label for="slide3" class="slide2 next">&gt;</label> 
 
    
 
    <!-- Slide 3 --> 
 
    <label for="slide2" class="slide3 previous">&lt;</label> 
 
    <label for="slide4" class="slide3 next">&gt;</label> 
 
    
 
    <!-- Slide 4 --> 
 
    <label for="slide3" class="slide4 previous">&lt;</label> 
 
    <label for="slide1" class="slide4 next">&gt;</label> 
 
    </div> 
 

 
    <div class="slide"> 
 
    <img src="http://dribbble.s3.amazonaws.com/users/322/screenshots/872485/coldchase.jpg"> 
 
    <img src="http://dribbble.s3.amazonaws.com/users/322/screenshots/980517/icehut_sm.jpg"> 
 
    <img src="http://dribbble.s3.amazonaws.com/users/322/screenshots/943660/hq_sm.jpg"> 
 
    <img src="http://dribbble.s3.amazonaws.com/users/322/screenshots/599584/home.jpg"> 
 
    </div> 
 
</div>

Anche se questo metodo è il più compatibile (tranne che per le vecchie versioni di IE) ed a seconda di come si anima in questo metodo può essere più tempo di un metodo JS, ma può anche essere più veloce, dipende solo da come si desidera che le animazioni vadano, oppure è possibile utilizzare uno css library that does this for you.

Ecco alcuni cursori di immagine CSS che consiglio.

10 Amazing Pure CSS3 Image Sliders
http://bashooka.com/coding/pure-css3-image-sliders/

Pure CSS Image Slider Without Javascript #Codeconvey è una buona soluzione per quello che stai cercando, ma un sacco di CSS
http://codeconvey.com/pure-css-image-slider/

L'aspetto negativo di questi insieme a quello che si sta lavorando è che non puoi toccare per scorrere su un telefono o tablet che è più comune ora un giorno con gallerie fotografiche.

Consiglio di controllare Fotorama è incredibile! :)

0

La soluzione più semplice (credo) è quella di forzare gli articoli ad avere le stesse dimensioni, inserendoli in un div.È anche possibile che il div mostri l'immagine senza l'uso di un tag img, utilizzando la funzione CSS background-image (vedere http://www.w3schools.com/css/css3_backgrounds.asp per ulteriori dettagli).

Il CSS articolo potrebbe sembrare:

.item { 
    background-size: contain; 
    background-position: center; 
} 

e in ogni elemento nel codice HTML:

<div class='item' style='background-image: url(img1.jpg)' /> 
<div class='item' style='background-image: url(img2.jpg)' /> 
<div class='item' style='background-image: url(img3.jpg)' /> 
Problemi correlati