comment gérer la "double opacité" de deux divs se chevauchant

j'ai deux divs, les deux avec 0,6 opacité. J'ai besoin qu'ils se chevauchent mais conservent leur opacité et ne créent pas un nouveau niveau d'opacité combiné. Je ne peux pas utiliser une image.

éditer -- le petit cercle est censé avoir un élément de toile en elle. Je ne sais pas si les pseudo-éléments seraient la meilleure solution.

est - ce qu'il y a de toute façon à faire ça avec CSS, ou devrais-je juste utiliser de la toile?

exemple -

http://dabblet.com/gist/1566209

HTML:

<div id="foo">
    <div id="bar">
    </div>
</div>

CSS:

/**
 * Double Opacity
 */
body{background:green;}

#foo{
height:150px;
width:250px;
background:rgba(0, 0, 0, 0.6);
position:absolute;
left:40%;
top:20%;
}

#bar{
height:40px;
width:40px;
background:rgba(0, 0, 0, 0.6);
border-radius:40px;
position:absolute;
top:-15px;
left:-15px;
}
29
demandé sur web-tiki 2012-01-05 21:28:27

5 réponses


résumé:


Selon ce qui est nécessaire, il peut être délicat, mais l'approche de base est assez simple.



j'ai écrit un article entier à ce sujet ici:

il pourrait être plus facile à lire.

http://dream-world.us/2012/01/07/overlapping-transparent-divs-with-one-border /



Cette approche est un peu différente de ma première pensée... mais cela a le même résultat.

  1. j'ai fait un motif noir / transparent pour le cercle et l'ai fixé à :before .
  2. Le cercle est alors transformé rotate(180deg) et déménagé pour s'installer sur la le coin du <div> .
  3. puis j'ai mis le opacity de ce cercle à 0.6 .
  4. le <div> lui-même n'est pas affecté par le opacity .
  5. ensuite j'ai ajouté l'élément :after et j'ai mis une image comme background (vous pouvez le contrôler via js si nécessaire)
  6. j'ai ajouté quelques effets à l'image ( border-radius , box-shadow , border ) pour montrer comment cet élément peut être facilement et indépendamment géré.
  7. j'ai utilisé un fond plus léger et j'ai mis le opacity à 0.3 pour montrer le résultat

voici le violon: http://jsfiddle.net/pixelass/nPjQh/4 /

Regardez cette version pour quelques résultats fous: http://jsfiddle.net/pixelass/nPjQh/5 /

chacun de ces exemples n'utilise qu'un seul élément div 1519320920"

règles de base. (ces règles "pourraient" être utilisées pour créer un comportement dynamique avec js)

position = absolu;

top = circleHeight / -2;

gauche = circleHeight / -2; //(à gauche = en haut)

rotation = 180deg;

opacity = valeuraofbackground;

bgColor = valueRGBofBackground;

#inner {
    width: 100%;
    height: 100%;
    position: absolute;
    left: 0;
    top: 0;
    z-index: -1;
    background-color: rgba(0, 0, 0, 0.3);
    padding:20px;
    border-radius: 20px;
    border-top-left-radius: 0;
}
#inner:before {
    content: "";
    background-image: -webkit-linear-gradient(transparent 50%, rgb(0, 0, 0) 50%, rgb(0, 0, 0)),
        -webkit-linear-gradient(0deg, transparent 50%, rgb(0, 0, 0) 50%, rgb(0, 0, 0));
    height: 40px;
    width: 40px;
    border-radius: 40px;
    position: absolute;
    top: -20px;
    left: -20px;
    -webkit-transform: rotateZ(180deg);
    opacity:0.3;
}
#inner:after {
    content: "";
    background: url('http://lorempixel.com/10/10/sports/1/') no-repeat;
    background-position:0;
    height: 10px;
    width: 10px;
    border-radius: 10px;
    position: absolute;
    top: -6px;
    left: -6px;
    -webkit-box-shadow: 0 0 10px rgb(255,255,255);
    border: 1px rgb(255,255,255) solid;

}

meilleure explication


version commentée originale http://jsfiddle.net/pixelass/nPjQh/10 /

voir les commentaires dans le code ci-dessous

#inner {
background: rgba(0,0,0,0.5) /*this is the full color-code of the div (with alpha)*/
}
#inner:before {
    /*the solid color of the circle = rgbValue of the div*/
    background-image: -webkit-linear-gradient(transparent 50%, rgb(0, 0, 0) 50%, rgb(0, 0, 0)),
        -webkit-linear-gradient(0deg, transparent 50%, rgb(0, 0, 0) 50%, rgb(0, 0, 0));
    /*opacity of the circle = alpha of the div*/
    opacity: 0.5;
}

cet exemple a un div entièrement transparent ...le cercle est un "pacman" - forme: http://jsfiddle.net/pixelass/nPjQh/14 /

pacman shaped circle


gestion de l'offset du cercle


