Como posso desenhar texto vertical com CSS entre navegadores?

243

Quero girar uma única palavra do texto em 90 graus, com suporte para vários navegadores (> = IE6,> = Firefox 2, qualquer versão do Chrome, Safari ou Opera). Como isso pode ser feito?

usr
fonte
4
Não há CSS puro que você possa usar com compatibilidade cruzada. O que eu tenho é tudo o que existe. Você está melhor com uma imagem.
Robert K
1
O navegador de texto vertical não é tão difícil. No dns4.nl existe uma solução que funciona mesmo na ópera. Eu testei com todas as versões, isto é, mozilla e safari (também coroa). o link é: dns4.nl/pagina/html_code/vertikale_tekst.html . comentário para xkcd150 :> O problema é que isso depende do elemento canvas. - xkcd150 20 de setembro às 10:13 Não, o procedimento não depende do elemento canvas.
Aqui está um tutorial que explica como fazer todo tipo de transformação de texto, mesmo no IE (incluindo a solução para o seu problema) :) useragentman.com/blog/2010/03/09/… Espero que ajude!
Juanma Guerrero
Aqui está um detalhamento da técnica que usei: scottgale.com/blog/css-vertical-text/2010/03/01
Consegui girar com sucesso seguindo as instruções fornecidas nesta página, mas não consegui imprimir a página. O texto é impresso ao contrário. Este site foi muito útil para mim: sevenwires.com/play/UpsideDownLetters.html
Nahuel

Respostas:

213

Atualizou esta resposta com informações recentes (de CSS Tricks ). Parabéns a Matt e Douglas por apontar a implementação do filtro.

.rotate {
  -webkit-transform: rotate(-90deg);
  -moz-transform: rotate(-90deg);
  -ms-transform: rotate(-90deg);
  -o-transform: rotate(-90deg);
  transform: rotate(-90deg);

  /* also accepts left, right, top, bottom coordinates; not required, but a good idea for styling */
  -webkit-transform-origin: 50% 50%;
  -moz-transform-origin: 50% 50%;
  -ms-transform-origin: 50% 50%;
  -o-transform-origin: 50% 50%;
  transform-origin: 50% 50%;

  /* Should be unset in IE9+ I think. */
  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
}

Resposta antiga:

Para o FF 3.5 ou Safari / Webkit 3.1, confira: -moz-transform (e -webkit-transform). O IE tem um filtro Matrix (v5.5 +), mas não tenho certeza de como usá-lo. O Opera ainda não possui recursos de transformação.

.rot-neg-90 {
  /* rotate -90 deg, not sure if a negative number is supported so I used 270 */
  -moz-transform: rotate(270deg);
  -moz-transform-origin: 50% 50%;
  -webkit-transform: rotate(270deg);
  -webkit-transform-origin: 50% 50%;
  /* IE support too convoluted for the time I've got on my hands... */
}
Robert K
fonte
+1 no ícone do urso fantasma;) Eu tive muitos problemas para fazer esse trabalho, acabei tendo que alterar minha estrutura DOM e brincar com uma margem negativa. Uma versão do IE mais simples de usar, mas que não parece correta quando a página é impressa: modo de escrita: tb-rl; filtro: flipv fliph;
RMorrisey
12
Microsoft "filtro: progid: DXImageTransform.Microsoft.BasicImage (rotation = 3);"
Matt
1
Infelizmente, IE9 (no modo de padrões!) Aplica ambos os estilos * -ms-Transformar, e o filtro. Na exibição de compatibilidade, ele aplica apenas o filtro.
Romløk
3
Verifique se o seu texto é um elemento de bloco ou seja, exibição de uso: inline-block ou similar
James Westgate
2
Aqui estão alguns filtros para o bem do IE8 e IE9. O primeiro é o IE8, o segundo é o modo de padrões do IE8 e o nº 3 remove o filtro para o IE9 +. Arrrgh, eu não posso obter comentários stackoverflow para parar de filtrar os meus hacks CSS, então olhada jsfiddle.net/GrPyj/9
Justin Grant
73

Estou usando o código a seguir para escrever texto vertical em uma página. Firefox 3.5+, webkit, opera 10.5+ e IE

.rot-neg-90 {
    -moz-transform:rotate(-270deg); 
    -moz-transform-origin: bottom left;
    -webkit-transform: rotate(-270deg);
    -webkit-transform-origin: bottom left;
    -o-transform: rotate(-270deg);
    -o-transform-origin:  bottom left;
    filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
}
Choesang
fonte
Funciona no Chrome 5. Não funciona no modo "peculiaridades" do IE 8; faz o trabalho em "modo IE8 Standards".
Asaf Bartov
Obrigado por me avisar. Poste aqui, se você encontrar uma maneira de ter um texto vertical no IE no modo peculiar.
Choesang 01/10/10
15

Outra solução é usar um nó de texto SVG que é apoiada pela maioria dos navegadores .

