Você pode usar CSS para espelhar / inverter texto?

235

É possível usar CSS / CSS3 para espelhar texto?

Especificamente, tenho esta tesoura com o caractere “✂” ( ✂) que gostaria de exibir apontando para a esquerda e não para a direita.

pistacchio
fonte
9
Se a imagem Tesouras por algum motivo não funciona para você, eu vi isso falsificou com% <e>%
Pete Wilson
3
A resposta de Micheal é mais precisa. Você pode atualizar a resposta correta? Porque a resposta que você marcou como correta não é um espelho, mas uma rotação de 180 graus.
Sanket Sahu
@PeteWilson,? O caractere é tão comum? Para que é usado?
Pacerier
4
Esteja ciente de que a rotação é diferente dependendo da implementação do emoji. No conjunto de emoji de maçãs, está apontando para baixo.
Akkumulator

Respostas:

411

Você pode usar transformações CSS para conseguir isso. Um flip horizontal envolveria o dimensionamento da div assim:

-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 um flip vertical envolveria o dimensionamento da div assim:

-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>

methodofaction
fonte
4
Esta deve ser a resposta correta! (espelhos ao longo do eixo vertical, escala (1, -1) para o eixo horizontal)
Projeto por Adrian
É certamente a resposta compatível com os padrões nost, infelizmente ainda não vivemos em um mundo em que isso realmente funcione para todos os casos de uso.
precisa
Você poderia incluir os prefixos reais do navegador em sua resposta, com o último não prefixado? O CSS que você forneceu não funciona.
Serrano
@SerranoPereira de fato, obrigado pela sugestão. Resposta alterada.
methodofaction 31/01
11
Observe que a transformação CSS não funciona em elementos inline, como as tags <i> sugeridas pela Foundation, a menos que você também indique display: inline-block.
enigment 16/11/16
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);

Os dois parâmetros são o eixo X e o eixo Y -1 será um espelho, mas você pode dimensionar para qualquer tamanho que desejar para atender às suas necessidades. De cabeça para baixo e para trás seria (-1, -1).

Se você está interessado na melhor opção disponível para suporte a vários navegadores em 2011, veja minha resposta mais antiga .

Chris Sobolewski
fonte
21
Tecnicamente, isso não é um espelho. está rodado. Por isso vai funcionar apenas com algum tipo de elementos
borisrorsvort
4
Eu tive alguns problemas no Chrome até que eu adicionei display: inline-block ao meu período (usando fontes pictos)
Clarence Liu
1
Dado que, quando essa pergunta foi feita, as transformações do navegador não eram amplamente suportadas, eu argumentaria que essa foi a resposta certa. De fato, as transformações não são suportadas até o IE 9, então eu diria que essa ainda é a resposta certa, por pelo menos um pouco mais.
21813 Chris Sobolewski
Esta resposta está errada, não é um espelho. Só funciona neste caso, porque o símbolo dado no exemplo é verticalmente assimétrico.
22814 gregtczap
Embora isso seja útil por si só, não é a resposta para a pergunta exata feita. Encontrei essa pergunta através de um mecanismo de pesquisa porque queria inverter uma imagem horizontalmente. Não é simétrico como a tesoura do OP.
Gillytech
58

Espelho real:

.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>

Cícero Verneck Corrêa
fonte
14
Você deve sempre colocar a propriedade compatível com os padrões (não prefixada) por último, para que, quando o padrão for adotado por um navegador, ele use a versão baseada em padrões em vez da versão prefixada (mais antiga, com bugs). Nesse caso, isso significa "transformar: matriz (-1, 0, 0, 1, 0, 0);" deve ser a última propriedade. (Editado a resposta para refletir isso.)
Jay Dansand
7
Eu não sei se este deve ser na resposta correta ou a pergunta, mas eu quero deixar fontawesome / usuários de bootstrap saber sobre os fa-flip-horizontale fa-flip-verticalpropriedades
lol
1
Ótima resposta real. No entanto exibir: bloco; não necessariamente necessário.
Gilly
6
sim ... display: bloco; ou bloco inline é necessário
dGo 4/15
Isso foi realmente útil para manter a orientação correta do texto da face posterior de um elemento quando girada ao longo do eixo Y. Por exemplo:backface-visibility: visible; transform-origin: center center; transform-style: preserve-3d; transform: matrix(-1, 0, 0, 1, 0, 0) rotateY(180deg) ;
parliament
12

Você pode usar qualquer um

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

ou

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

Observe que definir positioncomo absoluteé muito importante! Se você não definir, precisará definir display: inline-block;

Emanuela Colta
fonte
7

Eu juntei esta solução vasculhando a Internet, incluindo

Essa solução parece funcionar em todos os navegadores, incluindo o IE6 +, usando scale(-1,1)(um espelho adequado) e as propriedades filter/ apropriadas -ms-filterquando necessário (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);
}
Jay Dansand
fonte
6

Para compatibilidade entre navegadores, crie esta 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 adicione-o à sua classe de ícones, ou seja,

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

para obter um ícone de pesquisa com a alça à esquerda

Michael
fonte
3

você pode usar 'transformar' para conseguir isso. http://jsfiddle.net/aRcQ8/

css:

-moz-transform: rotate(-180deg);
-webkit-transform: rotate(-180deg);
transform: rotate(-180deg);
Rito
fonte
3

Há também o rotateYpara um espelho real:

transform: rotateY(180deg);

O que talvez seja ainda mais claro e compreensível.

EDIT: Parece que não funciona no Opera ... infelizmente. Mas funciona bem no Firefox. Eu acho que pode ser necessário dizer implicitamente que estamos fazendo algum tipo de translate3dtalvez? Ou algo assim.

jeromej
fonte
1
Para quem está se perguntando isso é uma transformação 3D. Eu acho que é definitivamente mais legível / compreensível do que os métodos de escala e matriz dados anteriormente.
22714 Gregtczap
Não vejo como uma rotação é um espelho - isso parece apenas acontecer em um caso especial.
cel sharp
O @celsharp está no eixo Y, para que você veja a imagem / elemento de trás, espelhado.
jeromej 16/04
1

Basta adicionar uma demonstração de trabalho para o espelho horizontal e vertical.

.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>

niyasc
fonte
0

isto é o que funcionou para mim <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);

só precisa de exibição: bloco embutido ou bloco para girar. Então, basicamente, a primeira resposta é boa. Mas -180 não funcionou.

Iggy
fonte
0

Você pode tentar refletir a caixa

box-reflect: 20px right;

veja a propriedade CSS refletir compatibilidade com caixas? para mais detalhes

Sudeep
fonte
1
box-reflect é uma propriedade apenas do webkit. Mas eu não acho que tem um equivalente -moz- .. Confira este post ..
mithunsatheesh
Também separador deve ser :não;
mithunsatheesh
0

Apenas mais um exemplo de como o personagem pode ser invertido. Adicione prefixos de fornecedores se precisar, mas por enquanto todos os navegadores modernos suportam propriedades de transformação sem prefixo. A única exceção é o Opera se o modo Opera Mini estiver ativado (~ 3% dos usuários do mundo).

<!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>

drugan
fonte
0

direction: rtl; é provavelmente o que você está procurando.

Христо Тодоров
fonte
-1

Isso funciona bem com ícones de fontes como 's7 stroke icons' e 'font-awesome' :

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

E então no elemento de destino:

<button>
  <span class="s7-back mirror"></span>
  <span>Next</span>
</button>
Dmitry Anch
fonte