En plus de la border-image
il existe d'autres façons de créer une bordure en pointillés en contrôlant la longueur du trait et la distance entre les pointillés. Elles sont décrites ci-dessous :
Méthode 1 : Utilisation de SVG
Nous pouvons créer la bordure en pointillés en utilisant un élément path
ou un polygon
et de définir l'élément stroke-dasharray
propriété. Cette propriété prend en compte deux paramètres, l'un définissant la taille du tiret et l'autre l'espace entre les tirets.
Pour :
- Les SVG sont par nature des graphiques évolutifs et peuvent s'adapter à n'importe quelle dimension de conteneur.
- Peut très bien fonctionner même s'il y a une
border-radius
impliqué. Nous n'aurions qu'à remplacer le path
avec un circle
comme dans cette réponse (ou) convertir le path
dans un cercle.
-
Prise en charge du SVG par les navigateurs est assez bon et une solution de repli peut être fournie en utilisant VML pour IE8-.
Cons :
-
Lorsque les dimensions du conteneur ne changent pas proportionnellement, les chemins ont tendance à se redimensionner, ce qui entraîne une modification de la taille des tirets et de l'espace qui les sépare (essayez de passer la souris sur la première boîte dans l'extrait). Ce phénomène peut être contrôlé en ajoutant vector-effect='non-scaling-stroke'
(comme dans le deuxième encadré), mais la prise en charge de cette propriété par le navigateur est nulle dans IE.
.dashed-vector {
position: relative;
height: 100px;
width: 300px;
}
svg {
position: absolute;
top: 0px;
left: 0px;
height: 100%;
width: 100%;
}
path{
fill: none;
stroke: blue;
stroke-width: 5;
stroke-dasharray: 10, 10;
}
span {
position: absolute;
top: 0px;
left: 0px;
padding: 10px;
}
/ just for demo /
div{
margin-bottom: 10px;
transition: all 1s;
}
div:hover{
height: 100px;
width: 400px;
}
<div class='dashed-vector'>
<svg viewBox='0 0 300 100' preserveAspectRatio='none'>
<path d='M0,0 300,0 300,100 0,100z' />
</svg>
<span>Some content</span>
</div>
<div class='dashed-vector'>
<svg viewBox='0 0 300 100' preserveAspectRatio='none'>
<path d='M0,0 300,0 300,100 0,100z' vector-effect='non-scaling-stroke'/>
</svg>
<span>Some content</span>
</div>
Méthode 2 : Utilisation des dégradés
Nous pouvons utiliser plusieurs linear-gradient
et les positionner de manière appropriée pour créer un effet de bordure en pointillés. Cette opération peut également être réalisée à l'aide d'un repeating-linear-gradient
mais l'utilisation d'un gradient répétitif n'apporte pas beaucoup d'améliorations, car chaque gradient ne doit se répéter que dans une seule direction.
.dashed-gradient{
height: 100px;
width: 200px;
padding: 10px;
background-image: linear-gradient(to right, blue 50%, transparent 50%), linear-gradient(to right, blue 50%, transparent 50%), linear-gradient(to bottom, blue 50%, transparent 50%), linear-gradient(to bottom, blue 50%, transparent 50%);
background-position: left top, left bottom, left top, right top;
background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
background-size: 20px 3px, 20px 3px, 3px 20px, 3px 20px;
}
.dashed-repeating-gradient {
height: 100px;
width: 200px;
padding: 10px;
background-image: repeating-linear-gradient(to right, blue 0%, blue 50%, transparent 50%, transparent 100%), repeating-linear-gradient(to right, blue 0%, blue 50%, transparent 50%, transparent 100%), repeating-linear-gradient(to bottom, blue 0%, blue 50%, transparent 50%, transparent 100%), repeating-linear-gradient(to bottom, blue 0%, blue 50%, transparent 50%, transparent 100%);
background-position: left top, left bottom, left top, right top;
background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
background-size: 20px 3px, 20px 3px, 3px 20px, 3px 20px;
}
/* just for demo */
div {
margin: 10px;
transition: all 1s;
}
div:hover {
height: 150px;
width: 300px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class='dashed-gradient'>Some content</div>
<div class='dashed-repeating-gradient'>Some content</div>
Pour :
- Évolutif et capable de s'adapter même si les dimensions du conteneur sont dynamiques.
- Il n'utilise pas de pseudo-éléments supplémentaires, ce qui signifie qu'ils peuvent être mis de côté pour d'autres utilisations potentielles.
Cons :
-
Prise en charge des dégradés linéaires par les navigateurs est comparativement plus faible et c'est une erreur si vous voulez supporter IE 9-. Même des bibliothèques comme CSS3 PIE ne permettent pas de créer des motifs de dégradé dans IE8-.
- Ne peut être utilisé lorsque
border-radius
est impliqué parce que les arrière-plans ne se courbent pas en fonction de l'âge de l'enfant. border-radius
. Au lieu de cela, ils sont coupés.
Méthode 3 : ombres en boîte
Nous pouvons créer une petite barre (en forme de tiret) à l'aide de pseudo-éléments, puis créer de multiples box-shadow
pour créer une bordure comme dans l'extrait ci-dessous.
Si le tiret est de forme carrée, un seul pseudo-élément suffit, mais s'il s'agit d'un rectangle, il faut un pseudo-élément pour les bordures supérieure et inférieure et un autre pour les bordures gauche et droite. En effet, la hauteur et la largeur du tiret de la bordure supérieure seront différentes de celles de la bordure gauche.
Pour :
- Les dimensions du tiret peuvent être contrôlées en modifiant les dimensions du pseudo-élément. L'espacement est contrôlable en modifiant l'espace entre chaque ombre.
- Il est possible d'obtenir un effet très unique en ajoutant une couleur différente pour chaque ombre de boîte.
Cons :
- Comme nous devons définir manuellement les dimensions du tiret et de l'espacement, cette approche n'est pas efficace lorsque les dimensions de la boîte parentale sont dynamiques.
- IE8 et les versions inférieures ne le font pas boîte de support ombre . Toutefois, ce problème peut être résolu en utilisant des bibliothèques telles que CSS3 PIE.
-
Peut être utilisé avec border-radius
mais leur positionnement serait très délicat, car il faudrait trouver des points sur un cercle (et peut-être même des points de référence). transform
).
.dashed-box-shadow{
position: relative;
height: 120px;
width: 120px;
padding: 10px;
}
.dashed-box-shadow:before{ / for border top and bottom /
position: absolute;
content: '';
top: 0px;
left: 0px;
height: 3px; / height of the border top and bottom /
width: 10px; / width of the border top and bottom /
background: blue; / border color /
box-shadow: 20px 0px 0px blue, 40px 0px 0px blue, 60px 0px 0px blue, 80px 0px 0px blue, 100px 0px 0px blue, / top border /
0px 110px 0px blue, 20px 110px 0px blue, 40px 110px 0px blue, 60px 110px 0px blue, 80px 110px 0px blue, 100px 110px 0px blue; / bottom border /
}
.dashed-box-shadow:after{ / for border left and right /
position: absolute;
content: '';
top: 0px;
left: 0px;
height: 10px; / height of the border left and right /
width: 3px; / width of the border left and right /
background: blue; / border color /
box-shadow: 0px 20px 0px blue, 0px 40px 0px blue, 0px 60px 0px blue, 0px 80px 0px blue, 0px 100px 0px blue, / left border /
110px 0px 0px blue, 110px 20px 0px blue, 110px 40px 0px blue, 110px 60px 0px blue, 110px 80px 0px blue, 110px 100px 0px blue; / right border /
}
<div class='dashed-box-shadow'>Some content</div>