Comment donner au texte ou à une image un fond transparent en utilisant CSS?
est-il possible, en utilisant seulement CSS, de rendre le background
d'un élément semi-transparent mais avoir le contenu (texte & images) de l'élément opaque?
j'aimerais faire cela sans avoir le texte et l'arrière-plan comme deux éléments distincts.
Lors de la tentative:
p {
position: absolute;
background-color: green;
filter: alpha(opacity=60);
opacity: 0.6;
}
span {
color: white;
filter: alpha(opacity=100);
opacity: 1;
}
html lang-html prettyprint-override"><p>
<span>Hello world</span>
</p>
il semble que les éléments enfants sont soumis à l'opacité de leurs parents, donc opacity:1
est relatif au opacity:0.6
du parent.
27 réponses
soit utiliser une image semi-transparente PNG soit utiliser CSS3:
background-color:rgba(255,0,0,0.5);
voici un article de css3.info, opacité, RGBA et compromis (2007-06-03).
dans Firefox 3 et Safari 3, vous pouvez utiliser RGBA comme Georg Schölly mentionné .
une astuce peu connue est que vous pouvez l'utiliser dans Internet Explorer ainsi en utilisant le filtre gradient.
background-color: rgba(0, 255, 0, 0.5);
filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#7F00FF00', EndColorStr='#7F00FF00');
Le premier nombre hexadécimal définit la valeur alpha de la couleur.
solution complète tous les navigateurs:
.alpha60 {
/* Fallback for web browsers that doesn't support RGBa */
background: rgb(0, 0, 0) transparent;
/* RGBa with 0.6 opacity */
background: rgba(0, 0, 0, 0.6);
/* For IE 5.5 - 7*/
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);
/* For IE 8*/
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";
}
c'est de CSS background transparence sans affecter les éléments enfants, par RGBa et filtres .
Screenshots preuve des résultats:
c'est lorsqu'on utilise le code suivant::
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
<title>An XHTML 1.0 Strict standard template</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<style type="text/css" media="all">
.transparent-background-with-text-and-images-on-top {
background: rgb(0, 0, 0) transparent; /* Fallback for web browsers that doesn't support RGBa */
background: rgba(0, 0, 0, 0.6); /* RGBa with 0.6 opacity */
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000); /* For IE 5.5 - 7*/
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"; /* For IE 8*/
}
</style>
</head>
<body>
<div class="transparent-background-with-text-and-images-on-top">
<p>Here some content (text AND images) "on top of the transparent background"</p>
<img src="http://i.imgur.com/LnnghmF.gif">
</div>
</body>
</html>
C'est la meilleure solution que j'ai pu trouver, sans utiliser CSS 3. Et il fonctionne très bien sur Firefox, Chrome et Internet Explorer autant que je peux voir.
mettre un DIV conteneur et deux Div enfants dans le même niveau, un pour le contenu, un pour l'arrière-plan. Et en utilisant CSS, auto-size l'arrière-plan pour ajuster le contenu et mettre l'arrière-plan réellement dans le dos en utilisant z-index.
.container {
position: relative;
}
.content {
position: relative;
color: White;
z-index: 5;
}
.background {
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
background-color: Black;
z-index: 1;
/* These three lines are for transparency in all browsers. */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
filter: alpha(opacity=50);
opacity: .5;
}
<div class="container">
<div class="content">
Here is the content.
<br />Background should grow to fit.
</div>
<div class="background"></div>
</div>
il est préférable d'utiliser un semi-transparent .png
.
Just open Photoshop , créer une 2x2
image de pixel ( picking 1x1
peut causer un bug Internet Explorer! ), le remplir d'une couleur verte et régler l'opacité dans" layers tab " à 60%. Puis enregistrez-le et faites - en une image de fond:
<p style="background: url(green.png);">any text</p>
il fonctionne cool, bien sûr, sauf dans la belle Internet Explorer 6 . Il y a de meilleures corrections disponibles, mais voici un hack rapide:
p {
_filter: expression((runtimeStyle.backgroundImage != 'none') ? runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src='+currentStyle.backgroundImage.split('\"')[1]+', sizingMethod=scale)' : runtimeStyle.filter,runtimeStyle.backgroundImage = 'none');
}
pour une couleur de fond semi-transparente simple, les solutions ci-dessus (images CSS3 ou bg) sont les meilleures options. Cependant, si vous voulez faire quelque chose de plus fantaisiste (par exemple animation, décors multiples, etc.), ou si vous ne voulez pas vous appuyer sur CSS3, vous pouvez essayer la "technique de pane":
.pane, .pane > .back, .pane > .cont { display: block; }
.pane {
position: relative;
}
.pane > .back {
position: absolute;
width: 100%; height: 100%;
top: auto; bottom: auto; left: auto; right: auto;
}
.pane > .cont {
position: relative;
z-index: 10;
}
<p class="pane">
<span class="back" style="background-color: green; opacity: 0.6;"></span>
<span class="cont" style="color: white;">Hello world</span>
</p>
la technique fonctionne en utilisant deux "couches" à l'intérieur de l'élément de la vitre extérieure:
- un (le "dos") qui s'adapte à la taille de l'élément de la vitre sans affecter le flux du contenu,
- et un (Le" cont") qui contient le contenu et aide à déterminer la taille de la vitre.
le position: relative
sur la vitre est important; il indique à la couche arrière de s'adapter à la taille de la vitre. (Si vous avez besoin que l'étiquette <p>
soit absolue, changez la vitre d'une étiquette <p>
en une étiquette <span>
et enveloppez tout cela dans une étiquette <p>
absolument en position.)
le principal avantage de cette technique par rapport aux autres techniques similaires énumérées ci-dessus est que le volet n'a pas à être d'une taille spécifiée; comme codé ci-dessus, il s'adaptera pleine largeur (disposition normale des blocs-éléments) et seulement aussi haut que le contenu. L'élément extérieur de la vitre peut être dimensionné de n'importe quelle façon, à condition qu'il soit rectangulaire (c'est-à-dire que le bloc en ligne fonctionnera; le bloc en ligne simple ne fonctionnera pas).
Aussi, il vous donne beaucoup de liberté pour l'arrière-plan; vous êtes libre de mettre vraiment tout ce qui est dans l'élément de dos et qui n'affecte pas le flux du contenu (si vous voulez plusieurs sous-couches grandeur nature, assurez-vous qu'elles ont aussi la position: absolu, Largeur/Hauteur: 100%, et Haut/Bas/Gauche/Droite: auto).
une variante pour permettre le réglage de l'inset de fond (via Haut/Bas/Gauche/Droite) et / ou l'épinglage de fond (via la suppression d'une des paires gauche / droite ou Haut / Bas) est d'utiliser le CSS suivant à la place:
.pane > .back {
position: absolute;
width: auto; height: auto;
top: 0px; bottom: 0px; left: 0px; right: 0px;
}
As écrit, cela fonctionne dans Firefox, Safari, Chrome, IE8+, et Opera, bien que IE7 et IE6 exigent CSS et expressions supplémentaires, IIRC, et la dernière fois que j'ai vérifié, la deuxième variation CSS ne fonctionne pas dans Opera.
choses à surveiller:
- les éléments flottants à l'intérieur de la couche cont ne seront pas contenus. Vous devez vous assurer qu'ils sont dégagés ou autrement contenus, ou ils vont glisser hors du fond.
- Les marges vont sur l'élément de la vitre et le rembourrage va sur l'élément cont. N'utilisez pas l'inverse (marges sur le cont ou rembourrage sur la vitre) ou vous découvrirez des bizarreries telles que la page étant toujours légèrement plus large que la fenêtre du navigateur.
- comme mentionné, le tout doit être bloc ou en ligne-bloc. N'hésitez pas à utiliser
<div>
s au lieu de<span>
s pour simplifier votre CSS.
une démo plus complète, démontrer la flexibilité de cette technique en l'utilisant en tandem avec display: inline-block
, et à la fois auto
et "spécifique width
s / min-height
s:
.pane, .pane > .back, .pane > .cont { display: block; }
.pane {
position: relative;
width: 175px; min-height: 100px;
margin: 8px;
}
.pane > .back {
position: absolute; z-index: 1;
width: auto; height: auto;
top: 8px; bottom: 8px; left: 8px; right: 8px;
}
.pane > .cont {
position: relative; z-index: 10;
}
.debug_red { background: rgba(255, 0, 0, 0.5); border: 1px solid rgba(255, 0, 0, 0.75); }
.debug_green { background: rgba(0, 255, 0, 0.5); border: 1px solid rgba(0, 255, 0, 0.75); }
.debug_blue { background: rgba(0, 0, 255, 0.5); border: 1px solid rgba(0, 0, 255, 0.75); }
<p class="pane debug_blue" style="float: left;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.
</span>
</p>
<p class="pane debug_blue" style="float: left;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.
</span>
</p>
<p class="pane debug_blue" style="float: left; display: inline-block; width: auto;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.
</span>
</p>
<p class="pane debug_blue" style="float: left; display: inline-block; width: auto; min-height: auto;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.
</span>
</p>
et voici une live demo de la technique largement utilisée:
il y a une astuce pour minimiser le balisage: utilisez un pseudo élément comme l'arrière-plan et vous pouvez régler l'opacité à elle sans affecter l'élément principal et ses enfants:
sortie:
code pertinent:
p {
position: relative;
}
p:after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #fff;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
opacity: .6;
z-index: -1;
}
/*** The following is just for demo styles ***/
body {
background: url('http://i.imgur.com/k8BtMvj.jpg') no-repeat;
background-size: cover;
}
p {
width: 50%;
padding: 1em;
margin: 10% auto;
font-family: arial, serif;
color: #000;
}
img {
display: block;
max-width: 90%;
margin: .6em auto;
}
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ligula ut nunc dignissim molestie.
<img src="http://i.imgur.com/hPLqUtN.jpg" alt="" />
</p>
le soutien de navigateur est Internet Explorer 8 et plus tard.
la méthode La plus simple serait d'utiliser un fond semi-transparent image PNG .
vous pouvez utiliser JavaScript pour la faire fonctionner dans Internet Explorer 6
si vous avez besoin.
j'ai utiliser la méthode décrite dans de Transparence des Png dans Internet Explorer 6 .
autre que celui-ci,
vous pouvez faire semblant en utilisant two side-by-side sibling elements
- faire un semi-transparent , puis absolutely position the other over the top
?
Cette méthode vous permet d'avoir une image en arrière-plan et pas seulement une couleur unie, et peut être utilisé pour avoir de la transparence sur d'autres attributs tels que les bordures. Aucune image PNG transparente n'est requise.
utilisez :before
(ou :after
) dans CSS et donnez-leur la valeur d'opacité pour laisser l'élément à son opacité initiale. Ainsi, vous pouvez utiliser :avant de faire un faux élément et de lui donner le fond transparent (ou les frontières) que vous voulez et le déplacer derrière le contenu vous voulez garder opaque avec z-index
.
un exemple ( violon ) (notez que le DIV
avec la classe dad
est juste pour fournir un contexte et un contraste avec les couleurs, cet élément supplémentaire n'est en fait pas nécessaire, et le rectangle rouge est déplacé un peu plus bas et à droite pour laisser visible l'arrière-plan derrière l'élément fancyBg
):
<div class="dad">
<div class="fancyBg">
Test text that should have solid text color lets see if we can manage it without extra elements
</div>
</div>
avec cette CSS:
.dad {
background: lime; border: 1px double black; margin: 1ex 2ex;
padding: 0.5ex; position: relative; -k-z-index: 5;
}
.fancyBg {
border: 1px dashed black; position: relative; color: white; font-weight: bold;
z-index: 0; /*background: black;*/
}
.fancyBg:before {content:'-'; display: block;
position: absolute; background: red; opacity: .5;
top: 2ex; right: -2ex; bottom: -2ex; left: 2ex;
/*top: 0; right: 0; bottom: 0; left: 0;*/
z-index: -1;
}
dans ce cas, .fancyBg:before
possède les propriétés CSS que vous voulez avoir avec transparence (fond rouge dans cet exemple, mais peut être une image ou des bordures). Il est positionné comme absolu pour le déplacer derrière .fancyBg
(utilisez des valeurs de zéro ou n'importe quoi qui est plus approprié pour vos besoins).
presque toutes ces réponses supposent que le concepteur veut un fond de couleur solide. Si le concepteur veut réellement une photo comme arrière-plan, la seule vraie solution pour le moment est JavaScript comme le plugin jQuery Transify mentionné ailleurs .
ce que nous devons faire, c'est nous joindre à la discussion du groupe de travail CSS et leur demander de nous donner un attribut background-opacity! Cela devrait fonctionner en même temps que la fonctionnalité multi-backgrounds.
le problème est, que le texte a réellement la pleine opacité dans votre exemple. Il a la pleine opacité à l'intérieur de la balise p
, mais la balise p
est juste semi-transparente.
vous pouvez ajouter une image de fond PNG semi-transparente au lieu de la réaliser dans CSS, ou séparer le texte et div dans 2 éléments et déplacer le texte au-dessus de la boîte (par exemple, marge négative).
sinon ce ne sera pas possible.
EDIT:
comme Chris l'a mentionné: si vous utilisez un fichier PNG avec transparence, vous devez utiliser une solution de contournement JavaScript pour le faire fonctionner dans le fâcheux Internet Explorer...
Voici comment je le fais (il pourrait ne pas être optimale, mais il fonctionne):
créer le div
que vous voulez être semi-transparent. Donner une classe/id. Laissez VIDE, et le fermer. Donnez-lui une hauteur et une largeur prédéfinies (disons, 300 pixels par 300 pixels). Donner une opacité de 0,5 ou ce que vous voulez, et une couleur d'arrière-plan.
ensuite, directement au-dessous de cette div, créer une autre div avec une classe/id différente. Créer un paragraphe à l'intérieur, où vous aurez placez votre texte. Donnez la position div
: relative, et en haut: -295px
(C'est négatif 295 pixels). Donnez-lui un indice z de 2 pour une bonne mesure, et assurez-vous que son opacité est de 1. Style votre paragraphe comme vous le souhaitez, mais assurez-vous que les dimensions sont moins que celle de la première div
afin qu'il ne déborde pas.
C'est ça. Voici le code:
.trans {
opacity: 0.5;
height: 300px;
width: 300px;
background-color: orange;
}
.trans2 {
opacity: 1;
position: relative;
top: -295px;
}
.trans2 p {
width: 295px;
color: black;
font-weight: bold;
}
<body>
<div class="trans">
</div>
<div class="trans2">
<p>
text text text
</p>
</div>
</body>
cela fonctionne dans Safari 2.x, je n'ai pas en savoir plus sur Internet Explorer.
voici un plugin jQuery qui va gérer tout pour vous, Transify ( Transify - un plugin jQuery pour appliquer facilement transparence / opacité sur le fond d'un élément ).
je rencontrais ce problème de temps en temps, donc j'ai décidé d'écrire quelque chose qui rendrait la vie beaucoup plus facile. Le script est de moins de 2 KO et il ne nécessite qu'une ligne de code pour le faire fonctionner, et il gérera aussi l'animation l'opacité de l'arrière-plan si vous le souhaitez.
opacité du fond, mais pas le texte a quelques idées. Soit utiliser une image semi-transparente, soit superposer un élément supplémentaire.
il y a quelque temps, j'ai écrit à ce sujet dans Cross Browser Background Transparency With CSS .
étrangement Internet Explorer 6 vous permettra de rendre le fond transparent et garder le texte sur le dessus complètement opaque. Pour les autres navigateurs, je suggère alors d'utiliser un fichier PNG transparent.
si vous êtes un Photoshop guy, vous pouvez également utiliser:
#some-element {
background-color: hsla(170, 50%, 45%, 0.9); // **0.9 is the opacity range from 0 - 1**
}
ou:
#some-element {
background-color: rgba(170, 190, 45, 0.9); // **0.9 is the opacity range from 0 - 1**
}
background-color:rgba(255,0,0,0.5); comme mentionné ci-dessus est la meilleure réponse tout simplement. Utiliser CSS3, même en 2013, n'est pas simple car le niveau de support des différents navigateurs change à chaque itération.
alors que background-color
est pris en charge par tous les principaux navigateurs (pas nouveau pour CSS3) [1] la transparence alpha peut être délicate, en particulier avec Internet Explorer avant la version 9 et avec border color sur Safari avant la version 5.1. [2]
en utilisant quelque chose comme Compass ou SASS peut vraiment aider la production et la compatibilité de plate-forme.
[1] W3Schools: CSS background-color propriété
[2] Norman's Blog: Browser Support Checklist CSS3 (octobre 2012)
CSS3 a une solution facile de votre problème. Use:
background-color:rgba(0,255,0,0.5);
ici, rgba signifie rouge, vert, bleu et valeur alpha. La valeur verte est obtenue à cause de 255 et la moitié de la transparence est obtenue par 0,5 valeur alpha.
pour rendre l'arrière-plan d'un élément semi-transparent mais avoir le contenu (texte & images) de l'élément opaque. Vous devez écrire le code css pour cette image et vous devez ajouter un attribut appelé opacity avec une valeur minimale. par exemple
.image{
position: relative;
background-color: cyan;
opacity: 0.7;
}
/ / moindre la valeur plus sera la transparence, ou la valeur moins sera la transparence.
vous pouvez résoudre cela pour Internet Explorer 8 par (ab)en utilisant la syntaxe de gradient. Le format couleur est ARGB. Si vous utilisez le préprocesseur Sass vous pouvez convertir les couleurs en utilisant la fonction intégrée "ie-hex-str()".
background: rgba(0,0,0, 0.5);
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#80000000')";
vous pouvez utiliser pur CSS 3 : rgba(red, green, blue, alpha)
, où alpha
est le niveau de transparence que vous voulez. Il n'y a pas besoin de JavaScript ou jQuery.
voici un exemple:
#item-you-want-to-style{
background:rgba(192.233, 33, 0.5)
}
<div align="center" style="width:100%;height:100%;background:white;opacity:0.5;position:absolute;z-index:1001">
<img id="search_img" style="margin-top:20%;" src="../resources/images/loading_small.gif">
</div>
il y a une solution plus simple pour superposer une image sur le même div. Ce n'est pas à la bonne utilisation de cet outil. Mais fonctionne comme un charme pour faire cette superposition en utilisant CSS.
utilisez une ombre insérée comme ceci:
box-shadow: inset 0 0 0 1000px rgba(255, 255, 255, 0.9);
C'est tout :)
vous pouvez utiliser RGBA (red, green, blue, alpha)
dans le CSS , quelque chose comme ceci:
alors simplement faire quelque chose comme ça va fonctionner dans votre cas:
p {
position: absolute;
background-color: rgba(0, 255, 0, 0.6);
}
span {
color: white;
}
j'utilise normalement cette classe pour mon travail. Son assez bon.
.transparent {
filter: alpha(opacity=50); /* internet explorer */
-khtml-opacity: 0.5; /* khtml, old safari */
-moz-opacity: 0.5; /* mozilla, netscape */
opacity: 0.5; /* fx, safari, opera */
}
vous pouvez faire avec
rgba color code
en utilisant css comme cet exemple donné ci-dessous.
.imgbox img{
height:100px;
width:200px;
position:relative;
}
.overlay{
background:rgba(74, 19, 61, 0.4);
color:#fff;
text-shadow:0px 2px 5px #000079;
height:100px;
width:300px;
position:absolute;
top:10%;
left:25%;
padding:25px;
}
<div class"imgbox">
<img src="http://www.bhmpics.com/wallpapers/little_pony_art-800x480.jpg">
<div class="overlay">
<p>This is Simple Text.</p>
</div>
</div>
vous pouvez utiliser la couleur RGB avec l'opacité comme ce code de couleur en RGB (63,245,0) et ajouter l'opacité comme (63,245,0,0.5) et aussi ajouter RGBA remplacer RGB. Une utilisation pour opacité
div{
background:rgba(63,245,0,0.5);
}