Triangle CSS sensible avec pourcentage de largeur
le code ci-dessous va créer une flèche juste au-dessous d'un <a>
elément:
JSFiddle
css lang-css prettyprint-override">.btn {
position: relative;
display: inline-block;
width: 100px;
height: 50px;
text-align: center;
color: white;
background: gray;
line-height: 50px;
text-decoration: none;
}
.btn:after {
content: "";
position: absolute;
bottom: -10px;
left: 0;
width: 0;
height: 0;
border-width: 10px 50px 0 50px;
border-style: solid;
border-color: gray transparent transparent transparent;
}
<a href="#" class="btn">Hello!</a>
le problème est que nous devons indiquer la largeur du lien pour obtenir une flèche de bonne taille car nous ne pouvons pas indiquer la largeur de la bordure en pixels.
comment faire un triangle réactif basé sur le pourcentage?
6 réponses
vous pouvez utiliser un pseudo élément asymétrique et rotatif pour créer un triangle sensible le lien :
DEMO (redimensionner la fenêtre de résultat pour voir comment il réagit)
le triangle maintient son rapport d'aspect avec le padding-bottom
propriété.
Si vous voulez la forme d'adapter la taille en fonction de son contenu, vous pouvez supprimer la largeur du .btn
classe
.btn {
position: relative;
display: inline-block;
height: 50px; width: 50%;
text-align: center;
color: white;
background: gray;
line-height: 50px;
text-decoration: none;
padding-bottom: 15%;
background-clip: content-box;
overflow: hidden;
}
.btn:after {
content: "";
position: absolute;
top:50px; left: 0;
background-color: inherit;
padding-bottom: 50%;
width: 57.7%;
z-index: -1;
transform-origin: 0 0;
transform: rotate(-30deg) skewX(30deg);
}
/** FOR THE DEMO **/
body {
background: url('http://i.imgur.com/qi5FGET.jpg');
background-size: cover;
}
<a href="#" class="btn">Hello!</a>
pour plus d'informations sur les triangles responsive et comment les faire, vous pouvez jeter un oeil à Triangles avec transform rotate (simple et fantaisie sensible triangles)
une Autre solution serait d'utiliser un CSS clip-chemin de découper un triangle de couleur de bloc. Cependant, il n'y a pas de soutien pour les IE, mais elles pourraient être utilisées pour des outils internes, etc.
écrit avec SCSS pour la facilité.
.outer {
background: orange;
width: 25%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 1em;
p {
margin: 0;
text-align: center;
color: #fff;
}
&:after {
content: '';
position: absolute;
top: 100%;
left: 0;
right: 0;
padding-bottom: 10%;
background: orange;
-webkit-clip-path: polygon(0% 0%, 100% 0%, 50% 100%);
clip-path: polygon(0% 0%, 100% 0%, 50% 100%);
}
}
j'ai trouvé une solution qui fonctionne avec n'importe quelle largeur/hauteur. Vous pouvez utiliser deux pseudo-éléments linear-gradient
arrière-plan, comme ça, (tripoter):
.btn {
position: relative;
display: inline-block;
width: 100px;
height: 50px;
text-align: center;
color: white;
background: gray;
line-height: 50px;
text-decoration: none;
}
.btn:before {
content: "";
position: absolute;
top: 100%;
right: 0;
width: 50%;
height: 10px;
background: linear-gradient(to right bottom, gray 50%, transparent 50%)
}
.btn:after {
content: "";
position: absolute;
top: 100%;
left: 0;
width: 50%;
height: 10px;
background: linear-gradient(to left bottom, gray 50%, transparent 50%)
}
Une version modifiée du code ci-dessous peut vous aider à réaliser ce
HTML
<div class="triangle-down"></div>
CSS
.triangle-down {
width: 10%;
height: 0;
padding-left:10%;
padding-top: 10%;
overflow: hidden;
}
.triangle-down:after {
content: "";
display: block;
width: 0;
height: 0;
margin-left:-500px;
margin-top:-500px;
border-left: 500px solid transparent;
border-right: 500px solid transparent;
border-top: 500px solid #4679BD;
}
Triangles CSS réactifs
j'ai essayé les autres réponses et les a jugés trop complexes et/ou difficiles à manipuler la forme du triangle. J'ai plutôt décidé de créer un triangle simple en forme de svg.
Le triangle, la hauteur peut être réglée à une valeur absolue ou en pourcentage du rectangle de sorte qu'il peut être sensible dans les deux directions, si nécessaire.
html, body{
height:100%;
width:100%;
}
.outer{
width:20%;
height:25%;
background:red;
position:relative;
}
.inner{
height:100%;
width:100%;
background-color:red;
}
.triangle-down{
height:25%;
width:100%;
position:relative;
}
.triangle-down svg{
height:100%;
width:100%;
position:absolute;
top:0;
}
svg .triangle-path{
fill:red;
}
<div class="outer">
<div class="inner"></div>
<div class="triangle-down">
<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none" viewBox="0 0 2 1">
<g>
<path class="triangle-path" d="M0,0 l2,0 l-1,1 z" />
</g>
</svg>
</div>
Testé FF, Chrome, IE, Edge, mob Safari et mob Chrome
<style>
.btn {
background-color: orange;
color: white;
margin-bottom: 50px;
padding: 15px;
position: relative;
text-align: center;
text-decoration: none;
}
.btn:after {
background-color: inherit;
clip-path: url('data:image/svg+xml;utf8,%3Csvg xmlns="http://www.w3.org/2000/svg"%3E%3Cdefs%3E%3CclipPath id="p" clipPathUnits="objectBoundingBox"%3E%3Cpolygon points="0 0, 1 0, 0.5 1" /%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E#p'); /* fix for firefox (tested in version 52) */
clip-path: polygon(0% 0%, 100% 0%, 50% 100%);
content: '';
height: 50px;
left: 0;
position: absolute;
right: 0;
top: 100%;
}
</style>
<a href="#" class="btn">Hello!</a>
Cela fonctionne dans Chrome et j'ai ajouté un correctif pour Firefox. Il ne fonctionne pas dans le bord, cependant si vous diminuez la hauteur de la flèche vers le bas alors il ne semble pas si mauvais.
veuillez noter que si vous utilisez bootstrap, vous devrez soit changer le nom, soit outrepasser certains des styles qu'il applique. Si vous décidez de le renommer, vous devez aussi ajouter ce qui suit à la .btn style:
box-sizing: content-box;