Ocultar texto usando CSS

306

Tengo una etiqueta en mi html como esta:

<h1>My Website Title Here</h1>

Con CSS quiero reemplazar el texto con mi logotipo real. Tengo el logotipo allí sin problemas al cambiar el tamaño de la etiqueta y poner una imagen de fondo a través de css. Sin embargo, no puedo entender cómo deshacerme del texto. Lo he visto antes, básicamente, empujando el texto fuera de la pantalla. El problema es que no recuerdo dónde lo vi.

Micah
fuente
3
Aquí hay muchas respuestas desactualizadas: considere votar a favor de la respuesta más reciente stackoverflow.com/a/27769435/2586761 para exponerla
ptim

Respuestas:

426

Esta es una forma:

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 */
}

Aquí hay otra forma de ocultar el texto evitando el enorme cuadro de 9999 píxeles que creará el navegador:

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
fuente
55
los títulos largos tendrán un problema con este método, ya que solo el texto antes del ajuste de texto está sangrado, y la especificación del W3C no especifica una situación de sangría negativa, por lo que esto podría tener resultados impredecibles
Chris Farmiloe
3
Si usa este método, debe agregar "desbordamiento: oculto" para evitar que un cuadro de selección se dispare hacia la izquierda (especialmente con enlaces)
Willoller
44
Si tiene enlaces en elementos con la sangría de texto negativa, asegúrese de especificar también "esquema: ninguno"; de lo contrario, obtendrá un borde punteado que se sale de la izquierda de la pantalla.
nickf
99
Prefiero usar 'text-indent: -9999px;' solo para asegurarte de que el texto va muy lejos de la pantalla. Un poco de paranoia defensiva.
Andy Ford el
44
Agregue también 'white-space: nowrap' solo para estar seguro si su texto es largo, ya que solo la primera línea está sangrada.
Andrew Moore
177

¿Por qué no simplemente usar:

h1 { color: transparent; }
nesono
fuente
16
Por qué no? Porque a Google no le gusta.
alekwisnia
32
Validación (CSS 2.1): 'transparente' no es un valor válido para la propiedad 'color'.
HasanG
15
El texto se hará visible si el usuario lo selecciona (STRG + A, etc.). ¡Esto se ve muy poco profesional! Saludos Christopher
Christopher Stock
24
@ HasanGürsoy y futuros googlers- "CSS3 extiende el valor de color para incluir la palabra clave 'transparente' ..."
ABMagil
11
color: transparent;funciona junto con user-select: none;, a menos que anule el color.
stan-z
162

Simplemente agregue font-size: 0;a su elemento que contiene texto.

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

valk
fuente
1
Esto es exactamente lo que necesitaba. Quería ocultar lo que había en un div, pero mostrar lo que había en los tramos secundarios (para ocultar la puntuación entre ellos).
mskfisher
2
Este parece ser el método más lógico (léase: menos extraño); sin embargo, me pregunto qué tan bien es compatible con varios navegadores. (Puedo confirmar que funciona en Firefox.)
Brian Lacy
1
Todavía muestra el texto muy pequeño en más navegadores que solo IE7, esta no es una solución completa de navegador cruzado.
macguru2000
8
He probado el truco {font-size: 0} en Chrome 27, Firefox 17, Safari para Windows 5.1.7, Opera 12.12, IE8, IE9, IE10: funciona en todos esos navegadores. Este truco es mejor si no puede establecer la imagen de fondo en el elemento en sí (por ejemplo, porque está usando una imagen de sprite muy compacta y el icono requerido no tiene suficiente relleno vacío alrededor), y tiene que usar un pseudo selector , por ejemplo, elemento: después de mostrar la imagen de fondo.
beluga
1
Esto también cambia el tamaño del div, por lo que no lo recomiendo.
Stephan Bijzitter
30

La forma más amigable para los navegadores cruzados es escribir el HTML como

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

luego use CSS para ocultar el lapso y reemplazar la imagen

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

Si puede usar CSS2, entonces hay algunas formas mejores de usar la contentpropiedad, pero desafortunadamente la web aún no está al 100%.

