474 votes

Je ne veux pas que l'opacité de l'enfant soit héritée du parent en CSS.

Je ne veux pas que l'opacité de l'enfant soit héritée du parent en CSS.

J'ai une div qui est le parent, et j'ai une autre div à l'intérieur de la première div qui est l'enfant.

Je veux définir la propriété d'opacité dans la division parent, mais je ne veux pas que la division enfant hérite de la propriété d'opacité.

Comment puis-je faire ça ?

17 votes

opacity est un peu comme display: none dans ce sens.

3 votes

Regardez le populaire stackoverflow.com/questions/806000/

753voto

Blowski Points 7500

Au lieu d'utiliser l'opacité, définissez une couleur de fond avec rgba, où 'a' est le niveau de transparence.

Donc, au lieu de :

background-color: rgb(0,0,255); opacity: 0.5;

utiliser

background-color: rgba(0,0,255,0.5);

7 votes

Cela ne fonctionne que pour la couleur de fond, à moins que la couleur du texte ne supporte le canal alpha ? Une autre solution similaire pour le fond est bien sûr le puissant .png :)

1 votes

Background-color : rgba(0,0,255,0.5) ; ce code est correct, mais ne fonctionne pas avec ie6 et ie7

2 votes

@Madmartigan Oui, si vous souhaitez que le texte de la division parent soit opaque, vous devez définir l'opacité du texte avec un span. Vous pouvez utiliser un polyfill pour le rendre rétrocompatible, ou vous pouvez utiliser un png.

75voto

Boris Zbarsky Points 22158

L'opacité n'est pas réellement héritée en CSS. Il s'agit d'une transformation de groupe post-rendu. En d'autres termes, si une <div> a une opacité définie, vous rendez le div et tous ses enfants dans un tampon temporaire, puis vous composez ce tampon entier dans la page avec le paramètre d'opacité donné.

Ce que vous voulez faire ici dépend du rendu exact que vous recherchez, ce qui n'est pas clair dans la question.

3 votes

Dans Chrome 26.0.1410.63, c'est faux. Réglage de opacity: .7; sur div#container fait que chaque élément enfant - de ul / li a img a p - ont également la même opacité. Il s'agit très certainement d'un héritage.

62 votes

Si c'était un héritage, ils seraient plus légers. Essayez de mettre opacity: 0.7 sur tous les descendants pour voir à quoi ressemblerait l'héritage. Comme je l'ai dit, ce qui se passe à la place, c'est que l'opacité est appliquée à l'ensemble du groupe "élément et tous ses descendants" comme une unité au lieu d'être héritée.

30voto

Louis L. Points 172

Comme d'autres l'ont mentionné dans ce fil et dans d'autres fils similaires, la meilleure façon d'éviter ce problème est d'utiliser RGBA/HSLA ou d'utiliser un PNG transparent.

Mais, si vous voulez une solution ridicule, similaire à celle liée à une autre réponse dans ce fil (qui est aussi mon site web), voici un tout nouveau script que j'ai écrit qui résout ce problème automatiquement, appelé thatsNotYoChild.js :

http://www.impressivewebs.com/fixing-parent-child-opacity/

Il utilise JavaScript pour supprimer tous les enfants du div parent, puis repositionne les éléments enfants à l'endroit où ils devraient être sans être réellement des enfants de cet élément.

Pour moi, cela devrait être un dernier recours, mais j'ai pensé qu'il serait amusant d'écrire quelque chose qui le fasse, si quelqu'un veut le faire.

6voto

Wesley Murch Points 48959

L'enfant hérite toujours de l'opacité de son parent.

Démonstration de la première solution de contournement que j'ai trouvée :

http://www.impressivewebs.com/demo-files/css-opacity/css-opacity-demo.html

Toutes les solutions de contournement semblent utiliser le positionnement relatif ou absolu pour déplacer le contenu translucide (frère) sous le contenu opaque.

Une autre solution consiste à définir explicitement l'opacité de chaque élément enfant sauf celui que vous souhaitez rendre totalement opaque, et utilisez un arrière-plan .png ou un canal alpha comme le suggère @Blowski pour l'élément parent. Cela signifie que le parent doit être un div "enveloppant" pour tous les autres éléments (pas de nœuds de texte directement dans le parent).

0voto

Arun.tomy Points 6

Comment ne pas hériter de l'opacité de l'enfant à partir du parent en CSS ?

En utilisant des pseudo-éléments, vous pouvez facilement résoudre ce problème. Utilisez "::before" pour le div parent. Consultez le lien ci-dessous pour un exemple concret :

http://sakhatech.com/blog/2013/07/24/pseudo-element-in-css3-and-html5/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X