Masquer le texte à l'aide de CSS

306

J'ai une balise dans mon html comme ceci:

<h1>My Website Title Here</h1>

En utilisant css, je veux remplacer le texte par mon logo actuel. J'ai le logo sans problème via le redimensionnement de la balise et la mise en place d'une image d'arrière-plan via css. Cependant, je ne sais pas comment me débarrasser du texte. J'ai déjà vu cela avant en poussant le texte hors de l'écran. Le problème est que je ne me souviens pas où je l'ai vu.

Michée
la source
3
il y a beaucoup de réponses obsolètes ici: pensez à voter pour la réponse la plus récente stackoverflow.com/a/27769435/2586761 pour l'exposer
ptim

Réponses:

426

C'est une façon:

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

Voici une autre façon de masquer le texte tout en évitant l'énorme boîte de 9999 pixels que le navigateur créera:

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
la source
5
les titres longs auront un problème avec cette méthode car seul le texte avant le retour à la ligne est indenté, et la spécification W3C ne spécifie pas de situation pour un retrait négatif, ce qui pourrait avoir des résultats imprévisibles
Chris Farmiloe
3
Si vous utilisez cette méthode, vous devez ajouter "débordement: caché" pour éviter que la troisième boîte de sélection ne se déclenche vers la gauche (en particulier avec les liens)
willoller
4
Si vous avez des liens dans les éléments avec le retrait de texte négatif, assurez-vous de spécifier également "contour: aucun" sinon vous obtenez une bordure en pointillés à gauche de l'écran.
nickf
9
Je préfère utiliser 'text-indent: -9999px;' juste pour vous assurer que le texte va vraiment loin de l'écran. Un peu de paranoïa défensive.
Andy Ford
4
Ajoutez également 'white-space: nowrap' juste pour être du bon côté si votre texte est long car seule la première ligne est en retrait.
Andrew Moore
177

Pourquoi ne pas simplement utiliser:

h1 { color: transparent; }
nesono
la source
16
Pourquoi pas? Parce que Google ne l'aime pas.
alekwisnia
32
Validation (CSS 2.1): 'transparent' n'est pas une valeur valide pour la propriété 'color'.
HasanG
15
Le texte deviendra visible si l'utilisateur le sélectionne (STRG + A etc.) - Cela semble très peu professionnel! Salutations Christopher
Christopher Stock
24
@ HasanGürsoy et futurs googleurs - "CSS3 étend la valeur de la couleur pour inclure le mot-clé" transparent "...."
ABMagil
11
color: transparent;fonctionne avec user-select: none;, sauf si vous remplacez la couleur.
stan-z
162

Ajoutez simplement font-size: 0;à votre élément qui contient du texte.

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

valk
la source
1
C'est exactement ce dont j'avais besoin. Je voulais cacher ce qui était dans un div, mais montrer ce qu'il y avait dans les travées des enfants (pour cacher la ponctuation entre eux).
mskfisher
2
Cela semble être la méthode la plus logique (lire: les moins bizarres) - cependant, je me demande dans quelle mesure elle est prise en charge dans divers navigateurs? (Je peux confirmer que cela fonctionne dans Firefox.)
Brian Lacy
1
Il montre toujours le texte très petit dans plus de navigateurs que juste IE7, ce n'est pas une solution complète de navigateur croisé.
macguru2000
8
J'ai testé l'astuce {font-size: 0} dans Chrome 27, Firefox 17, Safari pour Windows 5.1.7, Opera 12.12, IE8, IE9, IE10 - cela fonctionne dans tous ces navigateurs. Cette astuce est préférable si vous ne pouvez pas définir l'image d'arrière-plan sur l'élément lui-même (par exemple, parce que vous utilisez une image-objet compacte et que l'icône requise n'a pas suffisamment de remplissage vide autour), et que vous devez utiliser un pseudo-sélecteur , par exemple élément: après pour afficher l'image d'arrière-plan.
béluga
1
Cela change également la taille du div, donc je ne le recommande pas.
Stephan Bijzitter
30

La manière la plus conviviale pour tous les navigateurs consiste à écrire le code HTML sous la forme

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

puis utilisez CSS pour masquer la plage et remplacer l'image

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

Si vous pouvez utiliser CSS2, il existe de meilleures façons d'utiliser la contentpropriété, mais malheureusement, le Web n'est pas encore à 100%.

