Ocultar texto usando css

306

Eu tenho uma tag no meu html assim:

<h1>My Website Title Here</h1>

Usando css, quero substituir o texto pelo meu logotipo real. Eu tenho o logotipo não há problema através de redimensionar a tag e colocar uma imagem de fundo via css. No entanto, não consigo descobrir como se livrar do texto. Eu já vi isso basicamente empurrando o texto para fora da tela. O problema é que não me lembro onde o vi.

Micah
fonte
3
há muitas respostas desatualizados aqui: considerar upvoting a mais recente resposta stackoverflow.com/a/27769435/2586761 para expô-lo
PTIM

Respostas:

426

Esta é uma maneira:

h1 {
    text-indent: -9999px;                 /* sends the text off-screen */
    background-image: url(/the_img.png);  /* shows image */
    height: 100px;                        /* be sure to set height & width */
    width: 600px;
    white-space: nowrap;            /* because only the first line is indented */
}

h1 a {
    outline: none;  /* prevents dotted line when link is active */
}

Aqui está outra maneira de ocultar o texto, evitando a enorme caixa de 9999 pixels que o navegador criará:

h1 {
    background-image: url(/the_img.png);  /* shows image */
    height: 100px;                        /* be sure to set height & width */
    width:  600px;

    /* Hide the text. */
    text-indent: 100%;
    white-space: nowrap;
    overflow: hidden;
}
nicholaides
fonte
5
títulos longos vai ter um problema com este método uma vez que apenas o texto antes de word-wrap é recuada, ea especificação W3C não especifica uma situação de avanço negativo assim que este poderia ter resultados imprevisíveis
Chris Farmiloe
3
Se você usar esse método, você deve adicionar "overflow: hidden" para evitar caixa seird selecção disparando à esquerda (especialmente com links)
willoller
4
Se houver links em elementos com recuo de texto negativo, especifique também "estrutura de tópicos: nenhum", caso contrário, uma borda pontilhada sairá à esquerda da tela.
nickf
9
Prefiro usar 'recuo do texto: -9999px;' apenas para garantir que o texto saia muito da tela. Um pouco de paranóia defensiva.
Andy Ford
4
Adicione também 'white-space: nowrap' apenas para ficar do lado seguro, se o texto for longo, apenas a primeira linha for recuada.
287 Andrew Moore
177

Por que não usar simplesmente:

h1 { color: transparent; }
nesono
fonte
16
Por que não? Porque o Google não gosta.
Alekwisnia #
32
Validação (CSS 2.1): 'transparente' não é um valor válido para a propriedade 'cor'.
Hasang
15
O texto ficará visível se o usuário o selecionar (STRG + A etc.) - Isso parece muito pouco profissional! Saudações Christopher
Christopher Stock
24
@ HasanGürsoy e futuros googlers- "CSS3 estende o valor da cor para incluir a palavra-chave 'transparente' ...."
ABMagil 02/07/2014
11
color: transparent;funciona junto user-select: none;, a menos que você substitua a cor.
22617 stan-z
162

Basta adicionar font-size: 0;ao seu elemento que contém texto.

.hidden { font-size: 0; }
  font-size: 0; hides text. <span class="hidden"> You can't see me :) </span>

valk
fonte
1
Isso é exatamente o que eu precisava. Eu queria ocultar o que estava em uma div, mas mostrar o que estava nos intervalos da criança (para ocultar a pontuação entre eles).
mskfisher
2
Este parece ser o método mais lógico (leia-se: Menos Bizarro) - no entanto, eu me pergunto o quão bem ele é suportado em vários navegadores. (Eu posso confirmar que funciona no Firefox.)
Brian Lacy
1
Ele ainda mostra o texto muito pequeno em mais navegadores do que apenas no IE7; essa não é uma solução completa para vários navegadores.
macguru2000
8
Eu testei o truque {font-size: 0} no Chrome 27, Firefox 17, Safari para Windows 5.1.7, Opera 12.12, IE8, IE9, IE10 - funciona em todos esses navegadores. Esse truque é melhor se você não pode definir a imagem de plano de fundo no próprio elemento (por exemplo, porque você está usando uma imagem de sprite compactada e o ícone necessário não possui preenchimento vazio suficiente ao redor) e precisa usar o pseudo-seletor , por exemplo, elemento: after para exibir a imagem de fundo.
beluga
1
Isso também altera o tamanho da div, então eu não recomendo isso.
23915 Stephan Bijzitter
30

