2015-06-19 11 views
8

Ho progettato un'icona a 3 barre utilizzando puro codice SVG in HTML. Sto usando trasformazioni CSS3 per ruotare le barre in basso & in una forma X. Il problema è che ruotano attorno al loro centro, ma ho bisogno che ruotino attorno al centro dell'icona. Per aggirare questo ho regolato le loro coordinate X/Y.Ruota un'icona di hamburger SVG in una X?

Questo causa un sacco di problemi con Buggy Internet Explorer, Firefox, & Safari. Chrome sembra essere a posto, ma ovviamente mi piacerebbe codificare questo modo "giusto" in modo che funzioni su tutti i browser.

Here's my live CodePen

HTML

<svg id="burgericon" xmlns="http://www.w3.org/2000/svg" width="90" height="80"> 
    <g class="icon"> 
    <rect class="frstbar" x="10" y="10" width="70" height="12" rx="7" ry="7" fill="#414141"/> 
    <rect class="scndbar" x="10" y="35" width="70" height="12" rx="7" ry="7" fill="#414141"/> 
    <rect class="thrdbar" x="10" y="60" width="70" height="12" rx="7" ry="7" fill="#414141"/> 
    </g> 
</svg> 

CSS

.hamburger { display:block; text-align:center; } 
svg { cursor:pointer; } 

.frstbar, .scndbar, .thrdbar { 
    -webkit-transition: all 0.35s linear; 
    -moz-transition: all 0.35s linear; 
    -o-transition: all 0.35s linear; 
    transition: all 0.35s linear; 
} 
#burgericon.open .frstbar { 
    -webkit-transform: rotate(45deg); 
    -ms-transform: rotate(45deg); 
    transform: rotate(45deg); 
} 
#burgericon.open .thrdbar { 
    -webkit-transform: rotate(-45deg); 
    -ms-transform: rotate(-45deg); 
    transform: rotate(-45deg); 
} 
#burgericon.open .scndbar { width: 0; opacity: 0; } 

JS

$('#burgericon').on('click', function(e) { 

    if($(this).attr('class') != "open") { 
     $(this).attr('class','open'); 
     $('.frstbar').attr('x','25').attr('y','-5'); 
     $('.thrdbar').attr('x','-35').attr('y','55'); 
    } 
    else { 
    $(this).attr('class','default'); 
    $('.frstbar').attr('x','10').attr('y','10'); 
     $('.thrdbar').attr('x','10').attr('y','60'); 
    } 
}); 

Penso anche cambiare la X/Y coordinate sta causando un effetto sfocato. Ho aggiunto uno screenshot qui sotto. Per prima cosa vedrai l'icona X completata e poi vedrai come appare quando ritorna al valore predefinito.

Le barre non sono perfettamente diritte ma invece sembrano sgualcite per qualche motivo.

Screenshot here

Sono ancora nuovo per la manipolazione SVG, quindi non sono sicuro di come ruotare correttamente <rect> elementi con CSS3/JS. Qualsiasi aiuto o consiglio nella giusta direzione sarebbe più che apprezzato.

+0

codepen probabilmente non è il miglior sito demo per errori dovuto alla sua funzione di salvataggio automatico. Sarebbe possibile pubblicare il tuo markup anche qui (per i futuri lettori?) – jbutler483

+1

È strano ...anche in Chrome, se provassi più volte, alcuni non funzioneranno ... – vals

+0

Non penso che la ** linear ** 'transition-timing-function' dia il tempo di transizione per terminare correttamente. Passare al metodo predefinito ** easy ** sembra risolverlo nei miei test limitati. – andyb

risposta

8

è possibile rimuovere il posizionamento JS usando il CSS transform-origin property. Puoi impostarlo a sinistra della prima e della seconda battuta con transform-origin: 0 50%;.

questo modo potranno incrociarsi quando vengono ruotate:

document.getElementById('burgericon').addEventListener('click', function (e) { 
 
    this.classList.toggle('open'); 
 
});
.hamburger { 
 
    display: block; 
 
    text-align: center; 
 
} 
 
svg { 
 
    cursor: pointer; 
 
} 
 
