Je ne veux pas hériter de l'opacité de l'enfant du parent dans CSS

Je ne veux pas hériter l'opacité de l'enfant du parent dans CSS.

j'ai un 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 mettre la propriété opacity dans la div mère, mais je ne veux pas que l'enfant div hérite de la propriété opacity.

Comment faire?

287
css
demandé sur Tom 2011-04-24 15:55:02

13 réponses

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);
493
répondu Dan Blows 2011-04-24 11:59:11

L'opacité n'est pas en fait héritée dans CSS. C'est une transformation de groupe post-Rendu. En d'autres termes, si un <div> a un jeu d'opacité, vous transformez la div et tous ses enfants en un tampon temporaire, puis vous composez ce tampon entier dans la page avec le paramètre d'opacité donné.

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

55
répondu Boris Zbarsky 2011-04-24 13:56:12

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

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

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

fondamentalement, il utilise JavaScript pour supprimer tous les enfants de la div mère, puis repositionner les éléments enfants de nouveau à l'endroit où ils devraient être sans être réellement les enfants de cet élément plus.

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

26
répondu Louis L. 2013-03-22 04:05:54

un petit truc si votre parent est transparent et que vous souhaitez que votre enfant soit le même, mais défini exclusivement (par exemple pour écraser les styles d'agent utilisateur d'un dropdown select):

.parent {
     background-color: rgba(0,0,0,0.5);
}

.child {
     background-color: rgba(128,128,128,0);
}
9
répondu tsveti_iko 2016-11-15 12:04:54

l'Opacité de l'élément enfant est héritée de l'élément parent.

mais nous pouvons utiliser la propriété CSS position pour accomplir notre exploit.

le conteneur de texte div peut être placé à l'extérieur de la div mère, mais avec un positionnement absolu projetant l'effet désiré.

Idéal Exigence------------------>>>>>>>>>>>>

HTML

            <div class="container">       
              <div class="bar">
                  <div class="text">The text opacity is inherited   from the parent div    </div>
              </div>
            </div>

CSS

               .container{
                position:relative;
                                   }
           .bar{
               opacity:0.2;
               background-color:#000;
               z-index:3;
               position:absolute;
               top:0;
               left:0;
              }

              .text{
                color:#fff;

               }

sortie: --

Inherited Opacity of Text(the text color is #000; but not visisble.)

le texte n'est pas visible parce qu'il hérite de l'opacité de div.parent.

Solution ------------------->>>>>>

HTML

       <div class="container">  
         <div class="text">Opacity is not inherited from parent div "bar"</div>
         <div class="bar"></div>
       </div>

CSS

               .container{
                position:relative;
                                   }
           .bar{
               opacity:0.2;
               background-color:#000;
               z-index:3;
               position:absolute;
               top:0;
               left:0;
              }

              .text{
                color:#fff;
                z-index:3;
                position:absolute;
               top:0;
               left:0;  
               }

sortie:

Not Inherited

le Texte est visible avec la même couleur comme de fond parce que le div n'est pas dans le div transparent

6
répondu Aman 2015-07-22 07:04:34

la question n'a pas été définie si le fond est une couleur ou une image mais comme @Blowski a déjà répondu pour les fonds colorés, il y a un hack pour les images ci-dessous:

background: linear-gradient(rgba(0,0,0,.6), rgba(0,0,0,.6)), url('image.jpg');

de Cette façon, vous pouvez manipuler la couleur de votre opacité et même ajouter un joli dégradé effets.

.wrapper {
  width: 630px;
  height: 420px;
  display: table;
  background: linear-gradient(
    rgba(0,0,0,.8), 
    rgba(0,0,0,.8)), 
    url('http://cdn.moviestillsdb.com/sm/35bc3c6a2b791425de6caf8b9391026e/rambo-iii.jpg');
 }

h1 {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
  color: #fff;
  }
<div class="wrapper">
<h1>Question 5770341</h1>
</div>
3
répondu Rico Letterman 2015-11-30 18:16:11

il semble que display: block éléments n'héritent pas l'opacité de display: inline parents.

exemple de code

peut-être parce que c'est un markup invalide et que le navigateur les sépare secrètement? Parce que la source ne montre pas que ça arrive. Ai-je raté quelque chose?

2
répondu Andrew Tibbetts 2016-02-28 05:09:09

les Réponses ci-dessus semblent compliquées pour moi, donc j'ai écrit ceci:

#kb-mask-overlay { 
    background-color: rgba(0,0,0,0.8);
    width: 100%;
    height: 100%; 
    z-index: 10000;
    top: 0; 
    left: 0; 
    position: fixed;
    content: "";
}

#kb-mask-overlay > .pop-up {
    width: 800px;
    height: 150px;
    background-color: dimgray;
    margin-top: 30px; 
    margin-left: 30px;
}

span {
  color: white;
}
<div id="kb-mask-overlay">
  <div class="pop-up">
    <span>Content of no opacity children</span>
  </div>
</div>
<div>
 <p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin vitae arcu nec velit pharetra consequat a quis sem. Vestibulum rutrum, ligula nec aliquam suscipit, sem justo accumsan mauris, id iaculis mauris arcu a eros. Donec sem urna, posuere id felis eget, pharetra rhoncus felis. Mauris tellus metus, rhoncus et laoreet sed, dictum nec orci. Mauris sagittis et nisl vitae aliquet. Sed vestibulum at orci ut tempor. Ut tristique vel erat sed efficitur. Vivamus vestibulum velit condimentum tristique lacinia. Sed dignissim iaculis mattis. Sed eu ligula felis. Mauris diam augue, rhoncus sed interdum nec, euismod eget urna.

