Forme avec un côté incliné (réactif)

90

J'essaie de créer une forme comme dans l'image ci-dessous avec un bord incliné d' un seul côté (par exemple, le côté inférieur) tandis que les autres bords restent droits.

CSS div avec un côté incliné

J'ai essayé d'utiliser la méthode border (le code est donné ci-dessous) mais les dimensions de ma forme sont dynamiques et je ne peux donc pas utiliser cette méthode.

.shape {
    position: relative;
    height: 100px;
    width: 200px;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    height: 0px;
    width: 0px;
    left: 0px;
    bottom: -100px;
    border-width: 50px 100px;
    border-style: solid;
    border-color: tomato tomato transparent transparent;
}
<div class="shape">
    Some content
</div>


J'ai également essayé d'utiliser des dégradés pour l'arrière-plan (comme dans le code ci-dessous), mais cela se gâche à mesure que les dimensions changent. Vous pouvez voir ce que je veux dire en survolant la forme dans l'extrait ci-dessous.

Comment puis-je créer cette forme avec un côté incliné et pouvoir également prendre en charge des tailles dynamiques ?

Harry
la source

Réponses:

126

Il existe de nombreuses façons de créer la forme avec un bord incliné d'un seul côté.

Les méthodes suivantes ne peuvent pas prendre en charge les tailles dynamiques comme déjà mentionné dans la question:

  • Méthode de triangle de bordure avec des valeurs de pixel pour border-width.
  • Dégradés linéaires avec la syntaxe d'angle (comme 45deg, 30deg, etc.).

Les méthodes qui peuvent prendre en charge les tailles dynamiques sont décrites ci-dessous.


Méthode 1 - SVG

( Compatibilité du navigateur )

SVG peut être utilisé pour produire la forme en utilisant polygons ou paths. L'extrait ci-dessous utilise polygon. Tout contenu de texte requis peut être positionné au-dessus de la forme.

Avantages

  • SVG est conçu pour produire des graphiques évolutifs et peut bien fonctionner avec tous les changements de dimension.
  • Les frontières et l'effet de survol peuvent être obtenus avec une surcharge de codage minimale.
  • Une image ou un fond dégradé peut également être fourni à la forme.

Les inconvénients

  • La prise en charge du navigateur est probablement le seul inconvénient car IE8- ne prend pas en charge SVG, mais cela peut être atténué en utilisant des bibliothèques comme Raphael et VML. De plus, la prise en charge du navigateur n'est en aucun cas pire que les autres options.

Méthode 2 - Fond dégradé

( Compatibilité du navigateur )

Les dégradés linéaires peuvent toujours être utilisés pour produire la forme mais pas avec des angles comme mentionné dans la question. Nous devons utiliser la to [side] [side]syntaxe (grâce à vals ) au lieu de spécifier des angles. Lorsque les côtés sont spécifiés, les angles de dégradé sont automatiquement ajustés en fonction des dimensions du conteneur.

Avantages

  • La forme peut être obtenue et conservée même si les dimensions du conteneur sont dynamiques.
  • Un effet de survol peut être ajouté en changeant la couleur du dégradé.

Les inconvénients

  • L'effet de survol sera déclenché même lorsque le curseur est à l'extérieur de la forme mais dans le conteneur.
  • L'ajout de bordures nécessiterait des manipulations de dégradé délicates.
  • Les dégradés sont connus pour produire des coins irréguliers lorsque la largeur (ou la hauteur) est très grande.
  • Les arrière-plans d'image ne peuvent pas être utilisés sur la forme.

Méthode 3 - Transformations obliques

( Compatibilité du navigateur )

Dans cette méthode, un pseudo-élément est ajouté, incliné et positionné de telle manière qu'il ressemble à l'un des bords est incliné / incliné.Si le bord supérieur ou inférieur est incliné, l'inclinaison doit être le long de l'axe Y, sinon le la rotation doit être le long de l'axe X. Le transform-origindoit avoir le côté opposé au côté incliné.

Avantages

  • La forme peut être obtenue même avec des bordures.
  • L'effet de survol sera limité à l'intérieur de la forme.

Les inconvénients

  • Les dimensions doivent augmenter proportionnellement pour que la forme soit conservée, car lorsqu'un élément est incliné, son décalage dans l'axe Y augmente à widthmesure que augmente et vice-versa (essayez d'augmenter le widthà 200pxdans l'extrait de code). Vous pouvez trouver plus d'informations à ce sujet ici .

Méthode 4 - Transformations de perspective

( Compatibilité du navigateur )

Dans cette méthode, le conteneur principal est tourné le long de l'axe X ou Y avec un peu de perspective. Définir la valeur appropriée sur transform-originproduirait un bord incliné sur un seul côté.

Si le côté supérieur ou inférieur est incliné, la rotation doit être le long de l'axe Y, sinon la rotation doit être le long de l'axe X. Le transform-origindoit avoir le côté opposé au côté incliné.

Avantages

  • La forme peut être obtenue avec des bordures.
  • Les dimensions n'ont pas besoin d'augmenter proportionnellement pour que la forme soit conservée.

Les inconvénients

  • Le contenu sera également tourné et par conséquent, ils doivent être contre-tournés pour avoir l'air normal.
  • Le positionnement du texte sera fastidieux si les dimensions ne sont pas statiques.

