Pour une couleur d'arrière-plan semi-transparente simple, les solutions ci-dessus (images CSS3 ou bg) sont les meilleures options. Cependant, si vous voulez faire quelque chose de plus sophistiqué (par exemple, animation, arrière-plans multiples, etc.), ou si vous ne voulez pas compter sur CSS3, vous pouvez essayer la «technique de volet»:
.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 volet extérieur:
- un (le «dos») qui correspond à la taille de l'élément de volet sans affecter le flux de contenu,
- et un (le «cont») qui contient le contenu et aide à déterminer la taille du volet.
Le position: relative
volet sur est important; il indique au calque arrière de s'adapter à la taille du volet. (Si vous avez besoin que la <p>
balise soit absolue, changez le volet de a <p>
à a <span>
et enveloppez tout cela dans une <p>
balise à position absolue .)
Le principal avantage de cette technique sur les similaires énumérés ci-dessus est que le volet n'a pas à être d'une taille spécifiée; comme codé ci-dessus, il s'adaptera à toute la largeur (disposition normale des éléments de bloc) et seulement aussi haut que le contenu. L'élément de volet extérieur peut être dimensionné comme vous le souhaitez, tant qu'il est rectangulaire (c'est-à-dire que le bloc en ligne fonctionnera; en ligne ancien non).
En outre, cela vous donne beaucoup de liberté pour l'arrière-plan; vous êtes libre de vraiment mettre n'importe quoi dans l'élément arrière et que cela n'affecte pas le flux de contenu (si vous voulez plusieurs sous-couches en taille réelle, assurez-vous simplement qu'elles ont également la position: absolue, largeur / hauteur: 100%, et haut / bas / gauche / droite: auto).
Une variante pour permettre le réglage de l'encart d'arrière-plan (via haut / bas / gauche / droite) et / ou l'épinglage d'arrière-plan (via la suppression d'une des paires gauche / droite ou haut / bas) consiste à utiliser le CSS suivant à la place:
.pane > .back {
position: absolute;
width: auto; height: auto;
top: 0px; bottom: 0px; left: 0px; right: 0px;
}
Comme écrit, cela fonctionne dans Firefox, Safari, Chrome, IE8 + et Opera, bien qu'IE7 et IE6 nécessitent des CSS et des expressions supplémentaires, IIRC, et la dernière fois que j'ai vérifié, la deuxième variante CSS ne fonctionne pas dans Opera.
À surveiller:
- Les éléments flottants à l'intérieur de la couche cont ne seront pas contenus. Vous devrez vous assurer qu'ils sont effacés ou autrement contenus, sinon ils glisseront par le bas.
- Les marges vont sur l'élément de volet et le remplissage va sur l'élément cont. N'utilisez pas l'inverse (marges sur le cont ou remplissage sur le volet) 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 un bloc ou un bloc en ligne. N'hésitez pas à utiliser
<div>
s au lieu de <span>
s pour simplifier votre CSS.
Une démo plus complète, montrant la flexibilité de cette technique en l'utilisant en tandem avec display: inline-block
, et avec les deux s / s auto
spécifiques :width
min-height
.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 démonstration en direct de la technique largement utilisée: