Puoi usare CSS per specchiare / capovolgere il testo?


235

È possibile utilizzare CSS / CSS3 per eseguire il mirroring del testo?

In particolare, ho questo carattere a forbice “✂” ( ✂) che vorrei visualizzare puntando a sinistra e non a destra.


9
Se l'immagine delle forbici per qualche motivo non funziona per te, l'ho vista falsificata con% <e>%
Pete Wilson


3
La risposta di Micheal è più accurata. Potete per favore aggiornare la risposta corretta? Perché la risposta che hai contrassegnato come corretta non è specchio ma rotazione di 180 gradi.
Sanket Sahu,

@PeteWilson,? Il carattere so è così comune? A cosa serve?
Pacerier,

4
Tieni presente che la rotazione è diversa a seconda dell'implementazione delle emoji. Sul set di emoji Apples è rivolto verso il basso.
Akkumulator il

Risposte:


411

È possibile utilizzare le trasformazioni CSS per raggiungere questo obiettivo. Una rotazione orizzontale implicherebbe il ridimensionamento del div in questo modo:

-moz-transform: scale(-1, 1);
-webkit-transform: scale(-1, 1);
-o-transform: scale(-1, 1);
-ms-transform: scale(-1, 1);
transform: scale(-1, 1);

E una rotazione verticale implicherebbe il ridimensionamento del div in questo modo:

-moz-transform: scale(1, -1);
-webkit-transform: scale(1, -1);
-o-transform: scale(1, -1);
-ms-transform: scale(1, -1);
transform: scale(1, -1);

DEMO:

span{ display: inline-block; margin:1em; } 
.flip_H{ transform: scale(-1, 1); color:red; }
.flip_V{ transform: scale(1, -1); color:green; }
<span class='flip_H'>Demo text &#9986;</span>
<span class='flip_V'>Demo text &#9986;</span>


