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;
}
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.
- j'ai fait un motif noir / transparent pour le cercle et l'ai fixé à
:before
. - Le cercle est alors transformé
rotate(180deg)
et déménagé pour s'installer sur la le coin du<div>
. - puis j'ai mis le
opacity
de ce cercle à0.6
. - le
<div>
lui-même n'est pas affecté par leopacity
. - ensuite j'ai ajouté l'élément
:after
et j'ai mis une image commebackground
(vous pouvez le contrôler via js si nécessaire) - 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é. - 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 /
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 /
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.
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
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 /
appliquer une bordure au cercle
en utilisant -webkit-mask-image
nous pourrions ajouter une bordure au cercle.
http://jsfiddle.net/pixelass/nPjQh/24 /
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>
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>
je pense que le seul moyen serait de faire l'opacité séparément,
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.
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;
}
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");
});
Espérons que cette aide.