Morbi sem arcu, sollicitudin ut euismod ac, iaculis id dolor. Praesent ultricies eu massa eget varius. Nunc sit amet egestas arcu. Quisque at turpis lobortis nibh semper imperdiet vitae a neque. Proin maximus laoreet luctus. Nulla vel nulla ut elit blandit consequat. Nullam tempus purus vitae luctus fringilla. Nullam sodales vel justo vitae eleifend. Suspendisse et tortor nulla. Ut pharetra, sapien non porttitor pharetra, libero augue dictum purus, dignissim vehicula ligula nulla sed purus. Cras nec dapibus dolor. Donec nulla arcu, pretium ac ipsum vel, accumsan egestas urna. Vestibulum at bibendum tortor, a consequat eros. Nunc interdum at erat nec ultrices. Sed a augue sit amet lacus sodales eleifend ut id metus. Quisque vel luctus arcu. 
 </p>
</div>

kb-mask-overlay c'est votre (opacité) parent, pop-up c'est votre (pas d'opacité) enfants. Tout en dessous du reste de votre site.

2
répondu 1_bug 2016-06-18 07:10:18

si vous devez utiliser une image comme arrière-plan transparent, vous pourriez être en mesure de travailler autour de lui en utilisant un élément pseudo:

html

<div class="wrap"> 
   <p>I have 100% opacity</p>  
</div>

css

.wrap, .wrap > * {
  position: relative;
}
.wrap:before {
  content: " ";
  opacity: 0.2;
  background: url("http://placehold.it/100x100/FF0000") repeat;     
  position: absolute;
  width: 100%;
  height: 100%;
}
0
répondu subarachnid 2014-07-01 17:13:50

ma réponse ne concerne pas la mise en page statique parent-enfant, mais les animations.

je faisais une démo svg aujourd'hui, et j'avais besoin de svg pour être à l'intérieur de div (parce que svg est créé avec la largeur et la hauteur de div de parent, pour animer le chemin autour), et cette div de parent avait besoin d'être invisible pendant l'animation svg path (et alors cette div était censée animate opacity from 0 to 1 , c'est la partie la plus importante). Et parce que parent div avec opacity: 0 cachait mon svg, je suis tombé sur ce hack avec visibility option (enfant avec visibility: visible peut être vu à l'intérieur de parent avec visibility: hidden ):

.main.invisible .test {
  visibility: hidden;
}
.main.opacity-zero .test {
  opacity: 0;
  transition: opacity 0s !important;
}
.test { // parent div
  transition: opacity 1s;
}
.test-svg { // child svg
  visibility: visible;
}

et puis, dans js, vous supprimez .invisible classe avec fonction de temporisation, ajoutant .opacity-zero classe, disposition de déclenchement avec quelque chose comme whatever.style.top; et supprimer .opacity-zero classe.

var $main = $(".main");
  setTimeout(function() {
    $main.addClass('opacity-zero').removeClass("invisible");
    $(".test-svg").hide();
    $main.css("top");
    $main.removeClass("opacity-zero");
  }, 3000);

il vaut mieux vérifier cette démo http://codepen.io/suez/pen/54bbb2f09e8d7680da1af2faa29a0aef?editors=011

0
répondu Nikolay Talanov 2015-01-05 19:27:52

attribuer l'opacité 1.0 à l'enfant de façon récursive avec:

div > div { opacity: 1.0 }

exemple:

div.x { opacity: 0.5 }
div.x > div.x { opacity: 1.0 }
<div style="background-color: #f00; padding:20px;">
  <div style="background-color: #0f0; padding:20px;">
    <div style="background-color: #00f; padding:20px;">
      <div style="background-color: #000; padding:20px; color:#fff">
         Example Text - No opacity definition
      </div>
    </div>  
  </div>
</div>
<div style="opacity:0.5; background-color: #f00; padding:20px;">
  <div style="opacity:0.5; background-color: #0f0; padding:20px;">
    <div style="opacity:0.5; background-color: #00f; padding:20px;">
      <div style="opacity:0.5; background-color: #000; padding:20px; color:#fff">
        Example Text - 50% opacity inherited
      </div>
    </div>  
  </div>
</div>
<div class="x" style="background-color: #f00; padding:20px;">
  <div class="x" style="background-color: #0f0; padding:20px;">
    <div class="x" style="background-color: #00f; padding:20px;">
      <div class="x" style="background-color: #000; padding:20px; color:#fff">
         Example Text - 50% opacity not inherited
      </div>
    </div>  
  </div>
</div>
<div style="opacity: 0.5; background-color: #000; padding:20px; color:#fff">
  Example Text - 50% opacity
</div>
0
répondu Ted Scheckler 2017-08-22 14:10:40

il n'y a pas d'approche universelle, mais une chose que j'ai trouvé particulièrement utile est de définir l'opacité pour les enfants directs d'une div, à l'exception de celui que vous voulez garder pleinement visible. Dans le code:

<div class="parent">
    <div class="child1"></div>
    <div class="child2"></div>
    <div class="child3"></div>
    <div class="child4"></div>
</div>

et css:

div.parent > div:not(.child1){
    opacity: 0.5;
}

dans le cas où vous avez des couleurs d'arrière-plan/images sur le parent, vous fixez l'opacité de la couleur avec rgba et l'arrière-plan-image en appliquant des filtres alpha

0
répondu liviu blidar 2018-01-11 16:05:30

pour les autres personnes essayant de faire une table (ou quelque chose) regarder concentrée sur une rangée en utilisant l'opacité. Comme @Blowski a dit utiliser la couleur pas l'opacité. Regardez ce violon: http://jsfiddle.net/2en6o43d /

.table:hover > .row:not(:hover)
-2
répondu Milk Man 2014-11-28 21:23:56