4
Questa dovrebbe essere la risposta corretta! (specchi lungo l'asse verticale, scala (1, -1) per asse orizzontale)
Design di Adrian

È sicuramente la risposta più conforme agli standard, sfortunatamente non viviamo in un mondo in cui questo funziona ancora per tutti i casi d'uso.
Chris Sobolewski,

Potresti includere gli effettivi prefissi del browser nella tua risposta, con l'ultimo non prefissato? Il CSS così come l'hai fornito non funziona.
Serrano,

@SerranoPereira in effetti, grazie per il suggerimento. Risposta modificata.
methodofaction

11
Nota che la trasformazione CSS non funziona su elementi inline come i tag <i> suggeriti da Foundation, a meno che tu non dia anche display: inline-block.
enigment

66
-moz-transform: scale(-1, 1);
-webkit-transform: scale(-1, 1);
-o-transform: scale(-1, 1);
-ms-transform: scale(-1, 1);
transform: scale(-1, 1);

I due parametri sono l'asse X e l'asse Y, -1 sarà uno specchio, ma è possibile ridimensionare a qualsiasi dimensione desiderata per soddisfare le proprie esigenze. Sottosopra e indietro sarebbe (-1, -1).

Se sei interessato alla migliore opzione disponibile per il supporto cross-browser nel 2011, vedi la mia risposta precedente .


21
Tecnicamente questo non è uno specchio. è ruotato. Quindi funzionerà solo con alcuni tipi di elementi
borisrorsvort il

4
Ho avuto dei problemi con Chrome fino a quando non ho aggiunto display: inline-block al mio span (usando i font pictos)
Clarence Liu,

1
Dato che quando questa domanda è stata posta, le trasformazioni del browser non erano ampiamente supportate, direi che questa era la risposta giusta. In realtà le trasformazioni non sono supportate fino a IE 9, quindi direi che questa è ANCORA la risposta giusta, almeno per un po 'di più.
Chris Sobolewski,

Questa risposta è sbagliata, non è uno specchio. Funziona solo in questo caso perché il simbolo fornito nell'esempio è verticalmente asimmetrico.
Gregregazap,

Anche se questo è utile in sé, non è la risposta alla domanda esatta fatta. Ho trovato questa domanda attraverso un motore di ricerca perché volevo capovolgere un'immagine in orizzontale. Non è simmetrico come le forbici degli OP.
Gillytech,

58

Specchio reale:

.mirror{
    display: inline-block; 
    font-size: 30px;

    -webkit-transform: matrix(-1, 0, 0, 1, 0, 0);
    -moz-transform: matrix(-1, 0, 0, 1, 0, 0);
    -o-transform: matrix(-1, 0, 0, 1, 0, 0);
    transform: matrix(-1, 0, 0, 1, 0, 0);
}
<span class='mirror'>Mirror Text<span>


14
Dovresti sempre mettere la proprietà conforme agli standard (senza prefisso) per ultima, in modo che quando lo standard viene adottato da un browser, utilizzerà la versione basata su standard invece della versione prefissata (precedente, buggier). In questo caso, ciò significa "trasforma: matrice (-1, 0, 0, 1, 0, 0);" dovrebbe essere l' ultima proprietà. (Modificato la risposta per riflettere questo.)
Jay Dansand

7
Non so se questo dovrebbe essere sulla risposta corretta o sulla domanda, ma voglio far conoscere agli utenti fontawesome / bootstrap le proprietà fa-flip-horizontalefa-flip-vertical
lol

1
Ottima risposta reale. Visualizza comunque: blocco; non necessariamente necessario.
Gilly

6
sì ... display: blocco; o blocco in linea è necessario
dGo

Questo è stato davvero utile per mantenere il corretto orientamento del testo della faccia posteriore di un elemento quando ruotato lungo l'asse Y. Per esempio:backface-visibility: visible; transform-origin: center center; transform-style: preserve-3d; transform: matrix(-1, 0, 0, 1, 0, 0) rotateY(180deg) ;
parlamento

12

Puoi anche l'utente

.your-class{ 
      position:absolute; 
      -moz-transform: scaleX(-1); 
      -o-transform: scaleX(-1); 
      -webkit-transform: scaleX(-1); 
      transform: scaleX(-1); 
      filter: FlipH;  
}

o

 .your-class{ 
  position:absolute;
  transform: rotate(360deg) scaleX(-1);
}

Notare che l'impostazione positionsu absoluteè molto importante! Se non lo imposterai, dovrai impostare display: inline-block;


7

Ho messo insieme questa soluzione perlustrando Internet, incluso

Questa soluzione sembra funzionare in tutti i browser incluso IE6 +, usando scale(-1,1)(un mirror corretto) e appropriate filter/ -ms-filterproperties quando necessario (IE6-8):

/* Cross-browser mirroring of content. Note that CSS pre-processors
  like Less cough on the media hack. 

  Microsoft recommends using BasicImage as a more efficent/faster form of
  mirroring, instead of FlipH or some kind of Matrix scaling/transform.
  @see http://msdn.microsoft.com/en-us/library/ms532972%28v=vs.85%29.aspx
  @see http://msdn.microsoft.com/en-us/library/ms532992%28v=vs.85%29.aspx
*/

/* IE8 only via hack: necessary because IE9+ will also interpret -ms-filter,
  and mirroring something that's already mirrored results in no net change! */
@media \0screen {
  .mirror {
    -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(mirror=1)";
  }
}
.mirror {
  /* IE6 and 7 via hack */
  *filter: progid:DXImageTransform.Microsoft.BasicImage(mirror=1);
  /* Standards browsers, including IE9+ */
  -moz-transform: scale(-1,1);
  -ms-transform: scale(-1,1);
  -o-transform: scale(-1,1); /* Op 11.5 only */
  -webkit-transform: scale(-1,1);
  transform: scale(-1,1);
}

6

Per la compatibilità tra browser, creare questa classe

.mirror-icon:before {
    -webkit-transform: scale(-1, 1);
    -moz-transform: scale(-1, 1);
    -ms-transform: scale(-1, 1);
    -o-transform: scale(-1, 1);
    transform: scale(-1, 1);
}

E aggiungilo alla tua classe di icone, ad es

<i class="icon-search mirror-icon"></i>

per ottenere un'icona di ricerca con la maniglia a sinistra


3

puoi usare 'trasforma' per raggiungere questo obiettivo. http://jsfiddle.net/aRcQ8/

css:

-moz-transform: rotate(-180deg);
-webkit-transform: rotate(-180deg);
transform: rotate(-180deg);

3

C'è anche il rotateYvero specchio:

transform: rotateY(180deg);

Che, forse, è ancora più chiaro e comprensibile.

EDIT: Sembra non funzionare su Opera però ... purtroppo. Ma funziona bene su Firefox. Immagino che potrebbe essere necessario dire implicitamente che stiamo facendo una specie di translate3dforse? O qualcosa di simile.


1
Per chi si chiede questa è una trasformazione 3D. Penso che sia sicuramente più leggibile / comprensibile rispetto ai metodi di scala e matrice indicati in precedenza.
Gregregazap,

Non vedo come una rotazione sia uno specchio, che sembrerebbe esserlo solo in un caso speciale.
cel sharp

@celsharp è sull'asse Y, quindi vedi l'immagine / l'elemento dalla sua parte posteriore, quindi, specchiata.
Jeromej,

1

Basta aggiungere una demo funzionante per il mirroring orizzontale e verticale.

.horizontal-flip {
  -moz-transform: scale(-1, 1);
  -webkit-transform: scale(-1, 1);
  -o-transform: scale(-1, 1);
  -ms-transform: scale(-1, 1);
  transform: scale(-1, 1);
}

.vertical-flip {
  -moz-transform: scale(1, -1);
  -webkit-transform: scale(1, -1);
  -o-transform: scale(1, -1);
  -ms-transform: scale(1, -1);
  transform: scale(1, -1);
}
<div class="horizontal-flip">
  Hello, World
  <input type="text">
</div>
<hr>
<div class="vertical-flip">
  Hello, World
  <input type="text">
</div>


0

questo è ciò per cui ha funzionato <span class="navigation-pipe">&gt;</span>

display:inline-block;
-moz-transform: rotate(360deg);
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=4);