Chris Farmiloe
la source
Mais assurez-vous également de définir l'attribut width et height sur celui de l'image - et assurez-vous que "padding" et "margin" sont définis car les navigateurs ont des idées différentes quant à la quantité de rembourrage / marge qu'une balise H1 doit avoir.
L'inconvénient ici est que si les images sont désactivées, ou si un bot compatible CSS apparaît, le titre ne sera pas visible.
willoller
13
Le texte important dans l'affichage ne manquera probablement pas aux robots des moteurs de recherche et aux lecteurs d'écran. Utilisez plutôt le retrait de texte.
dylanfm
1
Cela ne fera rien, OP pourrait aussi bien supprimer le texte dans le titre. Les lecteurs d'écran ne font rien sans afficher aucun.
Idris Dopico Peña
23

Masquer le texte en gardant à l'esprit l'accessibilité:

En plus des autres réponses, voici une autre approche utile pour masquer du texte.

Cette méthode masque efficacement le texte, tout en lui permettant de rester visible pour les lecteurs d'écran. Il s'agit d'une option à considérer si l'accessibilité est un problème.

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

Il convient de noter que cette classe est actuellement utilisée dans Bootstrap 3 .


Si vous êtes intéressé à lire sur l'accessibilité:

Josh Crozier
la source
Cela fonctionne bien pour ajouter un élément uniquement sur lecteur d'écran; cependant, cela ne fonctionne pas avec la question d'origine où une image doit être affichée par une image d'arrière-plan spécifiée dans css.
vossad01
@ vossad01 - Si vous ne pouvez pas ajouter un autre élément, et que vous êtes coincé avec un seul élément (comme dans le cas que vous avez mentionné), alors une bonne solution serait d'utiliser un pseudo-élément ... aussi, j'ai posté ce répondre 6 ans après la question initiale, et ma réponse était destinée à un public plus large, car cette question semble être populaire.
Josh Crozier
14

Voir mezzoblue pour un joli résumé de chaque technique, avec ses forces et ses faiblesses, ainsi que des exemples html et css.

Darasd
la source
10

Tant de solutions compliquées.

Le plus simple est simplement d'utiliser:

color:rgba(0,0,0,0)
Jetée
la source
Génial! Cela fonctionne pour n'importe quelle couleur d'arrière-plan. Merci.
Sandeep Amarnath
8

vous pouvez simplement masquer votre texte en ajoutant cet attribut:

font size: 0 !important;
Omid Ahmadyani
la source
Il convient également de vérifier si la !importantclause est réellement nécessaire dans votre cas. Dans mon cas, cela a bien fonctionné sans lui aussi.
Eerik Sven Puudist
6

Ne pas utiliser { display:none; }Cela rend le contenu inaccessible. Vous voulez que les lecteurs d'écran voient votre contenu et le stylisent visuellement en remplaçant le texte par une image (comme un logo). En utilisant text-indent: -999px;ou une méthode similaire, le texte est toujours là - mais pas visuellement là. Utilisez display:noneet le texte a disparu.

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

Ce qui précède fonctionne bien également dans le dernier Thunderbird.

kamalesh
la source
Notez que l'utilisation de cette méthode rend le texte illisible pour la plupart des lecteurs d'écran - voir stackoverflow.com/questions/1755656/…
Jordan Lev
5

vous pouvez utiliser la background-imagepropriété css et z-indexvous assurer que l'image reste devant le texte.

Jobo
la source
Exemple? Je ne vois pas comment z-indexs'applique à la background-image.
Martynas Jusevičius
5

Pourquoi n'utilisez-vous pas:

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

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

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

Si vous n'avez aucun élément span ou div, cela fonctionne parfaitement pour les liens.

Hans
la source
4

La réponse est de créer un span avec la propriété

{display:none;}

Vous pouvez trouver un exemple sur ce site

Andrei Krotkov
la source
1
Certains des downvotes ont probablement à voir avec des problèmes d'accessibilité - un point valable. Mais dans mon cas, je tire un menu d'un service de menu de restaurant dans un site Web via leur service Web. Le propriétaire du restaurant ne veut pas que les prix soient affichés (mais le même service est utilisé pour imprimer les menus réels.) C'est une situation où l'on ne veut pas du tout les prix sur le site. Il est bon de connaître toutes les approches possibles.
mars 2015 à 6h05
4