.frstbar,.scndbar,.thrdbar { 
 
    transition: all 0.35s linear; 
 
    transform: rotate(0deg); 
 
    transform-origin: 0% 50%; 
 
} 
 
#burgericon.open .frstbar { 
 
    transform: rotate(45deg); 
 
} 
 
#burgericon.open .thrdbar { 
 
    transform: rotate(-45deg); 
 
} 
 
#burgericon.open .scndbar { 
 
    width: 0; 
 
    opacity: 0; 
 
}
<nav class="hamburger"> 
 
    <svg id="burgericon" xmlns="http://www.w3.org/2000/svg" width="90" height="80"> 
 
    <g class="icon"> 
 
     <rect class="frstbar" x="10" y="10" width="70" height="12" rx="7" ry="7" fill="#414141" /> 
 
     <rect class="scndbar" x="10" y="35" width="70" height="12" rx="7" ry="7" fill="#414141" /> 
 
     <rect class="thrdbar" x="10" y="60" width="70" height="12" rx="7" ry="7" fill="#414141" /> 
 
    </g> 
 
    </svg> 
 
</nav> 
 
<div> 
 
</div>

crediti verso David Thomas per il JS

notare che la proprietà transform-origin bisogno gli stessi vendor prefix come la proprietà transform. Li ho omessi per entrambi nel frammento di cui sopra

+0

Soluzione jquery semplice e piacevole: P – Persijn

+1

È anche altrettanto semplice (se non di più) con JavaScript semplice: [JS Fiddle demo] (http://jsfiddle.net/ davidThomas/gog3e1ae /). –

+0

Questo sembra più pulito ma sai perché non funzionerà in IE? Sto testando sull'ultimo IE11 entrambi i codici da web-tiki e @DavidThomas ma IE sembra problematico. So che è fastidioso e mi piacerebbe rinunciare al supporto in IE, ma sembra anche buggy in FireFox. [jsFiddle] (http://jsfiddle.net/9xjkejbo/) –

5

CSS

Uso css transform: rotate() I ruotato gli elementi in modo da formare il X
Uso css opacity e transizioni; ha reso l'oggetto gradualmente trasparente.

.icon { 
 
    stroke: none; 
 
    fill: #777; 
 
} 
 
.icon .frstbar { 
 
    transform-origin: 10% 50%; 
 
    transition: transform 1s; 
 
} 
 
.icon:hover .frstbar { 
 
    transform: rotate(45deg); 
 
} 
 
.icon .thrdbar { 
 
    transform-origin: 10% 50%; 
 
    transition: transform 1s; 
 
} 
 
.icon:hover .thrdbar { 
 
    transform: rotate(-45deg); 
 
} 
 
.scndbar { 
 
    opacity: 1; 
 
    transition: opacity 1s; 
 
} 
 
.icon:hover .scndbar { 
 
    opacity: 0; 
 
}
<svg id="burgericon" xmlns="http://www.w3.org/2000/svg" width="90" height="90" viewBox="0 0 100 100"> 
 
    <g class="icon"> 
 
    <rect class="frstbar" x="10" y="10" width="90" height="12" rx="7" ry="7" /> 
 
    <rect class="scndbar" x="10" y="35" width="90" height="12" rx="7" ry="7" /> 
 
    <rect class="thrdbar" x="10" y="60" width="90" height="12" rx="7" ry="7" /> 
 
    </g> 
 
</svg>

+0

Grazie! Posso capire perché hai rimosso JS per semplificare. Ma ho notato che anche questa soluzione diventa fastidiosa in Firefox - qualche idea del perché? Anche il supporto del browser moderno e aggiornato sembra impossibile. Ecco uno [screenshot di Firefox] (http://i.imgur.com/E6TycUs.jpg) dalla tua demo insieme a una [jsFiddle demo] (http://jsfiddle.net/f88jvro5/) –

+0

Hey Persijn suppongo che dovresti aggiungi gli stili di passaggio del mouse su svg anziché sul gruppo, come quando passi il mouse tra i tratti, l'hover non si attiva! –

+0

@TimKrul naaaaa mi piace in questo modo: D – Persijn