Il y a plein de formes CSS différentes en astuces CSS - Formes de CSS et je suis particulièrement intrigué par un triangle:
#triangle-up {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
<div id="triangle-up"></div>
Comment et pourquoi ça marche?
Comme alex dit , des frontières d'égale largeur se rencontrent à des angles de 45 degrés:
Lorsque vous n'avez pas de bordure supérieure, cela ressemble à ceci:
Ensuite, vous lui donnez une largeur de 0 ...
... et une hauteur de 0 ...
... et enfin, vous rendez les deux bordures transparentes:
Cela donne un triangle.
Les bordures utilisent un bord angulaire où elles se croisent (un angle de 45 ° avec des bordures de même largeur, mais changer la largeur des bords peut fausser l’angle).
jsFiddle .
En masquant certaines bordures, vous pouvez obtenir l’effet de triangle (comme vous pouvez le voir ci-dessus en rendant les différentes parties de couleurs différentes). transparent
est souvent utilisé comme couleur de bord pour obtenir la forme d'un triangle.
Commencez par un carré de base et des bordures. Chaque bordure aura une couleur différente afin que nous puissions les distinguer:
.triangle {
border-color: yellow blue red green;
border-style: solid;
border-width: 200px 200px 200px 200px;
height: 0px;
width: 0px;
}
ce qui vous donne this :
Mais la bordure supérieure n'est pas nécessaire, définissez donc sa largeur sur 0px
. Maintenant, notre bas-frontière de 200px
fera en sorte que notre triangle mesure 200 pixels de haut.
.triangle {
border-color: yellow blue red green;
border-style: solid;
border-width: 0px 200px 200px 200px;
height: 0px;
width: 0px;
}
et nous aurons this :
Ensuite, pour masquer les deux triangles latéraux, définissez la couleur de la bordure sur transparent. Comme la bordure supérieure a été supprimée, nous pouvons également définir la couleur de bordure supérieure.
.triangle {
border-color: transparent transparent red transparent;
border-style: solid;
border-width: 0px 200px 200px 200px;
height: 0px;
width: 0px;
}
enfin nous obtenons this :
Une approche différente:
La forme triangulaire est assez facile à utiliser avec cette technique. Pour les personnes qui préfèrent voir une animation expliquant le fonctionnement de cette technique, voici:
Autrement, voici 4 explications détaillées (ce n'est pas une tragédie) de la réalisation d'un triangle rectangle isocèle avec un seul élément.
<div class="tr"></div>
Facile, assurez-vous simplement que width = 1.41 x height
. Vous pouvez utiliser n’importe quel techinque ( voir ici ), y compris l’utilisation de pourcentages et de marges (padding-bottom) pour conserver les proportions et créer un triangle sensible . Dans l'image suivante, la div a une bordure jaune d'or.
Dans cette division, insérez un pseudo-élément et donnez-lui 100% de la largeur et de la hauteur du parent. Le pseudo-élément a un arrière-plan bleu dans l'image suivante.
À ce stade, nous avons ceci CSS:
.tr {
width: 30%;
padding-bottom: 21.27%; /* = width / 1.41 */
position: relative;
}
.tr: before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #0079C6;
}
Premièrement, le plus important: définit une origine de transformation . Le Origine par défaut est au centre du pseudo-élément et nous en avons besoin en bas à gauche. En ajoutant ceci CSS au pseudo-élément:
transform-Origin:0 100%;
ou transform-Origin: left bottom;
Maintenant, nous pouvons faire pivoter le pseudo élément de 45 degrés dans le sens des aiguilles d'une montre avec transform : rotate(45deg);
À ce stade, nous avons ceci CSS:
.tr {
width: 30%;
padding-bottom: 21.27%; /* = width / 1.41 */
position: relative;
}
.tr:before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #0079C6;
transform-Origin: 0 100%;
transform: rotate(45deg);
}
Pour masquer les parties indésirables du pseudo-élément (tout ce qui dépasse du div avec la bordure jaune), il vous suffit de définir overflow:hidden;
sur le conteneur. après avoir supprimé la bordure jaune, vous obtenez ... un TRIANGLE! :
CSS:
.tr {
width: 30%;
padding-bottom: 21.27%; /* = width / 1.41 */
position: relative;
overflow: hidden;
}
.tr:before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #0079C6;
transform-Origin: 0 100%;
transform: rotate(45deg);
}
Comme indiqué dans la démo , vous pouvez personnaliser les triangles:
skewX()
.Voici un animation dans JSFiddle que j'ai créé pour la démonstration.
Voir également l'extrait ci-dessous.
Ceci est un fichier GIF animé créé à partir d’un screencast
transforms = [
{'border-left-width' :'30', 'margin-left': '70'},
{'border-bottom-width' :'80'},
{'border-right-width' :'30'},
{'border-top-width' :'0', 'margin-top': '70'},
{'width' :'0'},
{'height' :'0', 'margin-top': '120'},
{'borderLeftColor' :'transparent'},
{'borderRightColor' :'transparent'}
];
$('#a').click(function() {$('.border').trigger("click");});
(function($) {
var duration = 1000
$('.border').click(function() {
for ( var i=0; i < transforms.length; i++ ) {
$(this)
.animate(transforms[i], duration)
}
}).end()
}(jQuery))
.border {
margin: 20px 50px;
width: 50px;
height: 50px;
border-width: 50px;
border-style: solid;
border-top-color: green;
border-right-color: yellow;
border-bottom-color: red;
border-left-color: blue;
cursor: pointer
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="https://code.jquery.com/color/jquery.color-2.1.2.min.js"></script>
Click it!<br>
<div class="border"></div>
/**
* Randomize array element order in-place.
* Using Durstenfeld shuffle algorithm.
*/
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}
transforms = [
{'border-left-width' :'30', 'margin-left': '70'},
{'border-bottom-width' :'80'},
{'border-right-width' :'30'},
{'border-top-width' :'0', 'margin-top': '70'},
{'width' :'0'},
{'height' :'0'},
{'borderLeftColor' :'transparent'},
{'borderRightColor' :'transparent'}
];
transforms = shuffleArray(transforms)
$('#a').click(function() {$('.border').trigger("click");});
(function($) {
var duration = 1000
$('.border').click(function() {
for ( var i=0; i < transforms.length; i++ ) {
$(this)
.animate(transforms[i], duration)
}
}).end()
}(jQuery))
.border {
margin: 50px;
width: 50px;
height: 50px;
border-width: 50px;
border-style: solid;
border-top-color: green;
border-right-color: yellow;
border-bottom-color: red;
border-left-color: blue;
cursor: pointer
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="https://code.jquery.com/color/jquery.color-2.1.2.min.js"></script>
Click it!<br>
<div class="border"></div>
$('#a').click(function() {$('.border').trigger("click");});
(function($) {
var duration = 1000
$('.border').click(function() {
$(this)
.animate({'border-top-width': 0 ,
'border-left-width': 30 ,
'border-right-width': 30 ,
'border-bottom-width': 80 ,
'width': 0 ,
'height': 0 ,
'margin-left': 100,
'margin-top': 150,
'borderTopColor': 'transparent',
'borderRightColor': 'transparent',
'borderLeftColor': 'transparent'}, duration)
}).end()
}(jQuery))
.border {
margin: 50px;
width: 50px;
height: 50px;
border-width: 50px;
border-style: solid;
border-top-color: green;
border-right-color: yellow;
border-bottom-color: red;
border-left-color: blue;
cursor: pointer
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="https://code.jquery.com/color/jquery.color-2.1.2.min.js"></script>
Click it!<br>
<div class="border"></div>
Disons que nous avons le div suivant:
<div id="triangle" />
Maintenant, éditez le CSS pas à pas, vous aurez ainsi une idée précise de ce qui se passe autour de vous.
ÉTAPE 1: Lien JSfiddle:
#triangle {
background: purple;
width :150px;
height:150PX;
border-left: 50px solid black ;
border-right: 50px solid black;
border-bottom: 50px solid black;
border-top: 50px solid black;
}
Ceci est une simple div. Avec un CSS très simple. Ainsi, un profane peut comprendre. Div a des dimensions de 150 x 150 pixels avec une bordure de 50 pixels. L'image est attachée:
ÉTAPE 2: Lien JSfiddle:
#triangle {
background: purple;
width :150px;
height:150PX;
border-left: 50px solid yellow ;
border-right: 50px solid green;
border-bottom: 50px solid red;
border-top: 50px solid blue;
}
Maintenant, je viens de changer la couleur de bordure des 4 côtés. L'image est attachée.
ÉTAPE: 3 Lien JSfiddle:
#triangle {
background: purple;
width :0;
height:0;
border-left: 50px solid yellow ;
border-right: 50px solid green;
border-bottom: 50px solid red;
border-top: 50px solid blue;
}
Maintenant, je viens de changer la hauteur et la largeur de div de 150 pixels à zéro. L'image est attachée
ÉTAPE 4: JSfiddle:
#triangle {
background: purple;
width :0px;
height:0px;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid red;
border-top: 50px solid transparent;
}
Maintenant, j'ai rendu toutes les frontières transparentes, à l'exception de la bordure inférieure. L'image est attachée ci-dessous.
ÉTAPE 5: Lien JSfiddle:
#triangle {
background: white;
width :0px;
height:0px;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid red;
border-top: 50px solid transparent;
}
Maintenant, je viens de changer la couleur de fond en blanc. L'image est attachée.
Nous avons donc obtenu le triangle dont nous avions besoin.
Et maintenant, quelque chose de complètement différent ...
Au lieu d'utiliser des astuces css, n'oubliez pas des solutions aussi simples que des entités html:
▲
Résultat:
▲
Voir: Quelles sont les entités HTML pour les triangles de haut en bas?
Considérons le triangle ci-dessous
.triangle {
border-bottom:15px solid #000;
border-left:10px solid transparent;
border-right:10px solid transparent;
width:0;
height:0;
}
Voici ce qui nous est donné:
Pourquoi est-il sorti sous cette forme? Le diagramme ci-dessous explique les dimensions. Notez que 15px était utilisé pour la bordure inférieure et 10px pour les côtés gauche et droit.
Il est assez facile de créer un triangle rectangle également en supprimant le bord droit.
En poussant un peu plus loin, en utilisant css, j'ai ajouté des flèches à mon dos et aux boutons suivants (oui, je sais que ce n'est pas 100% cross-browser, mais néanmoins élégant).
.triangle {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
margin:20px auto;
}
.triangle-down {
border-bottom:none;
border-top: 100px solid red;
}
.triangle-left {
border-left:none;
border-right: 100px solid red;
border-bottom: 50px solid transparent;
border-top: 50px solid transparent;
}
.triangle-right {
border-right:none;
border-left: 100px solid red;
border-bottom: 50px solid transparent;
border-top: 50px solid transparent;
}
.triangle-after:after {
width: 0;
height: 0;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-bottom: 5px solid red;
margin:0 5px;
content:"";
display:inline-block;
}
.triangle-after-right:after {
border-right:none;
border-left: 5px solid blue;
border-bottom: 5px solid transparent;
border-top: 5px solid transparent;
}
.triangle-before:before {
width: 0;
height: 0;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-bottom: 5px solid blue;
margin:0 5px;
content:"";
display:inline-block;
}
.triangle-before-left:before {
border-left:none;
border-right: 5px solid blue;
border-bottom: 5px solid transparent;
border-top: 5px solid transparent;
}
<div class="triangle"></div>
<div class="triangle triangle-down"></div>
<div class="triangle triangle-left"></div>
<div class="triangle triangle-right"></div>
<a class="triangle-before triangle-before-left" href="#">Back</a>
<a class="triangle-after triangle-after-right" href="#">Next</a>
OK, ce triangle sera créé à cause de la manière dont les bordures des éléments fonctionnent ensemble en HTML et CSS ...
Comme nous utilisons habituellement des bordures de 1 ou 2 pixels, nous ne remarquons jamais que les bordures se forment des angles à 45 ° de même largeur et si la largeur change, le degré d'angle se modifie également, lancez le code CSS que j'ai créé ci-dessous:
.triangle {
width: 100px;
height: 100px;
border-left: 50px solid black;
border-right: 50px solid black;
border-bottom: 100px solid red;
}
<div class="triangle">
</div>
Ensuite, à l'étape suivante, nous n'avons pas de largeur ni de hauteur, quelque chose comme ceci:
.triangle {
width: 0;
height: 0;
border-left: 50px solid black;
border-right: 50px solid black;
border-bottom: 100px solid red;
}
<div class="triangle">
</div>
Et maintenant, nous rendons les frontières gauche et droite invisibles pour rendre notre triangle souhaitable comme ci-dessous:
.triangle {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
<div class="triangle"></div>
Si vous ne souhaitez pas exécuter l'extrait de code pour afficher les étapes, j'ai créé une séquence d'images afin d'examiner toutes les étapes d'une image:
Une approche différente. Avec dégradé linéaire (pour IE, uniquement IE 10+). Vous pouvez utiliser n'importe quel angle:
.triangle {
margin: 50px auto;
width: 100px;
height: 100px;
/* linear gradient */
background: -moz-linear-gradient(-45deg, rgba(255,0,0,0) 0%, rgba(255,0,0,0) 50%, rgba(255,0,0,1) 50%, rgba(255,0,0,1) 100%);
/* FF3.6+ */
background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,rgba(255,0,0,0)), color-stop(50%,rgba(255,0,0,0)), color-stop(50%,rgba(255,0,0,1)), color-stop(100%,rgba(255,0,0,1)));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(-45deg, rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
/* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(-45deg, rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
/* Opera 11.10+ */
background: -ms-linear-gradient(-45deg, rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
/* IE10+ */
background: linear-gradient(135deg, rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
/* W3C */;
}
<div class="triangle"></div>
Voici jsfiddle
clip-path
C'est quelque chose que je pense que cette question a manqué; clip-path
clip-path
en un motLe découpage, avec la propriété
clip-path
, revient à couper une forme (comme un cercle ou un pentagone) dans un morceau de papier rectangulaire. La propriété appartient à la spécification “ Module de masquage CSS niveau 1 ”. Selon les spécifications, "le masquage CSS fournit deux moyens de masquer partiellement ou totalement des parties d'éléments visuels: le masquage et le découpage".
clip-path
utilisera l'élément lui-même plutôt que ses bordures pour couper la forme que vous spécifiez dans ses paramètres. Il utilise un système de coordonnées basé sur un pourcentage super simple, ce qui rend l’édition très facile et vous permet de le saisir et de créer des formes étranges et magnifiques en quelques minutes.
div {
-webkit-clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
background: red;
width: 100px;
height: 100px;
}
<div></div>
Il y a un inconvénient majeur pour le moment, l'un d'entre eux étant son manque majeur de support, uniquement couvert par les navigateurs -webkit-
et n'ayant aucun support sur IE et très partiel sous FireFox.
Voici quelques ressources et documents utiles pour mieux comprendre clip-path
et commencer à créer le vôtre.
C'est une vieille question, mais je pense que cela vaudra la peine de partager comment créer une flèche en utilisant cette technique de triangle.
Créons 2 triangles, pour le second nous utiliserons la pseudo classe :after
et nous la positionnerons juste en dessous de l’autre:
.arrow{
width: 0;
height: 0;
border-radius: 50px;
display: inline-block;
position: relative;
}
.arrow:after{
content: "";
width: 0;
height: 0;
position: absolute;
}
.arrow-up{
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid #333;
}
.arrow-up:after{
top: 5px;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid #ccc;
right: -50px;
}
<div class="arrow arrow-up"> </div>
Il ne reste plus qu’à définir la couleur de bordure prédominante du deuxième triangle sur la même couleur d’arrière-plan:
.arrow{
width: 0;
height: 0;
border-radius: 50px;
display: inline-block;
position: relative;
}
.arrow:after{
content: "";
width: 0;
height: 0;
position: absolute;
}
.arrow-up{
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid #333;
}
.arrow-up:after{
top: 5px;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid #fff;
right: -50px;
}
<div class="arrow arrow-up"> </div>
Violon avec toutes les flèches:
http://jsfiddle.net/tomsarduy/r0zksgeu/
J'ai écrit ceci pour faciliter (et DRY) la génération automatique d'un triangle CSS:
// Triangle helper mixin (by Yair Even-Or)
// @param {Direction} $direction - either `top`, `right`, `bottom` or `left`
// @param {Color} $color [currentcolor] - Triangle color
// @param {Length} $size [1em] - Triangle size
@mixin triangle($direction, $color: currentcolor, $size: 1em) {
$size: $size/2;
$transparent: rgba($color, 0);
$opposite: (top:bottom, right:left, left:right, bottom:top);
content: '';
display: inline-block;
width: 0;
height: 0;
border: $size solid $transparent;
border-#{map-get($opposite, $direction)}-color: $color;
margin-#{$direction}: -$size;
}
span {
@include triangle(bottom, red, 10px);
}
Remarque importante:
si le triangle semble pixélisé dans certains navigateurs, essayez l’une des méthodes décrites ici .
Si vous souhaitez appliquer une bordure au triangle, lisez ceci: Créer un triangle avec CSS?
Presque toutes les réponses se concentrent sur le triangle construit en utilisant une bordure, je vais donc élaborer la méthode linear-gradient
(comme indiqué dans la réponse de @ lima_fil ).
Utiliser une valeur de degré telle que 45°
nous obligera à respecter un rapport spécifique de height/width
afin d'obtenir le triangle que nous voulons et cela ne répondra pas:
.tri {
width:100px;
height:100px;
background:linear-gradient(45deg, transparent 49.5%,red 50%);
/*To illustrate*/
border:1px solid;
}
Good one
<div class="tri"></div>
bad one
<div class="tri" style="width:150px"></div>
bad one
<div class="tri" style="height:30px"></div>
Au lieu de cela, nous devrions considérer des valeurs de direction prédéfinies telles que to bottom
, to top
, etc. Dans ce cas, nous pouvons obtenir n'importe quel type de triangle tout en le maintenant réactif.
1) Triangle rectangle
Pour obtenir un tel triangle, nous avons besoin d'un gradient linéaire et d'une direction diagonale, comme to bottom right
, to top left
, to bottom left
, etc.
.tri-1,.tri-2 {
display:inline-block;
width:100px;
height:100px;
background:linear-gradient(to bottom left, transparent 49.5%,red 50%);
border:1px solid;
animation:change 2s linear infinite alternate;
}
.tri-2 {
background:linear-gradient(to top right, transparent 49.5%,red 50%);
border:none;
}
@keyframes change {
from {
width:100px;
height:100px;
}
to {
height:50px;
width:180px;
}
}
<div class="tri-1"></div>
<div class="tri-2"></div>
2) triangle isocèle
Pour celui-ci nous aurons besoin de 2 linéaires-dégradés comme ci-dessus et chacun prendra la moitié de la largeur (ou la hauteur). C'est comme si on créait une image miroir du premier triangle.
.tri {
display:inline-block;
width:100px;
height:100px;
background-image:
linear-gradient(to bottom right, transparent 49.5%,red 50%),
linear-gradient(to bottom left, transparent 49.5%,red 50%);
background-size:50.3% 100%; /* I use a value slightly bigger than 50% to avoid having a small gap between both gradient*/
background-position:left,right;
background-repeat:no-repeat;
animation:change 2s linear infinite alternate;
}
@keyframes change {
from {
width:100px;
height:100px;
}
to {
height:50px;
width:180px;
}
}
<div class="tri"></div>
3) triangle équilatéral
Celui-ci est un peu délicat à gérer car nous devons garder une relation entre la hauteur et la largeur du dégradé. Nous aurons le même triangle que ci-dessus mais nous complexifierons le calcul afin de transformer le triangle isocèle en triangle équilatéral.
Pour simplifier les choses, nous considérerons que la largeur de notre div est connue et que la hauteur est suffisamment grande pour pouvoir tracer notre triangle à l'intérieur (height >= width
).
Nous avons nos deux gradients g1
et g2
, la ligne bleue est la largeur de la div
w
et chaque dégradé en aura 50% (w/2
) et chaque côté du triangle doit être égal à w
. La ligne verte est la hauteur du gradient hg
et nous pouvons facilement obtenir la formule ci-dessous:
(w/2)² + hg² = w²
---> hg = (sqrt(3)/2) * w
---> hg = 0.866 * w
Nous pouvons nous appuyer sur calc()
pour effectuer notre calcul et obtenir le résultat souhaité:
.tri {
--w:100px;
width:var(--w);
height:100px;
display:inline-block;
background-image:
linear-gradient(to bottom right, transparent 49.5%,red 50%),
linear-gradient(to bottom left, transparent 49.5%,red 50%);
background-size:calc(var(--w)/2 + 0.5px) calc(0.866 * var(--w));
background-position:
left bottom,right bottom;
background-repeat:no-repeat;
}
<div class="tri"></div>
<div class="tri" style="--w:80px"></div>
<div class="tri" style="--w:50px"></div>
Une autre méthode consiste à contrôler la hauteur de div et à conserver la syntaxe de gradient simple:
.tri {
--w:100px;
width:var(--w);
height:calc(0.866 * var(--w));
display:inline-block;
background:
linear-gradient(to bottom right, transparent 49.8%,red 50%) left,
linear-gradient(to bottom left, transparent 49.8%,red 50%) right;
background-size:50.2% 100%;
background-repeat:no-repeat;
}
<div class="tri"></div>
<div class="tri" style="--w:80px"></div>
<div class="tri" style="--w:50px"></div>
4) Triangle aléatoire
Pour obtenir un triangle aléatoire, rien de plus simple, il suffit simplement de supprimer la condition de 50% de chaque, MAIS il convient de conserver deux conditions (les deux doivent avoir la même hauteur et la somme des deux largeurs doit être de 100%).
.tri-1 {
width:100px;
height:100px;
display:inline-block;
background-image:
linear-gradient(to bottom right, transparent 50%,red 0),
linear-gradient(to bottom left, transparent 50%,red 0);
background-size:20% 60%,80% 60%;
background-position:
left bottom,right bottom;
background-repeat:no-repeat;
}
<div class="tri-1"></div>
Mais que se passe-t-il si nous voulons définir une valeur pour chaque côté? Nous devons simplement refaire les calculs!
Définissons hg1
et hg2
comme hauteur de notre dégradé (les deux sont égaux à la ligne rouge) puis wg1
et wg2
comme largeur de notre dégradé (wg1 + wg2 = a
). Je ne vais pas détailler le calcul mais à la fin nous aurons:
wg2 = (a²+c²-b²)/(2a)
wg1 = a - wg2
hg1 = hg2 = sqrt(b² - wg1²) = sqrt(c² - wg2²)
Maintenant que nous avons atteint la limite de CSS, même avec calc()
, nous ne pourrons pas l'implémenter. Nous devons simplement rassembler le résultat final manuellement et les utiliser à taille fixe:
.tri {
--wg1: 20px;
--wg2: 60px;
--hg:30px;
width:calc(var(--wg1) + var(--wg2));
height:100px;
display:inline-block;
background-image:
linear-gradient(to bottom right, transparent 49.5%,red 50%),
linear-gradient(to bottom left, transparent 49.5%,red 50%);
background-size:var(--wg1) var(--hg),var(--wg2) var(--hg);
background-position:
left bottom,right bottom;
background-repeat:no-repeat;
}
<div class="tri" ></div>
<div class="tri" style="--wg1:80px;--wg2:60px;--hg:100px;" ></div>
Bonus
Nous ne devons pas oublier que nous pouvons aussi appliquer une rotation et/ou une inclinaison et que nous avons plus d’option pour obtenir plus de triangle:
.tri {
--wg1: 20px;
--wg2: 60px;
--hg:30px;
width:calc(var(--wg1) + var(--wg2) - 0.5px);
height:100px;
display:inline-block;
background-image:
linear-gradient(to bottom right, transparent 49%,red 50%),
linear-gradient(to bottom left, transparent 49%,red 50%);
background-size:var(--wg1) var(--hg),var(--wg2) var(--hg);
background-position:
left bottom,right bottom;
background-repeat:no-repeat;
}
<div class="tri" ></div>
<div class="tri" style="transform:skewY(25deg)"></div>
<div class="tri" style="--wg1:80px;--wg2:60px;--hg:100px;" ></div>
<div class="tri" style="--wg1:80px;--wg2:60px;--hg:100px;transform:rotate(20deg)" ></div>
Et bien sûr, nous devrions garder à l’esprit la solution SVG qui peut être plus appropriée dans certaines situations:
svg {
width:100px;
height:100px;
}
polygon {
fill:red;
}
<svg viewBox="0 0 100 100"><polygon points="0,100 0,0 100,100" /></svg>
<svg viewBox="0 0 100 100"><polygon points="0,100 50,0 100,100" /></svg>
<svg viewBox="0 0 100 100"><polygon points="0,100 50,23 100,100" /></svg>
<svg viewBox="0 0 100 100"><polygon points="20,60 50,43 80,100" /></svg>
D'autres l'ont déjà bien expliqué. Laissez-moi vous donner une animation qui vous expliquera rapidement: http://codepen.io/chriscoyier/pen/lotjh
Voici du code avec lequel vous pourrez jouer et apprendre les concepts.
HTML:
<html>
<body>
<div id="border-demo">
</div>
</body>
</html>
CSS:
/*border-width is border thickness*/
#border-demo {
background: gray;
border-color: yellow blue red green;/*top right bottom left*/
border-style: solid;
border-width: 25px 25px 25px 25px;/*top right bottom left*/
height: 50px;
width: 50px;
}
Jouez avec cela et voyez ce qui se passe. Définissez la hauteur et la largeur à zéro. Supprimez ensuite la bordure supérieure et rendez transparent à gauche et à droite, ou regardez simplement le code ci-dessous pour créer un triangle CSS:
#border-demo {
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid blue;
}
voici un autre violon:
.container:after {
position: absolute;
right: 0;
content: "";
margin-right:-50px;
margin-bottom: -8px;
border-width: 25px;
border-style: solid;
border-color: transparent transparent transparent #000;
width: 0;
height: 0;
z-index: 10;
-webkit-transition: visibility 50ms ease-in-out,opacity 50ms ease-in-out;
transition: visibility 50ms ease-in-out,opacity 50ms ease-in-out;
bottom: 21px;
}
.container {
float: left;
margin-top: 100px;
position: relative;
width: 150px;
height: 80px;
background-color: #000;
}
.containerRed {
float: left;
margin-top: 100px;
position: relative;
width: 100px;
height: 80px;
background-color: red;
}