Réponses:
Malheureusement, l' opacity
élément rend l'élément entier (y compris tout texte) semi-transparent. La meilleure façon de rendre la bordure semi-transparente est le format de couleur rgba. Par exemple, cela donnerait une bordure rouge avec une opacité de 50%:
div {
border: 1px solid rgba(255, 0, 0, .5);
-webkit-background-clip: padding-box; /* for Safari */
background-clip: padding-box; /* for IE9+, Firefox 4+, Opera, Chrome */
}
Le problème avec cette approche est que certains navigateurs ne comprennent pas le rgba
format et n'afficheront aucune bordure s'il s'agit de la déclaration entière. La solution consiste à fournir deux déclarations frontalières. Le premier avec une fausse opacité, et le second avec le réel. Si un navigateur est capable, il utilisera le second, sinon, il utilisera le premier.
div {
border: 1px solid rgb(127, 0, 0);
border: 1px solid rgba(255, 0, 0, .5);
-webkit-background-clip: padding-box; /* for Safari */
background-clip: padding-box; /* for IE9+, Firefox 4+, Opera, Chrome */
}
La première déclaration de bordure sera de la couleur équivalente à une bordure rouge opaque à 50% sur un fond blanc (bien que les graphiques sous la bordure ne traverseront pas).
MISE À JOUR: J'ai ajouté "background-clip: padding-box;" à cette réponse (selon la suggestion de SooDesuNe dans les commentaires) pour garantir que la bordure reste transparente même si une couleur d'arrière-plan solide est appliquée.
border-radius
, alors ils obtiennent des coins arrondis. Sinon, ils ne le font pas. Le contenu est toujours accessible, il a toujours l'air bien, il semble juste mieux s'il utilise un navigateur compatible. Je n'ai jamais vu un client s'en plaindre au cours des 1,5 dernières années de fonctionnement de cette manière sur chaque projet.
background-clip:padding-box;
également le définir .
C'est simple, utilisez une ombre pleine avec un décalage de 0:
#foo {
border-radius: 1px;
box-shadow: 0px 0px 0px 8px rgba(0,0,0,0.3);
}
De plus, si vous définissez un rayon de bordure sur l'élément, cela vous donne des bordures assez arrondies
box-shadow
n'a pas de taille et peut casser votre mise en page, ce qui vous rend les marges inégales! jsfiddle.net/bj81hew7/2
Comme d'autres l'ont mentionné: CSS-3 dit que vous pouvez utiliser la rgba(...)
syntaxe pour spécifier une couleur de bordure avec une valeur d'opacité (alpha).
voici un exemple rapide si vous souhaitez le vérifier.
Il fonctionne dans Safari et Chrome (fonctionne probablement dans tous les navigateurs webkit).
Cela fonctionne dans Firefox
Je doute que cela fonctionne du tout dans IE, mais je soupçonne qu'il existe un filtre ou un comportement qui le fera fonctionner.
Il y a aussi ce post stackoverflow , qui suggère d'autres problèmes - à savoir que la bordure s'affiche au-dessus de toute couleur d'arrière-plan (ou image d'arrière-plan) que vous avez spécifiée; limitant ainsi l'utilité de la bordure alpha dans de nombreux cas.
background-clip: padding-box;
(et jusqu'à ce que cela soit pris en charge, vous pouvez utiliser les extensions de fournisseur -webkit et -moz).
Si vous vérifiez votre codage CSS avec le validateur W3C, vous verrez si votre code CSS est acceptable, même s'il a fonctionné dans les principaux navigateurs.
Créer une bordure transparente via CSS, comme écrit ci-dessus,
border: 1px solid rgba(255, 0, 0, .5);
n'est pas accepté par les normes du W3C, pas même pour CSS3. J'ai utilisé le validateur d'entrée directe avec le code CSS suivant,
.test { border: 1px solid rgba(255, 0, 0, .5); }
Les résultats ont été,
Erreur de valeur: bordure Trop de valeurs ou de valeurs ne sont pas reconnues: 1px solid rgba (255,0,0,0,5)
Malheureusement, la valeur alpha (la lettre "a" à la fin de "rgb") n'est pas encore acceptée par le W3C comme partie des valeurs de couleur de bordure. Je me demande pourquoi il n'est pas standardisé, car il fonctionne dans tous les navigateurs. Le seul problème est de savoir si vous voulez vous en tenir aux normes W3C ou vous en éloigner pour créer quelque chose en CSS.
Pour utiliser le validateur CSS en ligne W3C / Saisie directe .
Toujours une bonne idée d'utiliser un validateur pour vérifier votre travail, cela aide vraiment à trouver de petites ou même de grosses erreurs de codage lorsque vous vous croisez après des heures de travail de codage.
* Pas pour autant que je sache qu'il n'y a pas ce que je fais normalement dans ce genre de circonstances: créer un bloc en dessous avec une plus grande taille ((borderize * 2) + originalsize) et le rendre transparent en utilisant
filter:alpha(opacity=50);
-moz-opacity:0.5;
-khtml-opacity: 0.5;
opacity: 0.5;
Voici un exemple
#main{
width:400px;
overflow:hidden;
position:relative;
}
.border{
width:100%;
position:absolute;
height:100%;
background-color:#F00;
filter:alpha(opacity=50);
-moz-opacity:0.5;
-khtml-opacity: 0.5;
opacity: 0.5;
}
.content{
margin:15px;/*size of border*/
background-color:black;
}
<div id="main">
<div class="border">
</div>
<div class="content">
testing
</div>
</div>
Mise à jour:
Cette réponse est dépassée, car après tout, cette question a plus de 8 ans. Aujourd'hui, tous les navigateurs à jour prennent en charge rgba, box shadows, etc. Mais c'est un bon exemple de la façon dont il y a 8 ans et plus.
rgba(...)
dans les couleurs de bordure. vous pouvez l'essayer ici .
Comme solution alternative qui peut fonctionner dans certains cas: changez border-style
en dotted
.
Le fait d'avoir des groupes de pixels alternés entre la couleur de premier plan et la couleur d'arrière-plan n'est pas la même chose qu'une ligne continue de pixels partiellement transparents. D'un autre côté, cela nécessite beaucoup moins de CSS et il est beaucoup plus compatible avec tous les navigateurs sans directives spécifiques au navigateur.
D'autres réponses traitent de l'aspect technique du problème d'opacité de la frontière, alors que je voudrais présenter un hack (CSS et HTML pur uniquement). Fondamentalement, créez un div de conteneur, ayant un div de bordure, puis le div de contenu.
<div class="container">
<div class="border-box"></div>
<div class="content-box"></div>
</div>
Et puis le CSS: (définissez la bordure de contenu sur aucun, veillez à positionner de telle sorte que l'épaisseur de la bordure soit prise en compte)
.container {
width: 20vw;
height: 20vw;
position: relative;
}
.border-box {
width: 100%;
height: 100%;
border: 5px solid black;
position: absolute;
opacity: 0.5;
}
.content-box {
width: 100%;
height: 100%;
border: none;
background: green;
top: 5px;
left: 5px;
position: absolute;
}
essaye ça:
<h2>Snippet for making borders transparent</h2>
<div>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta.
Mauris massa. Vestibulum lacinia arcu eget nulla. <b>Lorem ipsum dolor sit amet, consectetur adipiscing elit</b>. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. Sed dignissim
lacinia nunc. <i>Lorem ipsum dolor sit amet, consectetur adipiscing elit</i>. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor.
<i>Lorem ipsum dolor sit amet, consectetur adipiscing elit</i>. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod
in, nibh. Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis
turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. <b>Nam nec ante</b>. Suspendisse in justo eu magna luctus suscipit. Sed lectus. <i>Sed convallis tristique sem</i>.
Integer euismod lacus luctus magna. <b>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos</b>. Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna augue eget diam. Vestibulum
ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis laoreet. Donec lacus nunc,
viverra nec, blandit vel, egestas et, augue. Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. <b>Suspendisse in justo eu magna luctus suscipit</b>. Curabitur sit amet mauris. Morbi in dui quis est pulvinar ullamcorper. </p>
</div>
<div id="transparentBorder">
This <div> has transparent borders.
</div>
Et voici notre CSS magique ..
* {
padding: 10pt;
font: 13px/1.5 Helvetica Neue, Arial, Helvetica, 'Liberation Sans', FreeSans, sans-serif;
}
b {
font-weight: bold;
}
i {
font-style: oblique;
}
H2 {
font-size: 2em;
}
div[id='transparentBorder'] {
height: 100px;
width: 200px;
padding: 10px;
position: absolute;
top: 40%;
left: 30%;
text-align: center;
background: Black;
border-radius: 4px;
border: 10pt solid rgba(0, 0, 0, 0.5);
-moz-background-clip: border;
/* Firefox 3.6 */
-webkit-background-clip: border;
/* Safari 4? Chrome 6? */
background-clip: border-box;
/* Firefox 4, Safari 5, Opera 10, IE 9 */
-moz-background-clip: padding;
/* Firefox 3.6 */
-webkit-background-clip: padding;
/* Safari 4? Chrome 6? */
background-clip: padding-box;
/* Firefox 4, Safari 5, Opera 10, IE 9 */
text-align: center;
margin: 0;
color: #fff;
cursor: pointer;
}
Découvrez la démo ici.