Couleur de bordure personnalisée du triangle CSS

114

Tentative d'utilisation d'une couleur hexadécimale personnalisée pour mon triangle css (bordure). Cependant, comme il utilise des propriétés de bordure, je ne sais pas comment procéder. Je voudrais éviter javascript et css3 simplement pour des raisons de compatibilité. J'essaie de faire en sorte que le triangle ait un fond blanc avec une bordure de 1px (autour des côtés inclinés du triangle) avec la couleur # CAD5E0. Est-ce possible? Voici ce que j'ai jusqu'à présent:

.container {
    margin-left: 15px;
    width: 200px;
    background: #FFFFFF;
    border: 1px solid #CAD5E0;
    padding: 4px;
    position: relative;
    min-height: 200px;
}

.container:after {
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    left: 100%;
    width: 0;
    height: 0;
    border-color: transparent transparent transparent #CAD5E0;
    border-style: solid;
    border-width: 10px;
}​

Mon violon: http://jsfiddle.net/4ZeCz/

Ed R
la source

Réponses:

185

Vous devez en fait le simuler avec deux triangles ...

.container {
    margin: 15px 30px;
    width: 200px;
    background: #fff;
    border: 1px solid #a00;
    position: relative;
    min-height: 200px;
    padding: 20px;
    text-align: center;
    color: #fff;
    font: bold 1.5em/180px Helvetica, sans-serif;
    text-shadow: 0 0 1px #000;
}

.container:after,
.container:before {
    content: '';
    display: block;
    position: absolute;
    left: 100%;
    width: 0;
    height: 0;
    border-style: solid;
}

.container:after {
    top: 10px;
    border-color: transparent transparent transparent #fdd;
    border-width: 10px;
}

.container:before {
    top: 9px;
    border-color: transparent transparent transparent #a00;
    border-width: 11px;
}

Fiddle mis à jour ici

entrez la description de l'image ici

Scott
la source
1
C'est parfait! exactement ce dont j'avais besoin. Je vous remercie.
Ed R
1
hé, je ne comprends pas comment pourrais-je modifier le triangle pour qu'il apparaisse de l'autre côté de la boîte (je ne comprends pas comment le triangle css fonctionne)
Kevin
1
SMRT - Vous êtes si intelligent!
Code Whisperer
5
Notez, pour ceux avec la même question que @ Kevin. Regardez l' border-colorattribut, en fonction de la bordure colorée, le triangle pointera vers une direction différente. Pour tourner la flèche vers la gauche , border-colortransparent #e3f5ff transparent transparent;.container:after.container:before
passez
1
@Scott Merci pour ça! Votre JS Fiddle était parfait! Cependant, faites attention au copypasta hors de JSFiddle, il a ajouté deux caractères invisibles et invalides dans mon fichier CSS qui ont provoqué des erreurs de validation / d'analyse dans ce fichier css. Une fois que j'ai supprimé les caractères invisibles (les caractères avaient une largeur nulle, le curseur ne les montrait donc pas, mais j'ai pu reculer) cela a fonctionné à merveille. Ce n'était pas votre code qui était le problème, je pense que JS Fiddle a introduit des caractères mystérieux dans le code affiché? Je ne sais pas, mais je voulais juste le mentionner pour la postérité, au cas où quelqu'un rencontrerait le même problème.
hypervisor666
91

Je sais que vous acceptez cela mais vérifiez celui-ci aussi avec moins de CSS:

.container {
    margin-left: 15px;
    width: 200px;
    background: #FFFFFF;
    border: 1px solid #CAD5E0;
    padding: 4px;
    position: relative;
    min-height: 200px;
}

.container:after {
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    right:-7px;
    width: 10px;
    height: 10px;
    background: #FFFFFF;
    border-right:1px solid #CAD5E0;
    border-bottom:1px solid #CAD5E0;
    -moz-transform:rotate(-45deg);
    -webkit-transform:rotate(-45deg);
}

http://jsfiddle.net/4ZeCz/3/

sandeep
la source
hé, je ne comprends pas comment pourrais-je modifier le triangle pour qu'il apparaisse de l'autre côté de la boîte (je ne comprends pas comment le triangle css fonctionne)
Kevin
2
@Kevin je crée ceci s'il vous plaît vérifier jsfiddle.net/4ZeCz/97 . Essayez de jouer avec les propriétés que j'ai utilisées et si vous avez des questions, vous pouvez me poser :)
sandeep
3
Une explication: cela crée un élément carré normal avec des bordures sur deux côtés adjacents, formant un triangle incliné. Ensuite, le carré est incliné de 45 degrés, de sorte que le triangle pointe vers le haut (ou là où vous le souhaitez). Au fait, vous n'avez besoin que du -webkit-préfixe maintenant (et -ms-pour IE9). Tous les autres navigateurs le prennent en charge sans préfixe.
rvighne
Solution très intelligente! Je vous remercie.
Solhan
3