Chris Farmiloe
fuente
Pero asegúrese de establecer también el atributo de ancho y alto al de la imagen, y asegúrese de que el "relleno" y el "margen" estén configurados porque los navegadores tienen ideas diferentes sobre la cantidad de relleno / margen que debe tener una etiqueta H1.
El inconveniente aquí es si las imágenes están apagadas, o si aparece un bot con reconocimiento de CSS, el título no será visible.
willoller
13
El texto importante dentro de la pantalla probablemente no será extrañado por los robots de los motores de búsqueda y los lectores de pantalla. Use sangría de texto en su lugar.
dylanfm
1
Esto no hará nada, OP también podría eliminar el texto en el título. Los lectores de pantalla no hacen nada con pantalla de ninguno ..
Idris Dopico Peña
23

Ocultar texto con accesibilidad en mente:

Además de las otras respuestas, aquí hay otro enfoque útil para ocultar texto.

Este método oculta efectivamente el texto, pero permite que permanezca visible para los lectores de pantalla. Esta es una opción a considerar si la accesibilidad es una preocupación.

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

Vale la pena señalar que esta clase se usa actualmente en Bootstrap 3 .


Si está interesado en leer sobre accesibilidad:

Josh Crozier
fuente
Esto funciona bien para agregar un elemento es solo lector de pantalla; sin embargo, no funciona con la pregunta original donde una imagen debe mostrarse con una imagen de fondo especificada en css.
vossad01
@ vossad01: si no puede agregar otro elemento y está atascado con un solo elemento (como en el caso que mencionó), entonces una buena solución sería utilizar un pseudo-elemento ... también, publiqué esto respondo 6 años después de la pregunta inicial, y mi respuesta estaba destinada a un público más amplio, ya que esta pregunta parece ser popular.
Josh Crozier
14

Vea mezzoblue para un buen resumen de cada técnica, con fortalezas y debilidades, además de ejemplos html y css.

darasd
fuente
10

Tantas soluciones complicadas.

La más fácil es simplemente usar:

color:rgba(0,0,0,0)
Muelle
fuente
¡Excelente! Esto funciona para cualquier color de fondo. Gracias.
Sandeep Amarnath
8

simplemente puede ocultar su texto agregando este atributo:

font size: 0 !important;
Omid Ahmadyani
fuente
También vale la pena verificar si la !importantcláusula es realmente necesaria en su caso. En mi caso funcionó bien sin él también.
Eerik Sven Puudista
6

No utilizar. { display:none; }Hace que el contenido sea inaccesible. Desea que los lectores de pantalla vean su contenido y lo visualicen al reemplazar el texto con una imagen (como un logotipo). Mediante el uso de text-indent: -999px;un método similar, el texto sigue ahí, pero no visualmente allí. Use display:none, y el texto se ha ido.

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

Lo anterior también funciona bien en el último Thunderbird.

kamalesh
fuente
Tenga en cuenta que el uso de este método hace que el texto no sea legible para la mayoría de los lectores de pantalla: consulte stackoverflow.com/questions/1755656/…
Jordan Lev el
5

puede usar la background-imagepropiedad css y z-indexasegurarse de que la imagen permanezca delante del texto.

Jobo
fuente
¿Ejemplo? No veo cómo se z-indexaplica a la background-image.
Martynas Jusevičius 01 de
5

¿Por qué no usas:

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

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

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

Si no tiene ningún elemento span o div, funciona perfectamente para enlaces.

Hans
fuente
4

La respuesta es crear un lapso con la propiedad

{display:none;}

Puedes encontrar un ejemplo en este sitio

Andrei Krotkov
fuente
1
Algunos de los votos negativos probablemente tengan que ver con problemas de accesibilidad, un punto válido. Pero en mi caso, estoy sacando un menú de un servicio de menú de restaurante a un sitio web a través de su servicio web. El dueño del restaurante no quiere que se muestren los precios (pero se usa el mismo servicio para imprimir los menús reales). Esa es una situación en la que uno no quiere los precios en el sitio. Es bueno saber todos los enfoques posibles.
Marvo
4