basta solo visualizzare: blocco in linea o blocco per ruotare. Quindi sostanzialmente la prima risposta è buona. Ma -180 non ha funzionato.



0

Solo un altro esempio di come il personaggio potrebbe essere girato. Aggiungi prefissi fornitore se ne hai bisogno, ma per ora tutti i browser moderni supportano la proprietà di trasformazione non prefissata. L'unica eccezione è Opera se la modalità Opera Mini è abilitata (~ 3% utenti mondiali).

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Text rotation</title>
  <style type="text/css" media="screen">
    .scissors {
      display: inline-block;
      font-size: 50px;
      color: red;
    }
    .original {
      color: initial;
    }
    .flipped {
      transform: rotateZ(180deg);
    }
    .upward {
      transform: rotateZ(-90deg);
    }
    .downward {
      transform: rotateZ(90deg);
    }
  </style>
  
</head>
<body>
  <ul>
    <li>Original: <span class="scissors original">&#9986;</span></li>
    <li>Flipped: <span class="scissors flipped">&#9986;</span></li>
    <li>Upward: <span class="scissors upward">&#9986;</span></li>
    <li>Downward: <span class="scissors downward">&#9986;</span></li>
  </ul>
</body>
</html>



-1

Funziona bene con icone di font come 's7 stroke icons' e 'font-awesome' :

.mirror {
  display: inline-block;
  transform: scaleX(-1);
}

E poi sull'elemento target:

<button>
  <span class="s7-back mirror"></span>
  <span>Next</span>
</button>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.