Vous pouvez contrôler la façon dont une SVG de la largeur du trait est dessiné?
Actuellement à la construction d'un navigateur basé sur le format SVG application. Au sein de cette application, différentes formes peuvent être de style et positionnés par l'utilisateur, y compris des rectangles.
Lorsque j'applique un stroke-width
à un SVG rect
élément de dire 1px
, le trait est appliqué à la rect
s’décalage et l'encart de différentes manières par les différents navigateurs. Cela se révèle être gênant, surtout quand j'ai essayer de calculer la largeur externe et visuelle de la position d'un rectangle et placez-la à côté d'autres éléments.
Par exemple:
- Firefox ajoute 1px inset (en bas et à gauche), et de 1px de décalage (en haut et à droite)
- Chrome ajoute 1px inset (en haut et à gauche), et de 1px de décalage (en bas et à droite)
Ma seule solution jusqu'à présent dessiner les frontières réelles moi-même (probablement avec l' path
outil) et la position des frontières et de la caresse de l'élément. Mais cette solution est une mauvaise solution, et je préfère ne pas aller en bas de cette route si possible.
Donc ma question est, pouvez-vous contrôler la façon dont une SVG de stroke-width
est attirée sur les éléments?
- il y a des filtre hacks que vous pouvez utiliser pour atteindre cet - mais c'est pas une bonne solution
- Il est le
paint-order
de paramètres, où vous pouvez spécifier, que le remplissage doit être rendu sur le haut de la course, de sorte que vous obtiendrez le "en dehors de l'alignement", voir jsfiddle.net/hne0kyLg/1 - Trouvé un moyen de faire cela à l'aide de css 'contour' attributs: codepen.io/badcat/stylo/YVzmYY. Pas sûr de ce qui est le support de cette manière sur tous les navigateurs, mais peut être utile.
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas spécifier si le trait est dessiné à l'intérieur ou à l'extérieur d'un élément. J'ai fait une proposition pour le groupe de travail SVG pour cette fonctionnalité en 2003, mais elle n'a pas reçu de soutien (ou de discussion).
Comme je l'ai indiqué dans la proposition,
Modifier: Cette réponse trompe peut-être dans l'avenir. Il devrait être possible d'atteindre ces résultats à l'aide SVG Vecteur des Effets, en combinant
veStrokePath
avecveIntersect
(pour "à l'intérieur") ou avecveExclude
(pour l'extérieur). Cependant, les Effets de Vecteurs sont encore un projet de module sans implémentations que je peux encore trouver.Edit 2: Le SVG 2 projet de spécification comprend un
course-alignement
propriété (avec le centre|à l'intérieur|à l'extérieur de valeurs possibles). Cette propriété peut faire de la Samu finalement.Modifier 3: de manière Amusante et dissapointingly, le groupe de travail SVG a supprimé
stroke-alignment
de SVG 2. Vous pouvez voir quelques-unes des préoccupations décrites après la prose ici.Mise à JOUR: La
stroke-alignment
attribut a été le 1er avril déplacé à une nouvelle spec appelé SVG Coups.Comme de la SVG 2.0 de l'Éditeur de Projet de le 26 février, 2015 (et éventuellement depuis 13 février),
leavec les valeursstroke-alignment
bieninner
,center
(par défaut) etouter
.Il semble fonctionner de la même manière que le
stroke-location
bien proposé par @Phrogz et, plus tard,stroke-position
suggestion. Cette propriété a été planifié depuis au moins 2011, mais à part une annotation qui ditil n'a jamais été détaillées dans les spécifications que c'était différés - jusqu'à maintenant, il semble.
Pas de prise en charge du navigateur cette propriété, ou, pour autant que je sais, tout de le nouveau SVG 2 caractéristiques, encore, mais j'espère qu'ils vont vite que la spec arrive à échéance. Cela a été un bien personnellement, j'ai été exhortant à avoir, et je suis vraiment heureux que il est enfin là, dans la spec.
Il semble y avoir quelques problèmes quant à la façon de la propriété doit se comporter sur les chemins ouverts ainsi que des boucles. Ces questions, plus probablement, de prolonger les implémentations dans les navigateurs. Cependant, je mettrai à jour cette réponse avec les nouvelles informations que les navigateurs commencent à l'appui de cette propriété.
stroke-alignment
est spécifié dans le format SVG Coups, le W3C Working Draft. Pendant ce temps, le SVG 2 W3C Éditeur du Projet dit qu'un coup de positionnement de la propriété doit être dans le SVG spec svgwg.org/svg2-draft/painting.html#SpecifyingStrokePaint, mais que spec a déjà atteint W3C Candidat valeur de Recommandation et pas une telle propriété est dans les spec de côté à partir d'un lien à l'stroke-position
proposition, faisant croire que cela ne sera pas le cas.J'ai trouvé un moyen simple, qui a un peu de restrictions, mais il a travaillé pour moi:
Ici un exemple de travail:
HTML:
Vous pouvez utiliser CSS pour le style de l'ordre de contour et de remplissage. C'est, d'accident vasculaire cérébral d'abord, puis remplir deuxième, et obtenir l'effet désiré.
MDN sur
paint-order
: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/paint-orderCode CSS:
Voici une fonction qui calculera le nombre de pixels que vous devez ajouter - en utilisant le avc - en haut, à droite, en bas et à gauche, tous basés sur le navigateur:
Que les personnes ci-dessus ont noté que vous devrez recalculer un décalage de la course du chemin de coordonnées ou le double de sa largeur, puis masque d'un côté ou de l'autre, parce que non seulement SVG supporte pas l'Illustrateur de l'alignement du contour, mais PostScript n'est pas non plus.
Le cahier des charges pour des coups de PostScript d'Adobe Manuel de la 2e édition d'états:
"4.5.1 Caressant:
Le avc opérateur dessine une ligne d'épaisseur le long de la voie actuelle. Pour chaque ligne droite ou courbe dans le chemin, avc dessine une ligne qui est centrée sur le segment avec des côtés parallèle pour le segment." (les italiques sont de la leur)
Le reste de la spécification n'a pas d'attributs pour le décalage de la ligne de position. Lorsque Illustrator permet de vous aligner à l'intérieur ou à l'extérieur, c'est à recalculer le chemin de l'offset (parce que c'est encore moins exigeantes en ressources que la surimpression puis masquage). Le chemin de coordonnées dans le .ia document de référence sont, pas ce qui est rastered ou exportés dans un format final.
Parce qu'Inkscape format natif est spec SVG, il ne peut pas offrir une caractéristique de la spec manque.
Ici est un travail autour de intérieure bordée
rect
à l'aide desymbol
etuse
.Exemple: https://jsbin.com/yopemiwame/edit?html,sortie
SVG:
Remarque: assurez-vous de remplacer le
?
dansuse
avec de vraies valeurs.Fond: La raison pour laquelle cela fonctionne est que symbole établit une nouvelle fenêtre d'affichage en remplaçant
symbol
avecsvg
et la création d'un élément dans l'ombre DOM. Cettesvg
de l'ombre DOM est alors lié à votreSVG
élément. Notez quesvg
s peuvent être imbriquées et tous lessvg
crée une nouvelle fenêtre d'affichage, les clips tout ce qui chevauche, y compris le chevauchement de la frontière. Pour une présentation plus détaillée de ce qui se passe lire ce fantastique article par Sara Soueidan.Je ne sais pas combien utile que ce sera, mais dans mon cas, je viens de créer un autre cercle avec seulement de la frontière et l'a placé “à l'intérieur” de l'autre forme.
Un (sale) solution possible est par l'utilisation de modèles,
voici un exemple avec un intérieur caressa triangle :
https://jsfiddle.net/qr3p7php/5/