Il s'agit en fait d'un domaine propice à la discussion, avec de nombreuses techniques subtiles disponibles. Il est important que vous sélectionniez / développiez une technique qui réponde à vos besoins, notamment: lecteurs d'écran, combinaisons images / css / script on / off, référencement, etc.

Voici quelques bonnes ressources pour démarrer sur la voie des techniques de remplacement d'image standardistes:

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

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

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

Willoller
la source
3

Utilisez la balise Condition pour différents navigateurs et en utilisant CSS, vous devez placer height:0pxet width:0pxvous devez également placer font-size:0px.

kedar
la source
3

Si le but est simplement de rendre le texte à l'intérieur de l'élément invisible, définissez l'attribut color sur 0 opacité en utilisant une valeur rgba telle que color:rgba(0,0,0,0);clean et simple.

Cafe Coder
la source
3

Je ne me souviens pas où je l'ai ramassé, mais je l'utilise avec succès depuis des lustres.

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

Mon mixin est en vogue mais vous pouvez l'utiliser comme bon vous semble. Pour faire bonne mesure, je garde généralement une .hiddenclasse quelque part dans mon projet à attacher aux éléments pour éviter les doublons.

itsfreshmade
la source
Je pense avoir lu quelque part que cette version est préférable car un retrait de texte négatif entraînera le navigateur pour afficher une longue boîte de 10000 px (ou tout autre exemple que vous utilisez). Si vous changez la police comme dans cet exemple, le navigateur ne créera pas une grande boîte qu'il essayera de rendre.
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
la source
3
Pourquoi y a-t-il une hauteur de ligne?
SandRock
2

Essayez ce code pour raccourcir et masquer le texte

.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 pour masquer l'utilisation dans votre classe css .hidetxt { visibility: hidden; }

omar kerr
la source
2

repalcez le contenu avec le CSS

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

J'utilise habituellement:

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

Si nous pouvons modifier le balisage, la vie peut être plus facile, il suffit de supprimer le texte et d'être heureux. Mais parfois, le balisage a été placé par du code JS ou nous ne sommes tout simplement pas autorisés à le modifier du tout, trop mauvais CSS s'est avéré être la seule arme mise à notre disposition.

Nous ne pouvons pas placer un <span>habillage du texte et masquer la balise entière. Soit dit en passant, certains navigateurs masquent non seulement les éléments display:nonemais désactivent également les composants à l'intérieur.

Les deux font-size:0pxet color:transparentpeuvent être de bonnes solutions, mais certains navigateurs ne les comprennent pas. Nous ne pouvons pas compter sur eux.

Je suggère:

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

L'utilisation overflow:hiddenrenforce notre largeur et notre hauteur. Certains navigateurs (ne les nommeront pas ... IE ) peuvent lire la largeur et la hauteur au fur min-widthet à mesure min-height. Je souhaite empêcher l'agrandissement de la boîte.

Francisco
la source
1

L'utilisation de la valeur zéro pour font-sizeet line-heightdans l'élément fait l'affaire pour moi:

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

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

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

Pour masquer du texte en html, utilisez la propriété text-indent dans css

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

/ * pour le texte dynamique, vous devez ajouter un espace blanc, afin que votre CSS appliqué ne dérange pas. nowrap signifie que le texte ne passera jamais à la ligne suivante, le texte continue sur la même ligne jusqu'à ce qu'une <br>balise soit rencontrée

urmila manjarikar
la source
1

L'une des façons d'y parvenir est d'utiliser :beforeou :after. J'utilise cette approche depuis plusieurs années et fonctionne particulièrement bien avec les icônes vectorielles de glyphe.

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
la source
0

Cela a fonctionné pour moi avec span (validation par élimination directe).

<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
la source
0

Une solution qui fonctionne pour moi:

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
la source
-1

La meilleure réponse fonctionne pour le texte court, mais si le texte s'enroule, il apparaît simplement dans l'image.

Une façon de le faire est de détecter les erreurs avec un gestionnaire jquery. Essayez de charger une image, si elle échoue, elle génère une erreur.

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

Voir EXEMPLE DE CODE

Shanimal
la source
-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
la source
3
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant pourquoi et / ou comment ce code répond à la question améliore sa valeur à long terme.
Benjamin W.