<svg width="50" height="300">
    <text x="28" y="150" transform="rotate(-90, 28, 150)" style="text-anchor:middle; font-size:14px">This text is vertical</text>
</svg>

Demonstração: https://jsfiddle.net/bkymb5kr/

Mais sobre o texto SVG: http://tutorials.jenkov.com/svg/text-element.html

Jenny O'Reilly
fonte
ótima solução, muito melhor que as anteriores - sem problemas com o posicionamento do texto após a rotação
Picard
9

O módulo CSS Writing Modes apresenta fluxos ortogonais com texto vertical.

Basta usar a writing-modepropriedade com o valor desejado.

span { margin: 20px; }
#vertical-lr { writing-mode: vertical-lr; }
#vertical-rl { writing-mode: vertical-rl; }
#sideways-lr { writing-mode: sideways-lr; }
#sideways-rl { writing-mode: sideways-rl; }
<span id="vertical-lr">
  ↑ (1) vertical-lr 至<br />
  ↑ (2) vertical-lr 至<br />
  ↑ (3) vertical-lr 至
</span>
<span id="vertical-rl">
  ↓ (1) vertical-rl 至<br />
  ↓ (2) vertical-rl 至<br />
  ↓ (3) vertical-rl 至
</span>
<span id="sideways-lr">
  ↓ (1) sideways-lr 至<br />
  ↓ (2) sideways-lr 至<br />
  ↓ (3) sideways-lr 至
</span>
<span id="sideways-rl">
  ↓ (1) sideways-rl 至<br />
  ↓ (2) sideways-rl 至<br />
  ↓ (3) sideways-rl 至
</span>

Oriol
fonte
2
lateral-rl a partir de agora não é suportado amplamente, eu recomendaria vertical-rl e girando a 180 graus
godblessstrawberry
6

Eu adaptei isso em http://snook.ca/archives/html_and_css/css-text-rotation :

<style>
    .Rotate-90
    {
        display: bloco;
        posição: absoluta;
        direita: -5px;
        superior: 15 px;
        -webkit-transform: rotate (-90deg);
        -moz-transform: rotate (-90deg);
    }
</style>
<! - [se IE]>
    <style>
        .Rotate-90 {
            filtro: progid: DXImageTransform.Microsoft.BasicImage (rotação = 3);
            direita: -15px; superior: 5 px;
        }
    </style>
    <! [endif] ->
John
fonte
5

Eu tive problemas ao tentar fazer isso em CSS puro - dependendo da fonte, pode parecer um pouco ruim. Como alternativa, você pode usar SVG / VML para fazer isso. Existem bibliotecas que ajudam a torná-lo entre navegadores com facilidade, por exemplo, Raphael e ExtJS . No ExtJS4, o código fica assim:

    var drawComp = Ext.create('Ext.draw.Component', {
        renderTo: Ext.getBody(), //or whatever..
        height: 100, width: 100 //ditto..
    });
    var text = Ext.create('Ext.draw.Component', {
        type: "text",
        text: "The text to draw",
        rotate: {
            x: 0, y: 0, degrees: 270
        },
        x: -50, y: 10 //or whatever to fit (you could calculate these)..
    });
    text.show(true);

Isso funcionará no IE6 + e em todos os navegadores modernos. Infelizmente, acho que você precisa pelo menos do FF3.0.

Mark Rhodes
fonte
1
Amando a diferenciação entre IE6 + e todos os navegadores modernos - lê-se como se você está dizendo qualquer versão do IE não é moderno :)
ClarkeyBoy
1
@ClarkeyBoy, eu diria que apenas o IE10 está quase atualizado com outros navegadores, e apenas porque a renderização forçada da GPU e o layout da grade. Você não pode realmente chamar o IE de um navegador moderno, porque ele atualiza x3-x10 vezes mais lentamente que todos os outros navegadores.
Skmasq
A melhor opção é usar um arquivo SVG ou esse JS, pois você pode achar que o uso da propriedade CSS transform pode não ser compatível com as suas páginas responsivas.
b01
5

Se você usa o Bootstrap 3, pode usar um dos seus mixins:

.rotate(degrees);

Exemplo:

.rotate(-90deg);
Andreas Fröwis
fonte
1
Ainda funciona, mas observe que: Todos os mixins de fornecedores foram descontinuados a partir da v3.2.0 devido à introdução do Autoprefixer em nosso Gruntfile. Eles serão removidos na v4.
yishaiz
4

Minha solução que funcionaria no Chrome, Firefox, IE9, IE10 (altere os graus conforme sua exigência):

.rotate-text {
  -webkit-transform: rotate(270deg);
  -moz-transform: rotate(270deg);
  -ms-transform: rotate(270deg);
  -o-transform: rotate(270deg);
  transform: rotate(270deg);
  filter: none; /*Mandatory for IE9 to show the vertical text correctly*/      
}
Devner
fonte