Pracuję nad pewnym ECMAScript / JavaScript do pliku SVG i trzeba dostać width
i height
z text
elementu więc mogę zmienić rozmiar prostokąta, który go otacza. W HTML mógłbym użyć atrybutów offsetWidth
i offsetHeight
na elemencie, ale wygląda na to, że te właściwości są niedostępne.
Oto fragment, nad którym muszę popracować. Muszę zmienić szerokość prostokąta za każdym razem, gdy zmieniam tekst, ale nie wiem, jak uzyskać faktyczny width
(w pikselach) text
element.
<rect x="100" y="100" width="100" height="100" />
<text>Some Text</text>
Jakieś pomysły?
javascript
dom
text
svg
Stephen Sorensen
źródło
źródło
Jeśli chodzi o długość tekstu, link wydaje się wskazywać, że BBox i getComputedTextLength () mogą zwracać nieco inne wartości, ale takie, które są dość blisko siebie.
http://bl.ocks.org/MSCAU/58bba77cdcae42fc2f44
źródło
pracował dla mnie w
źródło
Co powiesz na coś takiego dla kompatybilności:
Zwraca średnią wszystkich prawidłowych wyników trzech metod. Możesz go ulepszyć, aby wyeliminować wartości odstające lub faworyzować,
getComputedTextLength
jeśli element jest elementem tekstowym.Ostrzeżenie: jak mówi komentarz,
getBoundingClientRect
jest to trudne. Albo usuń to z metod, albo użyj tego tylko na elementach, w którychgetBoundingClientRect
zwrócą dobre wyniki, więc bez rotacji i prawdopodobnie bez skalowania (?)źródło
Nie wiem dlaczego, ale żadna z powyższych metod nie działa dla mnie. Odniosłem pewien sukces z metodą płótna, ale musiałem zastosować wszystkie rodzaje współczynników skali. Mimo współczynników skali nadal miałem niespójne wyniki między przeglądarkami Safari, Chrome i Firefox.
Więc spróbowałem następujących rzeczy:
Działał niesamowicie i super precyzyjnie, ale tylko w Firefoksie. Skaluj współczynniki na ratunek dla Chrome i Safari, ale bez radości. Okazuje się, że błędy Safari i Chrome nie są liniowe ani w przypadku długości ciągu, ani rozmiaru czcionki.
A więc podejdź do numeru dwa. Nie przepadam za podejściem brutalnej siły, ale po wieloletnich zmaganiach z tym z przerwami postanowiłem spróbować. Postanowiłem wygenerować stałe wartości dla każdego drukowalnego znaku. Normalnie byłoby to trochę żmudne, ale na szczęście Firefox jest super dokładny. Oto moje dwuczęściowe rozwiązanie brutalnej siły:
Uwaga: powyższy fragment musi zostać wykonany w przeglądarce Firefox, aby wygenerować dokładną tablicę wartości. Musisz także zastąpić element tablicy 32 wartością szerokości spacji w dzienniku konsoli.
Po prostu kopiuję tekst ekranowy przeglądarki Firefox i wklejam go do mojego kodu javascript. Teraz, gdy mam tablicę drukowalnych długości znaków, mogę zaimplementować funkcję get width. Oto kod:
Cóż, to jest to. Brutalna siła, ale jest bardzo dokładna we wszystkich trzech przeglądarkach, a mój poziom frustracji spadł do zera. Nie jestem pewien, jak długo to potrwa w miarę rozwoju przeglądarek, ale powinno wystarczyć, abym opracował solidną technikę metryk czcionek dla mojego tekstu SVG.
źródło
Specyfikacja SVG ma określoną metodę zwracania tych informacji:
getComputedTextLength()
źródło