La valeur de la propriété native de la bordure en pointillés n'offre pas de contrôle sur les tirets eux-mêmes ... alors apportez la border-image
propriété!
Brassez votre propre frontière avec border-image
Compatibilité : il offre une excellente prise en charge des navigateurs (IE 11 et tous les navigateurs modernes). Une bordure normale peut être définie comme solution de secours pour les navigateurs plus anciens.
Créons ces
Ces bordures afficheront exactement le même cross-browser!
Étape 1 - Créez une image appropriée
Cet exemple mesure 15 pixels de large sur 15 pixels de haut et les espaces sont actuellement de 5 px de large. C'est un .png avec transparence.
Voici à quoi cela ressemble dans Photoshop lorsque vous zoomez:
Voici à quoi ressemble la mise à l'échelle:
Contrôle de l'écart et de la longueur de course
Pour créer des espaces ou des traits plus larges / plus courts, élargissez / réduisez les espaces ou les traits de l'image.
Voici une image avec des espaces plus larges de 10 pixels:
correctement mis à l'échelle =
Étape 2 - Créez le CSS - cet exemple nécessite 4 étapes de base
Définissez la source de l'image de la bordure :
border-image-source:url("http://i.stack.imgur.com/wLdVc.png");
Facultatif - Définissez la largeur de l'image de la bordure :
border-image-width: 1;
La valeur par défaut est 1. Elle peut également être définie avec une valeur de pixel, une valeur de pourcentage ou comme un autre multiple (1x, 2x, 3x, etc.). Cela remplace tout border-width
ensemble.
Définissez le border-image-slice :
Dans cet exemple, l'épaisseur des bordures supérieure, droite, inférieure et gauche des images est de 2 pixels, et il n'y a pas d'espace en dehors, donc notre valeur de tranche est 2:
border-image-slice: 2;
Les tranches ressemblent à ceci, à 2 pixels du haut, de la droite, du bas et de la gauche:
Définissez le border-image-repeat :
Dans cet exemple, nous voulons que le motif se répète uniformément autour de notre div. Nous choisissons donc:
border-image-repeat: round;
Rédaction de sténographie
Les propriétés ci-dessus peuvent être définies individuellement ou en abrégé en utilisant border-image :
border-image: url("http://i.stack.imgur.com/wLdVc.png") 2 round;
Exemple complet
Notez le border: dashed 4px #000
repli. Les navigateurs non compatibles recevront cette bordure.
.bordered {
display: inline-block;
padding: 20px;
/* Fallback dashed border
- the 4px width here is overwritten with the border-image-width (if set)
- the border-image-width can be omitted below if it is the same as the 4px here
*/
border: dashed 4px #000;
/* Individual border image properties */
border-image-source: url("http://i.stack.imgur.com/wLdVc.png");
border-image-slice: 2;
border-image-repeat: round;
/* or use the shorthand border-image */
border-image: url("http://i.stack.imgur.com/wLdVc.png") 2 round;
}
/*The border image of this one creates wider gaps*/
.largeGaps {
border-image-source: url("http://i.stack.imgur.com/LKclP.png");
margin: 0 20px;
}
<div class="bordered">This is bordered!</div>
<div class="bordered largeGaps">This is bordered and has larger gaps!</div>
border-style: solid
(ou quelque chose de similaire) si vous omettez le remplacement.En plus de la
border-image
propriété, il existe quelques autres façons de créer une bordure en pointillés avec un contrôle sur la longueur du trait et la distance qui les sépare. Ils sont décrits ci-dessous:Méthode 1: utilisation de SVG
Nous pouvons créer la bordure en pointillés en utilisant
path
unpolygon
élément ou et en définissant lastroke-dasharray
propriété. La propriété prend deux paramètres où l'un définit la taille du tiret et l'autre détermine l'espace entre eux.Avantages:
border-radius
impliqué. Nous aurions juste remplacer lepath
par uncircle
comme dans cette réponse (ou) convertir lepath
en cercle.Les inconvénients:
vector-effect='non-scaling-stroke'
(comme dans la deuxième case) mais la prise en charge du navigateur pour cette propriété est nulle dans IE.Afficher l'extrait de code
Méthode 2: utiliser des dégradés
Nous pouvons utiliser plusieurs
linear-gradient
images d'arrière - plan et les positionner de manière appropriée pour créer un effet de bordure en pointillé. Cela peut également être fait avec unrepeating-linear-gradient
mais il n'y a pas beaucoup d'amélioration en raison de l'utilisation d'un dégradé répétitif car nous avons besoin que chaque dégradé se répète dans une seule direction.Afficher l'extrait de code
Avantages:
Les inconvénients:
border-radius
est impliqué car les arrière-plans ne se courbent pas en fonction deborder-radius
. Ils sont coupés à la place.Méthode 3: Ombres de boîte
Nous pouvons créer une petite barre (en forme de tiret) à l'aide de pseudo-éléments, puis en créer plusieurs
box-shadow
versions pour créer une bordure comme dans l'extrait ci-dessous.Si le tiret est de forme carrée, un seul pseudo-élément suffirait, mais s'il s'agit d'un rectangle, nous aurions besoin d'un pseudo-élément pour les bordures haut + bas et un autre pour les bordures gauche + droite. En effet, la hauteur et la largeur du tiret sur la bordure supérieure seront différentes de celles de gauche.
Avantages:
Les inconvénients:
border-radius
mais les positionner serait très difficile à trouver des points sur un cercle (et peut-être mêmetransform
).Afficher l'extrait de code
la source
pointer-events:none
à svg afin de pouvoir interagir avec le contenu.Bref: non, ce n'est pas le cas. Vous devrez plutôt travailler avec des images.
la source
Il existe un outil sympa créé par @kovart appelé le générateur de bordure en pointillés .
Il utilise un svg comme image d'arrière-plan pour permettre de définir le tableau de tirets de trait souhaité, et est assez pratique.
Vous l'utiliseriez alors simplement comme propriété d'arrière-plan sur votre élément à la place de la bordure:
la source
La longueur du trait dépend de la largeur du trait. Vous pouvez augmenter la longueur en augmentant la largeur et masquer une partie de la bordure par élément interne.
https://jsfiddle.net/ok6srt2z/
la source
pointer-events: none
pour éviter le problème de superposition.J'ai récemment eu le même problème.
J'ai réussi à le résoudre avec deux divs positionnés de manière absolue portant la bordure (un pour l'horizontale et l'autre pour le vertical), puis en les transformant. La boîte extérieure a juste besoin d'être positionnée de manière relative.
Remarque: j'ai utilisé des tachyons dans cet exemple, mais je suppose que les classes sont assez explicites.
la source
Cela créera une bordure orange et grise en utilisant le class = "myclass" sur le div.
la source