Esta es en realidad un área propicia para el debate, con muchas técnicas sutiles disponibles. Es importante que seleccione / desarrolle una técnica que satisfaga sus necesidades, incluidos: lectores de pantalla, combinaciones de activación / desactivación de imágenes / CSS / secuencias de comandos, SEO, etc.

Aquí hay algunos buenos recursos para comenzar en el camino de las técnicas estándar de reemplazo de imágenes:

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

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

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

Willoller
fuente
3

Use la etiqueta de condición para un navegador diferente y use CSS que debe colocar height:0pxy width:0pxtambién debe colocar font-size:0px.

kedar
fuente
3

Si el objetivo es simplemente hacer que el texto dentro del elemento sea invisible, configure el atributo de color para que tenga 0 opacidad usando un valor rgba como color:rgba(0,0,0,0);simple y limpio.

Codificador de cafe
fuente
3

No recuerdo dónde lo recogí, pero lo he estado usando con éxito durante años.

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

Mi mixin está sass, sin embargo, puede usarlo de la manera que mejor le parezca. En buena medida, generalmente mantengo una .hiddenclase en algún lugar de mi proyecto para adjuntarla a elementos para evitar duplicaciones.

itsfreshmade
fuente
Creo que he leído en alguna parte que se prefiere esta versión porque una sangría de texto negativa hará que el navegador muestre un cuadro largo de 10000 px (o cualquier ejemplo que use). Cambiar la fuente como en este ejemplo no hará que el navegador cree un cuadro grande que intente representar.
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
fuente
3
¿Por qué hay una altura de línea?
SandRock
2

Prueba este código para acortar y ocultar 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>

o para ocultar el uso en su clase CSS .hidetxt { visibility: hidden; }

omar kerr
fuente
2

repalce contenido con el CSS

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

Usualmente uso:

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

Si podemos editar el marcado, la vida puede ser más fácil, simplemente elimine el texto y sea feliz. Pero a veces el marcado fue colocado por el código JS o simplemente no se nos permite editarlo, demasiado mal CSS resultó ser la única arma puesta a nuestra disposición.

No podemos colocar una <span>envoltura del texto y ocultar toda la etiqueta. Por cierto, algunos navegadores no solo ocultan elementos display:nonesino que también deshabilitan los componentes en su interior.

Ambos font-size:0pxycolor:transparent pueden ser buenas soluciones, pero algunos navegadores no los entienden. No podemos confiar en ellos.

Yo sugiero:

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 */
}

El uso overflow:hiddenimpone nuestro ancho y alto. Algunos navegadores (no los nombrarán ... IE ) pueden leer ancho y alto como min-widthy min-height. Quiero evitar que la caja se agrande.

Francisco
fuente
1

Usar el valor cero para font-sizey line-heighten el elemento me ayuda:

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

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

<span class="text">
    Invisible Text
</span>
AyudaNeeder
fuente
1

Para ocultar texto de HTML, use la propiedad de sangría de texto en CSS

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

/ * para el texto dinámico, necesita agregar espacios en blanco, para que su CSS aplicado no se vea afectado. nowrap significa que el texto nunca se ajustará a la siguiente línea, el texto continúa en la misma línea hasta que <br>se encuentre una etiqueta

urmila manjarikar
fuente
1

Una de las formas en que lo logro es usar :beforeo :after. He usado este enfoque durante varios años, y particularmente funciona muy bien con los iconos de vectores de glifos.

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

Esto funcionó para mí con span (validación de eliminación).

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

Una solución que me funciona:

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

La mejor respuesta funciona para texto corto, pero si el texto se ajusta simplemente aparece en la imagen.

Una forma de hacerlo es detectar errores con un controlador jquery. Intenta cargar una imagen, si falla, arroja un error.

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

Ver CÓDIGO DE MUESTRA

Shanimal
fuente
-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
fuente
3
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo responde la pregunta mejora su valor a largo plazo.
Benjamin W.