A maneira mais amigável entre navegadores é escrever o HTML como

<h1><span>Website Title</span></h1>

depois use CSS para ocultar a extensão e substituir a imagem

h1 {background:url(/nicetitle.png);}
h1 span {display:none;}

Se você pode usar CSS2, existem maneiras melhores de usar a contentpropriedade, mas infelizmente a web ainda não está 100% lá.

Chris Farmiloe
fonte
Mas não se esqueça de definir também o atributo width e height para o da imagem - e verifique se "padding" e "margin" estão definidos, pois os navegadores têm idéias diferentes sobre a quantidade de padding / margin que uma tag H1 precisa ter.
A desvantagem aqui é que, se as imagens estiverem desativadas, ou se um bot com reconhecimento de css aparecer, o título não será visível.
willoller 23/01
13
O texto importante na tela, provavelmente, não será esquecido pelos bots dos mecanismos de pesquisa e pelos leitores de tela. Use recuo do texto.
dylanfm 23/01/09
1
Isso não fará nada, o OP também pode remover o texto no título. Os leitores de tela não fazem nada com display nenhum ..
Idris Dopico Peña
23

Ocultando o texto com a acessibilidade em mente:

Além das outras respostas, aqui está outra abordagem útil para ocultar o texto.

Esse método oculta efetivamente o texto, mas permite que ele permaneça visível para os leitores de tela. Esta é uma opção para considerar se a acessibilidade é uma preocupação.

.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0,0,0,0);
    border: 0;
}

Vale ressaltar que esta classe é usada atualmente no Bootstrap 3 .


Se você estiver interessado em ler sobre acessibilidade:

Josh Crozier
fonte
Isso funciona bem para adicionar um elemento apenas ao leitor de tela; no entanto, ele não funciona com a pergunta original em que uma imagem deve ser exibida por uma imagem de plano de fundo especificada em css.
Vossad01 29/05
@ vossad01 - Se você não pode adicionar outro elemento e está preso a um único elemento (como no caso mencionado), uma boa solução seria utilizar um pseudo-elemento ... também, publiquei este resposta 6 anos após a pergunta inicial, e minha resposta foi direcionada a um público mais amplo, pois essa pergunta parece popular.
Josh Crozier
14

Veja mezzoblue para um bom resumo de cada técnica, com pontos fortes e fracos, além de exemplos de html e css.

darasd
fonte
10

Tantas soluções complicadas.

O mais fácil é simplesmente usar:

color:rgba(0,0,0,0)
Pier
fonte
Ótimo! Isso funciona para qualquer cor de fundo. Obrigado.
precisa
8

você pode simplesmente ocultar seu texto adicionando este atributo:

font size: 0 !important;
Omid Ahmadyani
fonte
Também vale a pena verificar se a !importantcláusula é realmente necessária no seu caso. No meu caso, funcionou bem sem ele também.
Eerik Sven Puudist 15/04
6

Não use { display:none; }Torna o conteúdo inacessível. Você deseja que os leitores de tela vejam seu conteúdo e o estilizem visualmente, substituindo o texto por uma imagem (como um logotipo). Usando text-indent: -999px;ou um método semelhante, o texto ainda está lá - apenas não visualmente. Use display:nonee o texto se foi.

jensimmons
fonte
5
<style>
body {
     visibility:hidden
}
body .moz-signature p{
    visibility:visible
}
</style>

O acima funciona bem no Thunderbird mais recente também.