Je pense que c'est plus simple en utilisant clip-path :

.container {
  width: 150px;
  min-height: 150px;
  background: #ccc;
  padding: 8px;
  padding-right: 6%;
  display: inline-block;
  clip-path: polygon(0% 0%,0% 100%,90% 100%,90% 5%,100% 10%,90% 15%,90% 0%);
}
<div class="container">
test content
</div>

lalengua
la source
1

Une autre façon d'accomplir cela, en particulier pour quelqu'un qui en a besoin pour travailler avec des triangles équilatéraux ou même scalènes comme je l'ai fait, est de l'utiliser filter: drop-shadow(...)avec plusieurs valeurs et sans rayon de flou. Cela a l'avantage supplémentaire de ne pas avoir besoin de plusieurs éléments, ni d'accéder aux deux : avant et: après (j'essayais d'accomplir cela avec: après le contenu qui était en ligne, je voulais donc éviter le positionnement absolu).

Dans le cas ci-dessus, le CSS de: after pourrait ressembler à ceci ( violon ):

.container {
  margin-left: 15px;
  width: 200px;
  background: #FFFFFF;
  border: 1px solid #CAD5E0;
  padding: 4px;
  position: relative;
  min-height: 200px;
}
.container:after {
  content: '';
  display: block;
  position: absolute;
  top: 10px;
  left: 100%;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 20px 0 40px 15px; /* skewed to show support for non-right-angle triangles */
  border-color: transparent transparent transparent #fff;
  filter: drop-shadow(1px 0 0 #CAD5E0) drop-shadow(0 .5px 0 #CAD5E0);
}
<div class="container">
  Test Container
</div>

Je pense qu'il y a cependant des limites ou des bizarreries:

  • Pas de support dans IE11 (bien que cela semble bien dans FF, Chrome et Edge)
  • Je ne sais pas trop pourquoi .5px pour le <offset-y> valeur de la deuxième ombre portée () ci-dessus ressemble plus à 1px qu'à 1px, même si j'imagine que cela est lié à la trigonométrie (même si au moins sur mon moniteur, je ne vois aucune différence entre le valeurs réelles basées sur les triggers ou .5px ou même .1px d'ailleurs).
  • Les bordures supérieures à 1px (enfin, leur apparence de cette façon) ne semblent pas bien fonctionner. Ou du moins, je n'ai pas trouvé la solution, mais voyez ci-dessous un moyen moins qu'optimal d'aller un peu plus grand. (Je pense que le 4ème paramètre documenté mais non pris en charge ( <spread-radius>) de drop-shadow () pourrait être ce que je recherche vraiment au lieu de plusieurs valeurs de filtre, mais l'ajouter en fait tout simplement cassé les choses.) Ici, vous pouvez voir ce que commence à se produire lorsque vous dépassez 1px ( violon ):

.container {
  background-color: #eee;
  padding: 1em;
}
.container:after {
  content: "";
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 20.4px 10px 0 10px;
  border-color: yellow transparent transparent transparent;
  margin-left: .25em;
  display: inline-block;
  filter: drop-shadow(-6px -4px 0 green) drop-shadow(6px -4px 0 red) drop-shadow(0 6px 0 blue);
}
<div class="container">
  Test Container
</div>

Remarquez le fait que le premier (vert) est appliqué une fois, mais le second (rouge) est appliqué à la fois au triangle jaune créé via la bordure ainsi qu'à l'ombre portée verte (), et au dernier (bleu) s'applique à tout ce qui précède. (Peut-être que c'est aussi lié à l'apparence .5px).

Mais je suppose que vous pouvez profiter de ces ombres portées qui se construisent les unes sur les autres si vous avez besoin de quelque chose de plus large que 1px, en les changeant en quelque chose comme ce qui suit ( violon ):

filter: drop-shadow(0 0 2.5px red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red);

où le tout premier a un ensemble de rayons de flou (2,5px dans ce cas, bien que le résultat semble multiplié), et tous les autres ont un flou à 0. Mais cela ne fonctionnera que pour la même couleur de tous les côtés, et il en résulte dans certains coins arrondis ainsi que sur des bords assez rugueux, plus vous allez.

Max Starkenburg
la source
0
.triangle{
    position: absolute;
    width:0px;
    height:0px;
    border-left: 45px solid transparent;
    border-right: 45px solid transparent;
    border-bottom: 72px solid #DB5248;
}

.triangle:after{
    position: relative;
    content:"!";
    top:8px;
    left:-8px;
    color:#DB5248;
    font-size:40px;
}

.triangle:before{
    content:".";
    color: #DB5248;
    position: relative;
    top:-14px;
    left:-43px;
    border-left: 41px solid transparent;
    border-right: 41px solid transparent;
    border-bottom: 67px solid white;
}
Sharan
la source