Pouvez-vous définir une opacité de bordure en CSS?

409

Existe-t-il un moyen CSS simple de rendre la bordure d'un élément semi-transparente avec quelque chose comme ça?

border-opacity: 0.7;

Sinon, quelqu'un a-t-il une idée de comment je pourrais le faire sans utiliser d'images?

mcbeav
la source

Réponses:

626

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 rgbaformat 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.

kingjeffrey
la source
oui et puis nous revenons au problème qu'il a eu pour la première fois ^^ "J'ai pensé à utiliser rgba pour la couleur de la bordure, mais cela fonctionne très mal avec les navigateurs modernes." alors que mes solutions fonctionnent dans à peu près tous les navigateurs
Breezer
23
En fait, rgba fonctionne parfaitement dans les navigateurs modernes (sauf si vous pensez qu'IE6-8 est "moderne").
kingjeffrey
4
Eh bien, ils sont supposés être: P et lorsque vous les avez obtenus à 50% +, vous devriez vous assurer que cela fonctionne pour ie aswell imo au moins pour ie7 +
Breezer
42
Et c'est pourquoi il y a la «fausse opacité» de repli. Ma vie en tant que concepteur Web est devenue beaucoup plus facile lorsque j'ai accepté que tous les navigateurs n'aient pas besoin de s'afficher de manière identique. S'ils soutiennent 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.
kingjeffrey
23
Si vous essayez de faire briller le contenu derrière votre contenu bordé (et NON la couleur d'arrière-plan de l'élément bordé lui-même), vous devrez background-clip:padding-box;également le définir .
SooDesuNe
134

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

jsFiddle Demo

entrez la description de l'image ici

Pedro L.
la source
Cela fonctionnera toujours. Merci pour l'extrait :) Pour tout le monde, qui veut seulement avoir une bordure à un ou plusieurs sites, vous devez changer les deux premiers paramètres comme cette boîte-ombre: -1px -1px 0px 0px rgba (0,0,0,0,1 ) pour atteindre par exemple border-top
Thomas Richter
Celui-ci doit être utilisé avec prudence! box-shadown'a pas de taille et peut casser votre mise en page, ce qui vous rend les marges inégales! jsfiddle.net/bj81hew7/2
William
14

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.

Lee
la source
4
Le problème de frontière peut être résolu avec background-clip: padding-box;(et jusqu'à ce que cela soit pris en charge, vous pouvez utiliser les extensions de fournisseur -webkit et -moz).
kingjeffrey
J'ai ajouté cette réponse à la question à laquelle vous avez lié.
kingjeffrey
6

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.

Mark2090
la source
11
Faux, ceci est parfaitement acceptable par les standards du W3C et est un bug dans le validateur. Voir cette réponse . C'est une bonne idée d'utiliser le validateur, oui, mais ne lui faites pas confiance pour tout.
BoltClock
5

* 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.

Breezer
la source
Oui, c'est ce que j'ai fini par faire, ça craint juste le positionnement des éléments.
mcbeav
a ajouté un exemple afin que vous puissiez voir plus clairement comment je pensais :)
Breezer
cela peut être fait - mais pas avec un large support multi-navigateur. Cependant, il est probable que tout navigateur prenant en charge l'opacité CSS sur la couleur d'arrière-plan le prenne également en charge rgba(...)dans les couleurs de bordure. vous pouvez l'essayer ici .
Lee
@Lee, IE prend en charge l'opacité "filtre", mais pas n'importe quelle forme de rgba (jusqu'à IE9).
kingjeffrey
2

Comme solution alternative qui peut fonctionner dans certains cas: changez border-styleen 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.

Stephan Samuel
la source
0

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;
}
RBk
la source
0

Non, il n'y a aucun moyen de définir uniquement l'opacité d'une bordure avec CSS.

Par exemple, si vous ne connaissiez pas la couleur , il n'y a aucun moyen de modifier uniquement l'opacité de la bordure en utilisant simplement rgba().

Travis J
la source
-1

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 &lt;div&gt; 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.

A Malik
la source