Méthode 5 - Chemin du clip CSS

( Compatibilité du navigateur )

Dans cette méthode, le conteneur principal est découpé dans la forme requise à l'aide d'un polygone. Les points du polygone doivent être modifiés en fonction du côté où l'arête inclinée est requise.

Avantages

  • La forme peut être conservée même lorsque le conteneur est redimensionné dynamiquement.
  • L'effet de survol sera parfaitement limité dans les limites de la forme.
  • L'image peut également être utilisée comme arrière-plan de la forme.

Les inconvénients

  • La prise en charge des navigateurs est actuellement très médiocre.
  • Des bordures peuvent être ajoutées en plaçant un élément absolument positionné sur le dessus de la forme et en lui donnant le clip nécessaire, mais au-delà d'un point, il ne s'adapte pas bien lors du redimensionnement dynamique.

Méthode 6 - Toile

( Compatibilité du navigateur )

Le canevas peut également être utilisé pour produire la forme en dessinant des tracés. L'extrait ci-dessous a une démo. Tout contenu de texte requis peut être positionné au-dessus de la forme.

Avantages

  • La forme peut être obtenue et conservée même si les dimensions du conteneur sont dynamiques. Des bordures peuvent également être ajoutées.
  • L'effet de survol peut être limité à l'intérieur des limites de la forme à l'aide de pointInpathmethod.
  • Une image ou un fond dégradé peut également être fourni à la forme.
  • Meilleur choix si des effets d'animation en temps réel sont nécessaires car il ne nécessite pas de manipulation DOM.

Les inconvénients

  • Le canevas est basé sur un raster et par conséquent, les bords inclinés deviennent pixélisés ou flous lorsqu'ils sont mis à l'échelle au-delà d'un point * .

* - Pour éviter la pixellisation, il faudrait repeindre la forme chaque fois que la fenêtre est redimensionnée. Il y en a un exemple ici, mais c'est une surcharge.

Harry
la source
35

J'ai essayé d'utiliser la méthode des bordures mais les dimensions de ma forme sont dynamiques et je ne peux donc pas utiliser cette méthode.


Méthode 7 - Unités de fenêtre (Border Redux )

( Compatibilité du navigateur )

Les Viewport Units sont une grande innovation dans CSS3. Bien que vous puissiez généralement utiliser des valeurs de pourcentage pour dynamiser vos propriétés, vous ne pouvez pas le faire pour border-widths ( ni pour font-sizes ).

Avec les unités de la fenêtre, vous pouvez définir de manière dynamique la largeur de vos bordures , ainsi que la taille de vos objets, par rapport à la dimension de la fenêtre.

Remarque: les valeurs en pourcentage se réfèrent à l'objet parent et non à la fenêtre (zone visible de la fenêtre).

Pour tester la méthode, lancez l'extrait de code Pleine page suivant et redimensionnez-le horizontalement et verticalement.

.shape {
    position: relative;
    height: 20vh;
    width: 40vw;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    left: 0px;
    right: 0px;
    top: 20vh;
    border-width: 10vh 20vw;
    border-style: solid;
    border-color: tomato tomato rgba(0,0,0,0) rgba(0,0,0,0);
}
<div class="shape">Some content</div>

Avantages - (1) Tout est dynamique, la couverture du navigateur est large.

Inconvénients - (1) Vous devez faire attention à la façon dont votre système d'exploitation gère la barre de défilement avec overflow: auto;.

Andrea Ligios
la source
3
Il semble irrégulier dans la dernière version de chrome.
Mr_Green
Vrai! Je suppose que les moteurs de navigateur ont encore besoin de temps pour rendre cela en douceur. Firefox a également ce problème lors de l'utilisation de cette technique avec des pixels au lieu d'unités de fenêtre, mais il peut être corrigé en utilisant rgba (,,, 0) au lieu de transparent. Heureusement, nous avons d'autres options pour le moment;)
Andrea Ligios
1

Ma solution est inspirée de celle appelée Method 7 - Viewport Units d'Andrea Ligios, ci-dessus dans cette page.

J'ai également utilisé l'unité "horizontale" pour la hauteur ( height:10vw) pour conserver les proportions données dans le trapèze lors du redimensionnement de la largeur de la fenêtre de navigation. Nous pourrions appeler cette méthode 7b - Largeur de la fenêtre .

De plus, l'utilisation de deux divs imbriqués , au lieu d'un et du :aftersélecteur, permet un meilleur réglage des styles de contenu de texte, à mon avis (par exemple text-align, etc.).

.dtrapz {
  position: relative;
  margin: 10px 40vw;
  width: 0;
  height: 10vw;
  border: none;
  border-right: 20vw solid #f22;
  border-bottom: 5vw solid transparent;
}

.dtcont {
  position: absolute;
  width: 20vw;
  height: 10vw;
  text-align: center;
  color: #fff;/* just aesthetic */
}
<div class="dtrapz">
  <div class="dtcont">Some content</div>
</div>

MattAllegro
la source
@ Downvoter Salut! Faites-moi savoir ce qui ne va pas avec ma réponse, afin que je puisse la modifier ou la supprimer si cela a du sens! Je ne suis pas un spécialiste mais il me semble que cela pourrait être appliqué sur de nombreuses pages, travailler avec du texte plus long, en fonction de la largeur uniquement :)
MattAllegro