Mam następujący prostokąt ...
<rect x="0px" y="0px" width="60px" height="20px"/>
Chciałbym umieścić w środku słowo „fikcja”. Czy w przypadku innych prostokątów zawijanie słów svg pozostaje w nich? Nie mogę znaleźć nic konkretnego na temat wstawiania tekstu do kształtów, które są wyśrodkowane zarówno w poziomie, jak iw pionie, oraz zawijania wyrazów. Ponadto tekst nie może opuścić prostokąta.
Spojrzenie na przykład http://www.w3.org/TR/SVG/text.html#TextElement nie pomaga, ponieważ xiy elementu tekstowego różnią się od x i y prostokąta. Wygląda na to, że elementy tekstowe nie mają szerokości ani wysokości. Nie jestem pewien matematyki tutaj.
(Moja tabela html po prostu nie będzie działać).
Odpowiedzi:
Łatwe rozwiązanie do wyśrodkowania tekstu w pionie i poziomie w SVG:
Ustaw położenie tekstu na bezwzględne centrum elementu, w którym chcesz go wyśrodkować:
x="50%" y ="50%"
.x
będzie tox
tego elementu + połowa jego szerokości (i podobnie,y
ale z wysokością).Użyj
text-anchor
właściwości, aby wyśrodkować tekst w poziomie z wartościąmiddle
:Użyj
dominant-baseline
właściwości, aby wyśrodkować tekst w pionie z wartościąmiddle
(lub w zależności od tego, jak chcesz, aby wyglądał, możesz to zrobićcentral
)Oto proste demo:
źródło
dominant-baseline
nieruchomość wykonuje pracę, a niealignment-baseline
.<style type="text/css"><![CDATA[ text { alignment-baseline: middle; text-anchor:middle; } ]]></style>
. Dzięki za rozwiązanie.dominant-baseline
rzeczywiście należy go użyć. Przepraszam, ale ta odpowiedź jest w jakiś sposób myląca. Ponieważ wydaje się, że nie działa w Firefoksie ani Chromium, a dodatkowo musisz przestudiować komentarze, aby samodzielnie znaleźć prawidłowe rozwiązanie, pozwoliłem sobie dodać kolejną odpowiedź z kodem, który działa zgodnie z oczekiwaniami. (Do wiadomości: testowane z FF i Chromium w systemie Ubuntu Linux.)alignment-baseline
, ale wydaje się, że może to być dziwaczne rzeczą, ponieważ przeglądając specyfikację, powinno byćdominant-baseline
dlatext
, ialignment-baseline
natspan
,tref
,altGlyph
, itextPath
. Odpowiednio zaktualizowałem odpowiedź.SVG 1.2 Tiny dodał zawijanie tekstu, ale większość implementacji SVG, które znajdziesz w przeglądarce (z wyjątkiem Opery) nie ma tej funkcji. Zwykle do Ciebie, programisty, należy ręczne pozycjonowanie tekstu.
Specyfikacja SVG 1.1 zapewnia dobry przegląd tego ograniczenia i możliwych rozwiązań, aby je przezwyciężyć:
http://www.w3.org/TR/SVG11/text.html#Introduction
Jako prymityw, zawijanie tekstu może być symulowane przy użyciu
dy
atrybutu itspan
elementów, a jak wspomniano w specyfikacji, niektóre narzędzia mogą to zautomatyzować. Na przykład w Inkscape wybierz żądany kształt i żądany tekst i użyj opcji Tekst -> Przepływ do ramki. Umożliwi to napisanie tekstu z zawijaniem, które będzie zawijane w oparciu o granice kształtu. Upewnij się również, że postępujesz zgodnie z tymi instrukcjami, aby poinformować Inkscape o zachowaniu zgodności z SVG 1.1: http://wiki.inkscape.org/wiki/index.php/FAQ#What_about_flowed_text.3FPonadto istnieje kilka bibliotek JavaScript, których można użyć do dynamicznego zautomatyzowania zawijania tekstu: http://www.carto.net/papers/svg/textFlow/
Warto zwrócić uwagę na rozwiązanie CSVG polegające na zawijaniu kształtu do elementu tekstowego (np. Zobacz przykład „przycisku”), chociaż ważne jest, aby wspomnieć, że ich implementacja nie jest użyteczna w przeglądarce: http://www.csse.monash.edu .au / ~ clm / csvg / about.html
Wspominam o tym, ponieważ opracowałem bibliotekę inspirowaną CSVG, która pozwala robić podobne rzeczy i działa w przeglądarkach internetowych, chociaż jeszcze jej nie wydałem.
źródło
editable="true"
do elementu text lub textArea.Poprzednie odpowiedzi dały słabe wyniki, gdy używano zaokrąglonych rogów lub
stroke-width
że jest to> 1. Na przykład można oczekiwać, że poniższy kod utworzy zaokrąglony prostokąt, ale rogi są przycinane przezsvg
składnik nadrzędny :Zamiast tego zalecam zawijanie
text
in a,svg
a następnie zagnieżdżanie tego nowegosvg
irect
razem wg
elemencie, jak w poniższym przykładzie:To rozwiązuje problem z przycinaniem, który występuje w powyższych odpowiedziach. Przetłumaczyłem również grupę prostokąt / tekst przy użyciu
transform="translate(x,y)"
atrybutu, aby zademonstrować, że zapewnia to bardziej intuicyjne podejście do pozycjonowania prostokąta / tekstu na ekranie.źródło
Jeśli tworzysz SVG programowo, możesz to uprościć i zrobić coś takiego:
źródło
dominant-baseline
atext-anchor
niedominantBaseline
itextAnchor
?Możesz bezpośrednio korzystać z
text-anchor = "middle"
właściwości. Radzę utworzyć element otoki svg nad prostokątem i tekstem. W ten sposób możesz użyć całego elementu używając jednego selektora css. Upewnij się, że właściwość „x” i „y” tekstu jest ustawiona na 50%.źródło
Blog ze wszystkimi szczegółami: http://blog.techhysahil.com/svg/how-to-center-text-in-svg-shapes/
źródło
alignment-baseline
nie jest właściwym atrybutem do użycia w tym miejscu. Prawidłowa odpowiedź to użycie kombinacjidominant-baseline="central"
itext-anchor="middle"
:źródło
Jednym ze sposobów wstawienia tekstu do prostokąta jest wstawienie obcego obiektu, którym jest DIV, wewnątrz prostokąta.
W ten sposób tekst będzie uwzględniał ograniczenia DIV.
źródło
Miałem problem z wycentrowaniem czegokolwiek za pomocą SVG, więc stworzyłem własną małą funkcję. miejmy nadzieję, że to powinno ci pomóc. Zauważ, że działa tylko dla elementów SVG.
źródło
Do poziomego i pionowego wyrównania tekstu w grafice możesz użyć następujących stylów CSS. W szczególności zwróć uwagę, że
dominant-baseline:middle
jest to prawdopodobnie błędne, ponieważ jest to (zwykle) w połowie odległości między górą a linią bazową, a nie w połowie odległości między górą a dołem. Również niektóre źródła (np. Mozilla ) używajądominant-baseline:hanging
zamiastdominant-baseline:text-before-edge
. Jest to również prawdopodobnie błędne, ponieważhanging
jest przeznaczone dla skryptów indyjskich. Oczywiście, jeśli używasz mieszanki łaciny, indyjskiego, ideogramów lub czegokolwiek innego, prawdopodobnie będziesz musiał przeczytać dokumentację .Edycja: Właśnie zauważyłem, że Mozilla również używa,
dominant-baseline:baseline
co jest zdecydowanie błędne: nie jest to nawet rozpoznawalna wartość! Zakładam, że domyślnie ustawia czcionkę na domyślną, czylialphabetic
, więc mieli szczęście.Więcej edycji: Safari (11.1.2) rozumie,
text-before-edge
ale nietext-after-edge
. To również zawodziideographic
. Świetna rzecz, Apple. Więcalphabetic
mimo wszystko możesz być zmuszony do używania i zezwalania na zjazdy. Przepraszam.źródło