web-dev-qa-db-fra.com

Pourquoi les éléments enfants ne peuvent-ils pas remplacer l'opacité du parent par une valeur supérieure?

Comme nous le savons, les éléments enfants ne peuvent pas pour l'instant remplacer la propriété opacity de son parent. La propriété opacity du parent prend toujours effet.

Cela a du sens lorsque l'enfant essaie de contourner (remplacer avec une valeur plus petite) l'opacité du parent. Mais qu'en est-il si l'enfant essaie de le remplacer par une valeur supérieure? Cela ne devrait-il pas être autorisé? Pourquoi un parent translucide ne peut-il pas avoir un enfant opaque? Quelqu'un peut-il expliquer pourquoi une telle restriction a été décidée dans le cadre de la conception CSS?

J'apprécierais vraiment que quelqu'un puisse faire la lumière sur la raison théorique de cela. J'essaie essentiellement de découvrir la raison pour laquelle cela ne peut pas être fait (pas des solutions de contournement; comme cela a déjà été dit beaucoup de fois). Je suis sûr que c'est quelque chose que beaucoup de débutants comme moi voudraient savoir.

36
techfoobar

Je n'ai jamais vu cela comme "prioritaire" ou "dérogatoire". C'est une question d'opacités relatives relatives . Si le parent a une opacité de 0.5, l'enfant l'a aussi (par rapport au contexte d'empilement du parent). L'enfant peut avoir sa propre valeur d'opacité entre 0 et 1, mais il sera toujours relatif à l'opacité du parent. Donc, si l'enfant a également opacity: 0.5 set, ce sera 0.25 l'opacité de certains frères et sœurs du parent avec l'opacité 1.

Le spec le traite comme un masque alpha, où l'opacité ne peut être supprimée. Un élément est soit opaque, soit a un certain degré de transparence (n'importe quoi < 1):

L'opacité peut être considérée comme une opération de post-traitement. Conceptuellement, une fois l'élément (y compris ses descendants) rendu dans une image hors écran RGBA, le paramètre d'opacité spécifie comment fusionner le rendu hors écran dans le rendu composite actuel.

et plus tard:

Si l'objet est un élément conteneur, l'effet est comme si le contenu de l'élément conteneur était fusionné avec l'arrière-plan actuel à l'aide d'un masque où la valeur de chaque pixel du masque est <alphavalue>

Quant à pourquoi il a été implémenté de cette façon, je ne pense pas que c'était intentionnel dans le sens de "interdisons cela". Peut-être que cette approche a été choisie pour être plus simple à calculer, et ce n'est que plus tard qu'un besoin réel de quelque chose de différent a été reconnu (puis rgbacolor et background-color ont été introduits - et je peux me tromper sur la chronologie ici).

43
bfavaretto