2011-10-22 2 views
32

http://jsfiddle.net/nicktheandroid/tVHYg/animare la larghezza di un elemento da 0 a 100%, con esso ed è involucro essendo solo larga quanto hanno bisogno di essere, senza una larghezza prefissata, in CSS3 o jQuery

Quando bilico .wrapper, è bambino l'elemento .contents dovrebbe animare da 0px alla sua larghezza naturale. Quindi, quando il mouse viene rimosso da .wrapper, dovrebbe tornare a 0px. L'elemento .wrapper deve essere ampio solo quanto deve essere (consentendo a .contents di crescere), quindi .wrapper dovrebbe crescere in larghezza e ridursi in larghezza come fa .contents. Non dovrebbe esserci alcuna larghezza impostata per .contents. Sto usando CSS3, ma potrebbe essere realizzato in jQuery, sarebbe perfetto.

Il problema: Vedere il JSfiddle

  1. .wrapper non è solo così ampio come ha bisogno di essere.
  2. quando .contents cresce, quando è quasi al suo larghezza, salta giù alla riga successiva
  3. Quando si libra al largo di .wrapper, .contents svanisce, quando dovrebbe animare fino a 0px

.wrapper { 
 
    display: inline-block; 
 

 
    height: 20px; 
 
    width: auto; 
 
    
 
    padding:10px; 
 
    
 
    background:#DDD; 
 
} 
 

 
.contents { 
 
    display:inline-block; 
 
    
 
    width:0%; 
 
    
 
    white-space:nowrap; 
 
    overflow:hidden; 
 
    
 
    background:#c3c; 
 
} 
 

 
.wrapper:hover .contents { 
 
    -webkit-transition: width 1s ease-in-out; 
 
    -moz-transition: width 1s ease-in-out; 
 
    -o-transition: width 1s ease-in-out; 
 
    transition: width 1s ease-in-out; 
 

 
    width:100%; 
 
}
<div class="wrapper"> 
 
    <span>+</span> 
 
    <div class="contents">These are the contents of this div</div> 
 
</div>

+2

# 3 è facile: spostare gli stili di transizione per '.contents'. – eyelidlessness

risposta

38

Penso di averlo capito. http://jsfiddle.net/tVHYg/4/

Animare al 100% fa sì che per avvolgere perché la casella è più grande della larghezza disponibile (100% meno il + e gli spazi lo seguono).

Invece, è possibile animare un elemento interno, di cui 100% corrisponde alla larghezza totale di .contents.

+2

COSÌ vicino, l'ultima cosa da fare è ottenere '.wrapper' per ottenere una larghezza maggiore e minore a seconda delle necessità, ci sto provando da un po 'ma non riesco a ottenerlo. Questo era il numero 1 nella lista, forse non l'ho spiegato molto bene. Quindi il wrapper dovrebbe essere grande quanto il "+" con uguale imbottitura su tutti i lati. Quindi '.wrapper' cresce di larghezza come fa '.contents'. Pensavo che sarebbe stato semplicissimo, ma ho avuto così tanti problemi. –

+0

@ android.nick questo funziona come vuoi, ma non riesco a capire la parte float/alignment ... vedrai: http://jsfiddle.net/wxh6kc71/ – MaxOvrdrv

+0

@ android.nick hey questo è ancora meglio penso! http://jsfiddle.net/9vezn2g7/ – MaxOvrdrv

7

http://jsfiddle.net/tVHYg/5/

.wrapper { 
    background:#DDD; 
    padding:1%; 
    display:inline; 
    height:20px; 
} 


span { 
    width: 1%; 
} 

.contents { 
    background:#c3c; 
    overflow:hidden; 
    white-space:nowrap; 
    display:inline-block; 
    width:0%; 
} 



.wrapper:hover .contents { 
    -webkit-transition: width 1s ease-in-out; 
    -moz-transition: width 1s ease-in-out; 
    -o-transition: width 1s ease-in-out; 
    transition: width 1s ease-in-out; 

    width:90%; 
} 
+1

Quasi, dovrebbe animare solo a una larghezza ampia quanto il contenuto, non più di quello comunque. Ottenere tutto questo per funzionare perfettamente è più difficile di quanto pensassi. –

-2

non sono stato in grado di farlo funzionare senza specificare una larghezza ma il seguente css lavorato

.wrapper { 
    background: #DDD; 
    padding: 10px; 
    display: inline-block; 
    height: 20px; 
    width: auto; 
} 

.contents { 
    background: #c3c; 
    overflow: hidden; 
    white-space: nowrap; 
    display: inline-block; 
    visibility: hidden; 
    width: 1px; 
    -webkit-transition: width 1s ease-in-out, visibility 1s linear; 
    -moz-transition: width 1s ease-in-out, visibility 1s linear; 
    -o-transition: width 1s ease-in-out, visibility 1s linear; 
    transition: width 1s ease-in-out, visibility 1s linear; 
} 

.wrapper:hover .contents { 
    width: 200px; 
    visibility: visible; 
} 

io non sono sicuro che sarete in grado di ottenere funziona senza impostare una larghezza su di esso.

4

Ottenuto il lavoro passando la spaziatura e la larghezza.

JSFiddle: http://jsfiddle.net/tuybk748/1/

<div class='label gray'>+ 
</div><!-- must be connected to prevent gap --><div class='contents-wrapper'> 
    <div class="gray contents">These are the contents of this div</div> 
</div> 
.gray { 
    background: #ddd; 
} 
.contents-wrapper, .label, .contents { 
    display: inline-block; 
} 
.label, .contents { 
    overflow: hidden; /* must be on both divs to prevent dropdown behavior */ 
    height: 20px; 
} 
.label { 
    padding: 10px 10px 15px; 
} 
.contents { 
    padding: 10px 0px 15px; /* no left-right padding at beginning */ 
    white-space: nowrap; /* keeps text all on same line */ 
    width: 0%; 
    -webkit-transition: width 1s ease-in-out, padding-left 1s ease-in-out, 
     padding-right 1s ease-in-out; 
    -moz-transition: width 1s ease-in-out, padding-left 1s ease-in-out, 
     padding-right 1s ease-in-out; 
    -o-transition: width 1s ease-in-out, padding-left 1s ease-in-out, 
     padding-right 1s ease-in-out; 
    transition: width 1s ease-in-out, padding-left 1s ease-in-out, 
     padding-right 1s ease-in-out; 
} 
.label:hover + .contents-wrapper .contents { 
    width: 100%; 
    padding-left: 10px; 
    padding-right: 10px; 
} 
+0

Il wrapper ha larghezza. Occupa lo spazio comunque, anche se non ci sono contenuti in esso. – Green

+0

@Chris Middleton, per i calci, volevo provare questo da destra a sinistra, ma non ho ancora trovato il modo corretto. – Chris22