kamalesh
fonte
Note-se que a utilização deste método faz com que o un-legível para a maioria dos leitores de tela de texto - veja stackoverflow.com/questions/1755656/...
Jordan Lev
5

você pode usar a background-imagepropriedade css e z-indexgarantir que a imagem fique na frente do texto.

Jobo
fonte
Exemplo? Não vejo como z-indexse aplica ao background-image.
Martynas Jusevičius
5

Por que você não usa:

<li><a href="#">bla</a></li>

a {
    opacity: 0.0;
    font-size: 1px;
}

li {
    background-image: url('test.jpg');
}

Se você não possui nenhum elemento span ou div, ele funciona perfeitamente para links.

Hans
fonte
4

A resposta é criar uma extensão com a propriedade

{display:none;}

Você pode encontrar um exemplo neste site

Andrei Krotkov
fonte
1
Alguns dos votos negativos provavelmente têm a ver com preocupações de acessibilidade - um ponto válido. Mas, no meu caso, estou puxando um menu de um serviço de menu de restaurante para um site por meio do serviço da web. O proprietário do restaurante não deseja que os preços sejam exibidos (mas o mesmo serviço é usado para imprimir os menus reais.) Essa é uma situação em que não se deseja os preços no site. É bom conhecer todas as abordagens possíveis.
Marvo
4

Esta é realmente uma área propícia à discussão, com muitas técnicas sutis disponíveis. É importante que você selecione / desenvolva uma técnica que atenda às suas necessidades, incluindo: leitores de tela, combinações de imagens / css / scripting on / off, SEO, etc.

Aqui estão alguns bons recursos para começar o caminho das técnicas de substituição de imagem padrão:

http://faq.css-standards.org/Image_Replacement

http://www.alistapart.com/articles/fir

http://veerle.duoh.com/blog/links/#l-10

willoller
fonte
3

Use a tag Condição para um navegador diferente e use o css que você precisa colocar height:0pxe width:0pxtambém precisa colocar font-size:0px.

kedar
fonte
3

Se o objetivo é simplesmente tornar o texto dentro do elemento invisível, defina o atributo color para ter 0 opacidade usando um valor rgba, como color:rgba(0,0,0,0);limpo e simples.

Cafe Coder
fonte
3

Não me lembro de onde peguei isso, mas o uso com sucesso há séculos.

  =hide-text()
    font: 0/0 a
    text-shadow: none
    color: transparent

Meu mixin é sass no entanto, você pode usá-lo da maneira que quiser. Para uma boa medida, geralmente mantenho uma .hiddenclasse em algum lugar do meu projeto para anexar aos elementos para evitar duplicação.

itsfreshmade
fonte
Acho que li em algum lugar que essa versão é preferida porque um recuo de texto negativo fará com que o navegador processe uma caixa longa de 10000px (ou qualquer outro exemplo que você use). Alterar a fonte como neste exemplo não fará com que o navegador crie uma caixa grande que ele tenta renderizar.
Gambo
2
h1 {
    text-indent: -3000px; 
    line-height: 3000px;
    background-image: url(/LOGO.png);
    height: 100px; width:  600px;  /* height and width are a must */

}
vencedor
fonte
3
Por que existe uma altura de linha?
SandRock
2

Experimente este código para reduzir e ocultar o texto

.hidetxt{

  width: 346px;
  display: table-caption;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  cursor: no-drop;
  
}

.hidetxt:hover { 

  visibility: hidden;
  
}
<div class="hidetxt">
<p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when</p>
</div>

ou ocultar o uso em sua classe css .hidetxt { visibility: hidden; }

omar kerr
fonte
2

repalce o conteúdo com o CSS

 h1{  font-size: 0px;}
 h1:after {
    content: "new content";
    font-size: 15px;
  }
Hossein Hajizadeh
fonte
1

Eu costumo usar:

span.hide
{
  position:fixed;
  right:-5000px;
}
Anze
fonte
1

