Overblog Tous les blogs Top blogs Photographie
Editer l'article Suivre ce blog Administration + Créer mon blog
MENU

Paris, photo, humeurs, un peu de HTML/CSS pour faire sérieux. Feinte innocence et vraie naïveté (ou vice-versa). Encore un blog qui agite ses petits bras en couinant "Viens me lire !"

Publicité

[CSS] Comment cacher du texte indésirable ?

détail du 'Dragon' de Max Escher

Pour une fois, on va s'offrir un petit sujet tout simple et nourri d'une expérience récente.

De quoi est-il question ? De tous les petits bouts de texte imposés par la plate-forme de blog :  Inscription à la newsletter ,  Photo précédente ,  publié par  etc. .

J'ai trouvé quatre procédés différents, que je présenterai par ordre de difficulté croissante en expliquant, comme d'habitude, sur des exemples leur principe et les raisons de choisir tel ou tel.

Bonus tardif : une cinquième méthode signalée en commentaire. M'a seulement fallu le temps de trouver un titre pour l'inclure dans l'article…


Frankenstein ou le Prométhée moderne Mary Shelley

Le plus simple serait encore de ne pas écrire du tout ces textes. Ce n'est pas seulement une boutade (même si …) : l'administration OB permet de préciser assez finement pas mal de choses, plus particulièrement du côté des articles. La première question à se poser est donc : existe-t-il un moyen de ne pas inclure ce texte dans la page ?

Si la réponse était toujours oui, mon article serait terminé.

Supposons que non : le texte est bel et bien dans la page HTML, il faut donc le masquer.

À ce stade, il me semble sage de sauvegarder la page incriminée sur votre micro, pour pouvoir examiner tranquillement son code HTML avec un bon éditeur de texte – ou encore utiliser la très commode barre WebDeveloper de Firefox. M'enfin, si vous préférez expérimenter sans filet directement sur votre blog, ça ne regarde que vous – et vos lecteurs, qui assisteront en direct aux soubresauts de la bête.

Mais vous êtes raisonnable, le fichier est chez vous, vous l'avez regardé sans stress inutile, et repéré le texte qui offense vos chastes prunelles.

Amédée, ou comment s'en débarrasser Ionesco

Commençons par la situation la plus favorable : le texte est doté d'un identifiant, d'une classe, ou au moins se trouve compris dans un span ou un div anonyme mais rien que pour lui – c'est souvent vrai dans les modules, où pratiquement tout est identifié. On peut alors élaborer un sélecteur plus ou moins raffiné pour désigner le texte. Ne reste plus qu'à indiquer dans le fichier CSS qu'on veut retirer le trublion de la page.

Pour  retirer le trublion de la page  on écrit {display:none}. Deux exemples pris dans le présent blog :

