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?

28
demandé sur Gleb Kemarsky 2014-08-18 13:46:19

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)

44
répondu web-tiki 2018-04-05 09:37:00

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.

DEMO

é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%);
  }

}
6
répondu Probocop 2015-09-18 11:01:12

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%)
}
5
répondu Alexandr Subbotin 2015-08-10 08:05:25

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

4
répondu lessismore 2015-02-12 22:13:00

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

2
répondu Will Jenkins 2018-05-17 09:57:17
<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;
0
répondu nfplee 2017-03-30 09:26:04