regardez ces exemples qui gèrent le décalage du cercle ( N'utilisant pas de pseudo-éléments )

copie 1:1 de l'OP du code (15px décalage): http://jsfiddle.net/pixelass/nPjQh/12 /

avec un offset beaucoup plus petit (5px): http://jsfiddle.net/pixelass/nPjQh/13 /

(le contenu a la même opacité que le cercle)

Comment fonctionne l'offset?

contrôle le background-size vs. Le top et left

Règles :

haut = gauche;

background-size = élémentheight * 2 + top * 2;

regardez la fleur (c'est aussi un seul <div> avec des pseudo-éléments) le background-size est plus grand que le cercle. qui crée les feuilles vertes sur le fond

http://jsfiddle.net/pixelass/nPjQh/15 /

one div makes a flower


PROBLÈME ACTUEL


voir ce violon: http://jsfiddle.net/pixelass/nPjQh/16 /

si vous n'utilisez pas une autre couche comme dans les exemples en haut du post, le contenu sera transparent. Donc, si vous n'avez besoin que d'une image à l'intérieur du cercle, les exemples ci-dessus fonctionneront très bien.

conent is transparent

COMMENT RÉSOUDRE CE PROBLÈME

si vous avez besoin d'une toile ou d'une autre div à l'intérieur du cercle, vous devez mettre le cercle sur la div et couche la div nécessaire au-dessus du cercle

voir ce violon: http://jsfiddle.net/pixelass/nPjQh/17 /

change un peu et ça marchera très bien. OBTENIR LE CODE DU VIOLON

correcting the opacity issue


forme différente / Style avancé


Si vous utilisez une forme différente avec les côtés plats, vous pouvez même mettre une bordure autour de la somme des deux divs.. ou même ajouter un box shadow

utilise toujours le simple markup de....

<div id="foo">
    <div id="bar">
    </div>
</div>

voir le violon pour la boîte-ombre: http://jsfiddle.net/pixelass/nPjQh/21 /

adding a box-shadow


appliquer une bordure au cercle


en utilisant -webkit-mask-image nous pourrions ajouter une bordure au cercle. http://jsfiddle.net/pixelass/nPjQh/24 /

border on round element


autres exemples:


quatre cercles autour de la div

http://jsfiddle.net/pixelass/nPjQh/25 /

Balisage:

<div id="foo">
    <div id="bar1"></div>
    <div id="bar2"></div>
    <div id="bar3"></div>
    <div id="bar4"></div>
</div>

4 circles

En utilisant cette technique pour faire un tooltip

http://jsfiddle.net/pixelass/nPjQh/31 /

Balisage:

<div id="foo">
    <div id="bar"></div>
    I am a pure css tooltip with a semi-transparent background and a black border. <br/>
    My width is static an my height is dynamic...
</div>

css tooltip

37
répondu 29 revsuser950658 2012-01-08 03:11:26

je pense que le seul moyen serait de faire l'opacité séparément,

p.ex. http://dabblet.com/gist/1566278

10
répondu Andrew 2012-01-05 17:35:00

que dis-tu de ça: http://jsfiddle.net/rudiedirkx/TqRCw/

(l'éditeur de Dabble craint!!)

il ne peut pas être fait avec seulement des pseudo éléments tristement = (

cela ne peut se faire qu'avec des pseudo-éléments! voir la réponse de pixelass. CSS3 est une exigence.

2
répondu Rudie 2012-01-06 20:46:23

Réponse Révisée

ce violon est compatible avec IE9 et résout la duplication de l'arrière-plan nécessaire dans ma réponse originale. Il utilise des pseudo-éléments pour générer le cercle. Cette solution est issue de l'idée "pacman" de pixelass, mais au lieu d'utiliser le nouveau gradient de fond css pour générer, elle utilise l'ancienne (et peu utilisé ou compris ) clip propriété pour faire le cercle en deux parties. Cela a résolu le problème de votre cercle n'étant pas "centré" au coin.

#foo {
    height:150px;
    width:250px;
    background: rgba(0, 0, 0, 0.6);
    position:absolute;
    left:40%;
    top:20%;
}

#bar {
    height:40px;
    width:40px;
    position:absolute;
    top:-15px;
    left:-15px;
    line-height: 40px;
}

#bar:before,
#bar:after {
    content: '';
    display: block;
    background: rgba(0, 0, 0, 0.6);
    border-radius: 40px;
    width: 100%;
    height: 100%;
    position: absolute;
    z-index: -1;
    top: 0;
    left: 0;
}

#bar:before {
    clip: rect(0 40px 15px 0);
}

#bar:after {
    clip: rect(15px 15px 40px 0);
}

Réponse Originale À Cette Question

Vous pouvez le faire ( voir tripoter ). Il pousse le cercle ci-dessous et "superpose" la partie qui se superpose avec un pseudoelement pour rétablir la couleur de fond du corps:

body{background:green;}

#foo{
height:150px;
width:250px;
background:rgba(0, 0, 0, 0.6);
position:absolute;
left:40%;
top:20%;
}

#bar{
height:40px;
width:40px;
background:rgba(0, 0, 0, 0.6);
border-radius:40px;
position:absolute;
top:-15px;
left:-15px;
z-index: -1;
}

#bar:after {
    content: '';
    display: block;
    background: green;
    position: absolute;
    right: 0;
    bottom: 0;
    width: 25px;
    height: 25px;
}
2
répondu ScottS 2012-01-09 12:48:37

j'ai créé un Q/A pour gérer ce scénario avec le "vol stationnaire" de tels éléments superposés.

éléments superposés avec opacité et la manipulation du" vol stationnaire "sur ceux .

la solution est essentiellement de régler l'opacité dans le niveau parent plutôt directement sur les éléments enfants et de basculer ceux en vol stationnaire, avec JS.


HTML

<div class="wrapper">
  <div class="first"></div>
  <div class="second"></div>
</div>

JS

$(".first, .second").hover(function() {
  $(".wrapper, .first, .second").not(this).toggleClass("add-opacity");
});

CODEPEN

Espérons que cette aide.

0
répondu Gibin Ealias 2018-04-18 13:30:30