.box-footer {display:none}
retire le pied de tous les modules
.calendrier .box-titre {display:none}
retire le titre du module "Calendrier" (écrire  Calendrier  au-dessus d'un tableau contenant des nombres de 1 à 31 disposés en sept colonnes m'a toujours semblé un bel exemple de précision inutile)
(note 2013 : ce n'est plus vrai aujourd'hui parce qu'une infernale cuisine de JS modifie le titre de ce module – mais passons, vous avez compris)

Inutile d'insister, la technique est facile, bien connue, et marche avec tous les navigateurs.

Retenez seulement le point essentiel : l'élément HTML ainsi traité figure bien dans la page, il est bien transmis au micro de votre lecteur mais, visuellement,  tout se passe comme si  le code HTML correspondant avait été effacé de la page. C'est bien pourquoi j'emploie ici  retirer  plutôt que  masquer . Subtilité absconse ? Lisez plutôt la suite (crévinguiou, transformer du bidouillage de blog en roman à suspens, fallait oser !).

L'homme invisible H.G. Wells

Cas un peu plus compliqué : le fragment indésirable n'est pas identifiable explicitement. Au lieu de ça, il se trouve pris dans autre chose. Cet  autre chose  est, lui, facilement désignable par un sélecteur mais contient aussi des éléments que l'on veut conserver à l'écran.

Un exemple ici est le module d'inscription à la newsletter, où la phrase  Inscription à la newsletter  me semblait faire double emploi avec le titre du module. Comment éliminer la phrase ?

Comme toujours, on commence par regarder le code HTML pour savoir qui est dans quoi :

 <div class="box newsletter"> <!-- Le module --> <div class="box-titre"> <!-- 1 - titre du module--> <h2><span>Abonnez-vous !</span></h2> </div> <div class="box-content"> <!-- 2 - corps du module --> Inscription à la newsletter <!-- 2.1 baratin --> <form > <!-- 2.2 formulaire --> <!-- une zone de saisie et un bouton --> </form> </div> <div class="box-footer"> <!-- 3 - pied du module --> <h2><span>&nbsp;</span></h2> </div> </div> 
(code allégé, annoté et redisposé pour les besoins de la cause)

Le baratin n'a pas reçu d'étiquetage (classe ou identifiant) particulier : comment ne masquer que lui et pas le <form> ?

On peut imaginer contourner la difficulté en déclarant retirer tout le corps du module …

 .newsletter .box-content{display:none} 
… MAIS faire réapparaître le composant souhaité :
 .newsletter form {display:block} 

Bon raisonnement, malheureusement ça ne marche pas. Le recours à {display:none} élimine de l'affichage le corps du module et tous ses constituants – comme annoncé,  tout se passe comme si  le code HTML du corps de module ne figurait plus dans la page.

Alors ? Il y a une autre voie : on peut déclarer qu'un élément, tout en continuant à figurer dans la page, y est  invisible ,  transparent . Ça se dit {visibility:hidden}. Comme l'élément, bien qu'invisible, est considéré comme toujours présent, on peut faire réapparaître certains de ses constituants. Ce qui donne un CSS tel que :

 .newsletter .box-content {visibility:hidden;} .newsletter form {visibility:visible;} 

Ça marche parfaitement, et avec tous les navigateurs.

Il reste un petit hic : la phrase maudite est transparente mais pas supprimée, et elle occupe toujours de la place. Le plus simple, si on veut fignoler, est alors de faire remonter l'élément suivant (ici le formulaire de saisie) en lui donnant une marge négative, pour lui permettre d'empiéter sur l'emplacement du texte. Le CSS définif est donc :

 .newsletter .box-content {visibility:hidden;} .newsletter form {visibility:visible; margin-top:-14px;} 
(la valeur exacte de la marge négative dépend évidemment de la présentation du blog)

Un résultat d'expérience perso : les marges négatives marchent bien dans tous les navigateurs – tant qu'on n'en abuse pas. Quand on commence à les empiler (p.ex. une marge négative en haut et positive en bas sur un même élément), il arrive à Internet Explorer de perdre pied pour la mise en page et de donner dans le  peek-a-boo  (=affichage erratique). Prudence et test systématique, donc.

Un néant à l'égard de l'infini Pascal

Les deux techniques précédentes, simples et fiables, sont de grands classiques. Certains cas tordus demandent cependant plus d'ingéniosité.

Un exemple ici est fourni par la pagination, au-dessus des articles : les mots  début ,  précédent ,  suivant ,  fin  m'agaçaient un peu et j'aurais bien mis une image à leur place. Pour y comprendre quelque chose, regardons le code de  suivant  (celui des trois autres est analogue) :

 <!-- next page --> <a href="..." rel="next" class="textNext">suivant</a> 

Mettre une image, c'est facile : il suffit de la définir comme image de fond :

 a.textNext {background-image:url(une-certaine-image.gif)} 

Mais comment masquer le texte, et seulement le texte, du lien, en conservant ce lien ? Pas question bien sûr de retirer le lien de la page, pas question non plus de le rendre invisible : il serait inutilisable parce que le fond serait lui aussi invisible.

Je n'ai trouvé qu'un bricolage un peu scabreux : utiliser une police de taille … zéro !

 a.textNext {font-size:0} 

Scabreux mais rigolo : le texte se trouve réduit à un carré de zéro pixel de côté, et le pavé correspondant en est tout ratatiné ! Pour le regonfler, il suffit d'ajuster le padding :

 a.textNext, a.textLast, a.textPrevious, a.textFirst {text-decoration: none; font-size: 0; padding: 15px 20px 8px;} 
(là aussi, les valeurs de padding sont à adapter à votre cas particulier)

Cette technique est à réserver aux cas les plus rétifs :

  1. l'ajustement des padding peut être très fastidieux
  2. surtout, la taille zéro n'est pas comprise par tous les navigateurs. Surprise, ce n'est pas Internet Explorer qui fait ici des siennes, mais Safari qui se distingue – à qui se fier ? Du coup, sous Safari, les pavés en question sont énormes : le padding a augmenté alors que le texte a gardé sa taille d'origine.

Pour résoudre la question j'ai alors tenté, sans toucher à la taille des caractères ni au padding, de donner au texte la même couleur qu'au fond, à défaut de pouvoir écrire {color:transparent} qui serait pourtant l'idéal mais n'est pas compris par tous les navigateurs (là, c'est IE le maillon faible). Le jeu sur les couleurs marche naturellement très bien dans tous les navigateurs mais l'encombrement du texte ne change pas – et on ne peut pas lui imposer une largeur puisque c'est une  boîte en ligne  ( inline box ).

En résumé : cette troisième technique ne tient pas ses promesses et il a donc fallu, tadaaaam, inventer une quatrième technique.

Zazie dans le métro Raymond Queneau

C'est fou la quantité d'humanité qui tient dans un métro aux heures de pointe … Voilà le principe de la dernière technique que je n'ai empruntée à personne : tasser les lettres du texte dans un coin vide du motif de fond. Il y a une propriété CSS pour tasser les lettres : letter-spacing. Si la valeur en est positive, elle s'ajoute à l'espace déjà présent entre les lettres ; négative, elle s'en retranche et les lettres se rapprochent, jusqu'à finir par se superposer ou presque. On obtient une  boulette  de texte large comme un peu plus d'un caractère et donc plus facile à planquer que le texte normal.

Si l'on pousse la valeur négative assez loin, le texte peut aller jusqu'à s'écrire de droite à gauche ! Mais tous les navigateurs ne gèrent pas correctement un cas aussi pathologique, certains  explosent  bien avant d'en arriver à cette inversion du sens d'écriture, et des essais s'imposent. Voici le CSS que j'ai utilisé un temps pour les flèches du bandeau de pagination :

 .textNext, .textLast, .textPrevious, .textFirst {letter-spacing: -0.8ex; color: #f7efde;background-repeat: no-repeat;} a.textFirst,a.textPrevious {background-position:center right; padding-left :0} a.textNext, a.textLast {background-position:center left; padding-right:0} a.textFirst { padding-right:25px; margin-right:-5px; background-image: url([...]/nav16-First.gif) } a.textPrevious { padding-right:15px; margin-right:10px; background-image: url([...]/nav16-Previous.gif)} a.textNext { padding-left :18px; margin-left :10px; background-image: url([...]/nav16-Next.gif) } a.textLast { padding-left :25px; background-image: url([...]/nav16-Last.gif) } 

La couleur du texte est bien sûr la même que celle du fond. Quant aux margin et padding gauche et droite, ils ont été trouvés, par ajustements successifs, pour que la  boulette  de texte soit rejetée dans une zone vide du fond sans empiéter sur le dessin des background-image. La valeur de ces margin et padding dépend donc étroitement de ce dessin.

Vous l'avez compris, mieux vaut réserver cette technique bricoloïdo-crapoteuse aux cas pénibles comme celui-ci…

Pousse-toi, tu bouches la vue Anonyme, cinéma

Celle-là est offerte par un commentateur et je m'en veux de n'y avoir pas pensé moi-même ! Elle utilise la propriété text-indent qui décale la première ligne d'un élément de type bloc. C'est à dire ? C'est à dire que, pour la plupart de mes paragraphes, on a text-indent:0 mais…

Mais que pour celui-ci, auquel j'ai ajouté style="text-indent : 10em", la première ligne est décalée de 10em vers la droite. Pour que vous compreniez bien, il faut maintenant que je baratine assez longtemps pour que le paragraphe compte au moins une ligne supplémentaire qui, elle, sera calée sur la marge de gauche tout comme les suivantes. Là, on se calme, il y en a assez.

Ça marche aussi avec des valeurs négatives. Ici j'ai ajouté style="text-indent : -2em" et la première ligne se décale de 2em vers la gauche. Attention, le paragraphe suivant commence comme celui-ci :

Ça marche aussi avec des valeurs négatives mais si on ajoute, en plus, un overflow bien choisi pour arriver à style="text-indent : -2em; overflow : hidden", ce qui dépasse du paragraphe est rogné.

Je vous laisse trouver la manière de mettre ça en œuvre, vous êtes grand. Faites attention tout de même : text-indent n'agit que sur des éléments de type bloc. Voici un span à fond gris et voici un autre span à fond gris avec text-indent:2em. Hé bien on n'observe aucun décalage…

À cette contrainte près, voilà une bonne technique simple à comprendre et à appliquer – enfin, je crois.

Publicité
Retour à l'accueil
Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
N
On peut aussi utiliser la propriété text-indent : -9999px
Répondre
A
<br /> <br /> Pas sot, ça ! Ne marche que pour des textes courts (moins d'une ligne) mais justement, c'est un cas fréquent. Je compléterai l'article un de ces jours, promis !<br /> <br /> <br /> <br />
C
tiens en voilà une idée qu'elle est bonne...
Répondre
C
Voilà, avec les tuyaux je comprends mieux, merci. <br /> Et aussi parce qu'aujourd'hui j'ai enfin essayé le rapatriement pour un copain qui avait des réparations à faire - si j'avais su cela à l'époque, j'aurais eu moins de cheveux gris...<br /> Donc j'ai enfin vu la source de tout le bazar d'un bout à l'autre au grand complet, et pour les images c'est impressionnant, je trouve ça même assez beau (comme le cunéiforme, de grandes plages remplies partout, partout).
Répondre
A
<br /> Arf... les prochains bols seront ornés de code source ? :-D :-D<br /> <br /> <br />
C
Oui, c'est logique, si on écrit avec la même couleur, le navigateur devrait les voir identiques...<br /> mais dans le cas du jpeg ça ne marche effectivement pas, la preuve : <br /> http://christina.guwang.over-blog.fr/article-17818381.html#voirici<br /> (un peu plus bas, avant-dernière illustration)<br /> J'avais trouvé l'équivalence en tâtonnant (#292929 = 414141) et quand plus tard j'ai trouvé the Gimp, j'ai vérifié, c'est bien ça, 41, pour une fois ce serait donc IE qui voit juste (pardon, pardon, pardon, pas ma faute, et je vous jure, je n'ai pas d'actions chez eux) <br /> <br /> Et bon anniversaire ! Merci pour ce beau et cultivant et intéressant et passionnant blog... comment dire, en résumé : indispensablement utile et agréable et... (oui, je sais, on peut aussi faire court - "on" ce sont les autres...)
Répondre
A
<br /> Résumons :<br /> -si on donne la même valeur à color (pour le texte) et background-color (pour le fond, sans image) , ça camoufle bien dans tous les cas et tous les navigateurs.<br /> -si on se sert d'une image, les surprises commencent. Ce qui s'explique : une image ne passe pas dans les mêmes "tuyaux" qu'un code couleur bête et méchant. Je parierais même qu'un aplat d'une<br /> couleur finement nuancée (pas une couleur pure, plutôt un  #ab4253) peut ressortir un peu différemment dans un même navigateur selon qu'on est en gif, jpeg, png ou autre, toutes questions de<br /> compressions mises à part. <br /> <br /> <br />
C
ça me rapelle mes ruses de guerre au début (basiques : invisibles, taille de police 0... au pif, sans aller si loin vu que je pige(ais) que dalle au css - dommage de ne pas être tombée là-dessus à l'époque - cet hiver faudra que je potasse sérieusement tout votre pourquoi du comment...)<br /> Par contre le coup de la couleur de fond, en tout cas en ce qui concerne l'équivalence des couleurs en html (couleur du fond de mes images à texte), ça ne marche pas avec tous les navigateurs : IE (pardon) le voit pareil = invisible, FF le voit plus foncé et safari le voit plus clair... c'est taré.
Répondre
A
<br /> Pour le rendu des couleurs, je sais qu'en effet c'est piégeux selon les navigateurs.<br /> Je pense tout de même que si on écrit en avec la couleur #112233 sur un fond uni (un aplat de couleur, pas une image de fond) de la même couleur #112233, il n'y aura pas de différence : le rendu de<br /> #112233 sera peut-être différent selon qu'on utilise IE ou FF ou Safari, un Mac ou un PC, un écran cathodique ou un écran à cristaux liquides, mais il sera commun au texte et au fond.<br /> En revanche, je ne jurerais pas qu'un fichier JPEg uni, soigneusement fabriqué avec cette même couleur #112233, donne le même résultat.<br /> <br /> <br />
A
Un inconvénient - mineur - de ta technique de texte tassé de la même couleur que le fond : si on s'amuse à sélectionner la zone (ce que je me suis empressé de faire...), on voit apparaître le texte tout tassé en surbrillance...
Répondre
A
Egggggzellente observation ! :-D Cette technique dégage, de toute manière, un fort parfum de bricolage à la Dubout !
J
Bonjour,<br /> <br /> Premierement felicitations pour ton blog, je le trouve tres bien et tres astucieux.<br /> Je suis pas devellopeur et je me demande encore comment faire ton systeme de texte cacher qui apparait en un seul clique... j'ai lu ton truc et j'ai pas tout compris mais je te tiens au courant quand je vais me pencher un peu plus dessus :0023:<br /> <br /> Ciao
Répondre
A
Relis l'article tranquillement, avec une bonne cafetière à portée de main - ça devrait aider  ;-)Merci pour les compliments, tu reviens quand tu veux !
M
J'vois que tes liens de page sont dans un div. Tu précises une hauteur à ce div, tu mets les liens en block et en float:left, et tu peux à la fois préciser une largeur et garder tes liens en ligne. Non ? ^^<br /> <br /> Et saf' interprête tout ce qu'il lit, j'crois pas qu'il y ait de hack spécial pour. M'enfin Google, macbidouille et mac4ever sont tes amis pour plus de renseignements ^^
Répondre
A
Ca devient vraiment tout et son contraire,ici ... :-DPuisque tu as regardé le source, tu as sûrement regardé le CSS aussi. Tu as donc vu que le div en question est déjà doté d'une hauteur (en fait, est inclus dans un div de hauteur fixée) . display:block et float:left (le premier étant inutile car impliqué par le second) je connais . Un peu. Tout petit peu.Question pour un champion : Comment tu centre(rai)s une brochette de float dans un div ? Sachant que le contenu du div peut varier en largeur d'une page à l'autre ?J'ai exploré diverses idées, aucune n'est parfaite, mais si tu en as une nouvelle et qui sorte de la rtoutine..."Saf interprète tout ce qu'il  lit" ... mais n'en tient pas toujours compte, si je comprends bien ?
M
... et d'ailleurs, un truc qui marche très bien, c'est le :<br /> <br /> font-size:0px; /* pour {navigateurs}Saf' */<br /> color:transparent; /* pour saf' */
Répondre
A
Ca, ça peut être intéressant. Comme, en font-size:0, je dois trafiquer les paddings, connais-tu un truc pour masquer une règle à Safari ? Note : j'ai changé de technique depuis l'article, et suis passé au principe de couleur=couleur de fond, ça devrait avoir une tête potable sous Safari. Avant ça, les .pavés à flèches étaient énormes : font-size inchangé + padding regonflé.Si je ne peux pas changer de padding pour Safari, les pavés resteront énormes (même si le texte ne s'y verra plus).Grattage de crâne en perspective
M
bien sûr que si, on peut lui donner une largeur :)<br /> <br /> display:block;<br /> width:largeur;<br /> <br /> et yopla ^^<br /> <br /> (pratiqué et approuvé sous tous les navigateurs que je connais - sauf sous Lynx, mais faut pas trop en demander :D )
Répondre
A
MERCI de ta visite et de ta lecture attentive mais, lectrice darling, comment fais-tu si le bébé doit rester en display:inline ? ? Parce que tu ne peux pas changer le html, que tu ne veux pas que tes numéros de page se disposent en colonne et que tu les veux au milieu de la page (donc pas non plus de float possible).?Si ta science, ton ingéniosité, et ton amour filial trouvent une solution, je suis preneur ....