Saya memiliki persegi panjang berikut ...
<rect x="0px" y="0px" width="60px" height="20px"/>
Saya ingin memusatkan kata "Fiksi" di dalamnya. Untuk persegi panjang lain, apakah bungkus kata svg tetap di dalamnya? Saya tidak dapat menemukan apa pun secara khusus tentang menyisipkan teks ke dalam bentuk yang dipusatkan baik secara horizontal maupun vertikal dan bungkus kata. Juga, teks tidak bisa meninggalkan persegi panjang.
Melihat http://www.w3.org/TR/SVG/text.html#TextElement contoh tidak membantu karena elemen teks x dan y berbeda dari x dan y persegi panjang. Tampaknya tidak ada lebar dan tinggi untuk elemen teks. Saya tidak yakin dengan matematika di sini.
(Tabel html saya tidak akan berfungsi.)
Jawaban:
Solusi mudah untuk memusatkan teks secara horizontal dan vertikal di SVG:
Setel posisi teks ke pusat absolut elemen tempat Anda ingin memusatkannya:
x="50%" y ="50%"
.x
akan menjadix
elemen + setengah lebarnya (dan serupay
dengan tetapi dengan ketinggian).Gunakan
text-anchor
properti untuk memusatkan teks secara horizontal dengan nilaimiddle
:Gunakan
dominant-baseline
properti untuk memusatkan teks secara vertikal dengan nilaimiddle
(atau tergantung pada bagaimana Anda ingin itu terlihat, Anda mungkin ingin melakukannyacentral
)Ini demo sederhana:
sumber
dominant-baseline
properti yang melakukan pekerjaan, bukanalignment-baseline
.<style type="text/css"><![CDATA[ text { alignment-baseline: middle; text-anchor:middle; } ]]></style>
. Terima kasih atas solusinya.dominant-baseline
memang perlu digunakan. Maaf, tapi jawaban ini entah bagaimana menyesatkan. Karena sepertinya tidak berfungsi di Firefox atau Chromium dan selain itu Anda harus mempelajari komentar untuk menemukan solusi yang benar pada Anda sendiri, saya mengambil kebebasan untuk menambahkan jawaban lain dengan kode yang berfungsi seperti yang diharapkan. (Sebagai catatan: Diuji dengan FF dan Chromium di Ubuntu Linux.)alignment-baseline
, tapi tampaknya itu mungkin menjadi hal yang aneh karena meninjau spesifikasi, harusdominant-baseline
untuktext
, danalignment-baseline
untuktspan
,tref
,altGlyph
, dantextPath
. Saya memperbarui jawabannya.SVG 1.2 Tiny menambahkan pembungkus teks, tetapi sebagian besar implementasi SVG yang akan Anda temukan di browser (dengan pengecualian Opera) belum menerapkan fitur ini. Biasanya terserah Anda, pengembang, untuk memposisikan teks secara manual.
Spesifikasi SVG 1.1 memberikan tinjauan yang baik tentang batasan ini, dan kemungkinan solusi untuk mengatasinya:
http://www.w3.org/TR/SVG11/text.html#Introduction
Sebagai primitif, pembungkus teks dapat disimulasikan dengan menggunakan
dy
atribut dantspan
elemen, dan seperti yang disebutkan dalam spesifikasi, beberapa alat dapat mengotomatisasi ini. Misalnya, di Inkscape, pilih bentuk yang Anda inginkan, dan teks yang Anda inginkan, dan gunakan Teks -> Alirkan ke Bingkai. Ini akan memungkinkan Anda untuk menulis teks Anda, dengan pembungkus, yang akan membungkus berdasarkan batas-batas bentuk. Juga, pastikan Anda mengikuti instruksi ini untuk memberi tahu Inkscape untuk menjaga kompatibilitas dengan SVG 1.1: http://wiki.inkscape.org/wiki/index.php/FAQ#What_about_flowed_text.3FSelain itu, ada beberapa perpustakaan JavaScript yang dapat digunakan untuk mengotomatiskan pembungkusan teks secara dinamis: http://www.carto.net/papers/svg/textFlow/
Sangat menarik untuk mencatat solusi CSVG untuk membungkus bentuk ke elemen teks (mis. Lihat contoh "tombol" mereka), meskipun penting untuk menyebutkan bahwa implementasi mereka tidak dapat digunakan dalam browser: http://www.csse.monash.edu .au / ~ clm / csvg / about.html
Saya menyebutkan ini karena saya telah mengembangkan perpustakaan yang diilhami CSVG yang memungkinkan Anda untuk melakukan hal serupa dan berfungsi di browser web, meskipun saya belum merilisnya.
sumber
editable="true"
ke teks atau elemen textArea.Jawaban sebelumnya memberikan hasil yang buruk ketika menggunakan sudut bulat atau
stroke-width
itu> 1. Misalnya, Anda akan mengharapkan kode berikut untuk menghasilkan persegi panjang bulat, tetapi sudut-sudutnya terpotong olehsvg
komponen induk :Sebagai gantinya, saya sarankan membungkus di
text
dalamsvg
dan kemudian bersarang yang barusvg
danrect
bersama - sama di dalamg
elemen, seperti dalam contoh berikut:Ini memperbaiki masalah kliping yang terjadi pada jawaban di atas. Saya juga menerjemahkan kelompok teks / rect menggunakan
transform="translate(x,y)"
atribut untuk menunjukkan bahwa ini memberikan pendekatan yang lebih intuitif untuk memposisikan teks / rect di layar.sumber
Jika Anda membuat SVG secara terprogram Anda dapat menyederhanakannya dan melakukan sesuatu seperti ini:
sumber
dominant-baseline
dantext-anchor
, tidakdominantBaseline
dantextAnchor
?Anda bisa langsung menggunakan
text-anchor = "middle"
properti. Saya menyarankan untuk membuat elemen svg wrapper di atas persegi panjang dan teks Anda. Dengan begitu Anda bisa menggunakan seluruh elemen menggunakan satu pemilih css. Pastikan Anda menempatkan properti teks 'x' dan 'y' sebagai 50%.sumber
Blog Lengkap Lengkap: http://blog.techhysahil.com/svg/how-to-center-text-in-svg-shapes/
sumber
alignment-baseline
bukan atribut yang tepat untuk digunakan di sini. Jawaban yang benar adalah dengan menggunakan kombinasidominant-baseline="central"
dantext-anchor="middle"
:sumber
Salah satu cara untuk memasukkan teks ke dalam persegi panjang adalah dengan memasukkan objek asing, yang merupakan DIV, di dalam objek persegi.
Dengan cara ini, teks akan menghormati batas DIV.
sumber
Saya punya bugger waktu mendapatkan sesuatu yang terpusat menggunakan SVG, jadi saya memutar fungsi kecil saya sendiri. semoga ini bisa membantu Anda. Perhatikan bahwa ini hanya berfungsi untuk elemen SVG.
sumber
Untuk perataan teks secara horizontal dan vertikal, Anda mungkin ingin menggunakan gaya CSS berikut. Secara khusus, perhatikan bahwa
dominant-baseline:middle
mungkin salah, karena ini (biasanya) setengah jalan antara bagian atas dan garis dasar, bukan setengah jalan antara bagian atas dan bagian bawah. Juga, beberapa sumber (mis. Mozilla ) menggunakandominant-baseline:hanging
alih-alihdominant-baseline:text-before-edge
. Ini juga mungkin salah, karenahanging
dirancang untuk skrip Indic. Tentu saja, jika Anda menggunakan campuran bahasa Latin, India, ideograf atau apa pun, Anda mungkin perlu membaca dokumentasi .Sunting: Saya baru saja memperhatikan bahwa Mozilla juga menggunakan
dominant-baseline:baseline
yang pasti salah: itu bahkan bukan nilai yang diakui! Saya menganggap itu default ke font default, yaitualphabetic
, jadi mereka beruntung.Lebih banyak edit: Safari (11.1.2) mengerti
text-before-edge
tetapi tidaktext-after-edge
. Itu juga gagalideographic
. Barang luar biasa, Apple. Jadi Anda mungkin terpaksa menggunakanalphabetic
dan membiarkan keturunan. Maaf.sumber