Se podemos editar a marcação, a vida pode ser mais fácil, basta remover o texto e ser feliz. Mas, às vezes, a marcação foi colocada pelo código JS ou simplesmente não temos permissão para editá-la, o css ruim se tornou a única arma colocada à nossa disposição.

Não podemos colocar <span>o texto em forma de quebra e ocultar a tag inteira. A propósito, alguns navegadores não apenas ocultam elementos, display:nonecomo também desabilitam os componentes internos.

Ambas font-size:0pxe color:transparentpodem ser boas soluções, mas alguns navegadores não as entendem. Não podemos confiar neles.

Eu sugiro:

h1 {
  background-image: url(/LOGO.png);  /* Our image */
  text-indent: -3000px;  /* Send text out of viewable area */
  height: 100px; width: 600px;  /* height and width are a must, agree */
  overflow:hidden;  /* make sure our size is respected */
}

Usar overflow:hiddenreforça nossa largura e altura. Alguns navegadores (não os nomearão ... IE ) podem ler largura e altura como min-widthe min-height. Quero impedir que a caixa seja ampliada.

Francisco
fonte
1

Usar o valor zero para font-sizee line-heightno elemento faz o truque para mim:

<style>
    .text {
        display: block;
        width: 200px;
        height: 200px;

        font-size: 0;
        line-height: 0;
    }
</style>

<span class="text">
    Invisible Text
</span>
HelpNeeder
fonte
1

Para ocultar o texto do html, use a propriedade indent de texto no css

.classname {
 text-indent: -9999px;
 white-space: nowrap; 
}

/ * para texto dinâmico, é necessário adicionar espaço em branco, para que o css aplicado não seja perturbado. nowrap significa que o texto nunca será quebrado para a próxima linha, o texto continuará na mesma linha até que uma <br>tag seja encontrada

urmila manjarikar
fonte
1

Uma das maneiras de conseguir isso é usar :beforeor :after. Eu uso essa abordagem há vários anos e, particularmente, funciona muito bem com ícones de vetor de glifo.

h1 {
    position: relative;
    text-indent: -9999px;                 /* sends the text off-screen */
    }
h1:before {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
    display: block;
    width: 600px;
    height: 100px;
    content: ' ';
    background: transparent url(/the_img.png) 0 0 no-repeat;
    }
Pegues
fonte
0

Isso funcionou para mim com extensão (validação de nocaute).

<span class="validationMessage">This field is required.</span>

.validationMessage {
    background-image: url('images/exclamation.png');
    background-repeat: no-repeat;
    margin-left: 5px;
    width: 16px;
    height: 16px;
    vertical-align: top;

    /* Hide the text. */
    display: inline-block;
    overflow: hidden;
    font-size: 0px;
}
Karson
fonte
0

Uma solução que funciona para mim:

HTML

<div class="website_title"><span>My Website Title Here</span></div>

CSS

.website_title {
    background-image: url('../images/home.png');
    background-repeat: no-repeat;
    height: 18px;
    width: 16px;
}

.website_title span {
    visibility: hidden;
}
Sébastien Gicquel
fonte
-1

A melhor resposta funciona para textos curtos, mas se o texto for agrupado, ele aparecerá na imagem.

Uma maneira de fazer isso é capturar erros com um manipulador de jquery. Tente carregar uma imagem, se ela falhar, gera um erro.

$('#logo img').error(function(){
    $('#logo').html('<h1>My Website Title Here</h1>');
});

Consulte CÓDIGO DE AMOSTRA

Shanimal
fonte
-1
h1{
   background:url("../images/logo.png") no-repeat;
   height:180px;
   width:200px;
   display:inline-block;
   font-size:0px !important;
   text-intent:-9999999px !important;
   color:transparent !important;
 }
Harden Rahul
fonte
3
Embora esse código possa responder à pergunta, fornecer um contexto adicional a respeito de por que e / ou como esse código responde à pergunta melhora seu valor a longo prazo.
Benjamin W.