Saya mencoba membuat elemen kanvas yang membutuhkan 100% lebar dan tinggi viewport.
Anda dapat melihat dalam contoh saya di sini yang sedang terjadi, namun menambahkan bilah gulir di Chrome dan FireFox. Bagaimana saya bisa mencegah bilah gulir tambahan dan hanya memberikan lebar dan tinggi jendela persis seperti ukuran kanvas?
Jawaban:
Untuk membuat kanvas layar lebar penuh dan tinggi selalu, yang berarti bahkan ketika browser diubah ukurannya, Anda perlu menjalankan loop menggambar Anda dalam suatu fungsi yang mengubah ukuran kanvas ke jendela.
Contoh: http://jsfiddle.net/jaredwilli/qFuDr/
HTML
JavaScript
CSS
Itulah cara Anda membuat kanvas dengan benar lebar dan tinggi browser. Anda hanya perlu meletakkan semua kode untuk menggambar ke kanvas dalam fungsi drawStuff ().
sumber
debounce
mengubah ukurannya jika tidak Anda akan membanjiri browser.display: block
: Ini tidak hanya menghapus scrollbar, tetapi menghilangkan 2px dari ketinggian badan dokumen, yang biasanya ditambahkan di bawah baris teks di dalam blok. Jadi +1 untuk ituAnda dapat mencoba unit viewport (CSS3):
sumber
display: block;
dan itu berhasil.Saya akan menjawab pertanyaan yang lebih umum tentang bagaimana mengubah ukuran kanvas secara dinamis sesuai ukuran jendela. Jawaban yang diterima dengan tepat menangani kasus di mana lebar dan tinggi seharusnya 100%, yang diminta, tetapi juga akan mengubah rasio aspek kanvas. Banyak pengguna menginginkan ukuran kanvas pada ukuran jendela, tetapi dengan tetap menjaga rasio aspek tidak tersentuh. Ini bukan pertanyaan yang tepat, tetapi "cocok", hanya menempatkan pertanyaan ke dalam konteks yang sedikit lebih umum.
Jendela akan memiliki beberapa aspek rasio (lebar / tinggi), dan begitu juga objek kanvas. Bagaimana Anda ingin kedua aspek rasio ini saling berhubungan adalah satu hal yang harus Anda jelaskan, tidak ada jawaban "satu ukuran cocok untuk semua" untuk pertanyaan itu - saya akan membahas beberapa kasus umum tentang apa yang mungkin Anda lakukan ingin.
Paling penting Anda harus jelas tentang: objek kanvas html memiliki atribut lebar dan atribut tinggi; dan kemudian, css dari objek yang sama juga memiliki atribut width dan height. Kedua lebar dan tinggi itu berbeda, keduanya berguna untuk hal yang berbeda.
Mengubah atribut lebar dan tinggi adalah salah satu metode yang dengannya Anda selalu dapat mengubah ukuran kanvas Anda, tetapi kemudian Anda harus mengecat semuanya, yang akan memakan waktu dan tidak selalu diperlukan, karena sejumlah perubahan ukuran yang dapat Anda lakukan melalui atribut css, dalam hal ini Anda tidak menggambar ulang kanvas.
Saya melihat 4 kasus apa yang Anda mungkin ingin terjadi pada ukuran jendela (semua dimulai dengan kanvas layar penuh)
1: Anda ingin lebar tetap 100%, dan Anda ingin rasio aspek tetap seperti semula. Dalam hal ini, Anda tidak perlu menggambar ulang kanvas; Anda bahkan tidak memerlukan penangan ukuran jendela. Yang kamu butuhkan adalah
di mana ctx adalah konteks kanvas Anda. biola: resizeByWidth
2: Anda ingin lebar dan tinggi tetap 100%, dan Anda ingin perubahan rasio aspek yang dihasilkan memiliki efek gambar yang ditarik keluar. Sekarang, Anda masih tidak perlu menggambar ulang kanvas, tetapi Anda perlu penangan ukuran jendela. Di pawang, Anda lakukan
biola: messWithAspectratio
3: Anda ingin lebar dan tinggi tetap 100%, tetapi jawaban untuk perubahan rasio aspek adalah sesuatu yang berbeda dari peregangan gambar. Maka Anda perlu menggambar ulang, dan melakukannya dengan cara yang dijelaskan dalam jawaban yang diterima.
biola: gambar ulang
4: Anda ingin lebar dan tinggi 100% memuat halaman, tetapi tetap konstan setelahnya (tidak ada reaksi terhadap perubahan ukuran jendela.
biola: diperbaiki
Semua biola memiliki kode yang identik, kecuali untuk baris 63 tempat mode diatur. Anda juga dapat menyalin kode biola untuk dijalankan di mesin lokal Anda, dalam hal ini Anda dapat memilih mode melalui argumen querystring, seperti? Mode = redraw
sumber
$(ctx.canvas).css("width", "100%");
setara dengan$(canvas).css("width", "100%");
(kanvas konteksnya hanya kanvas)ctx.canvas
jauh lebih pendek daricanvas.getContext('2d')
- itu sebabnya saya lakukan 2). Oleh karena itu, tidak ada variabel yang disebut kanvas, tetapi ada ctx.canvas. Di situlah ctx.canvas berasal.http://jsfiddle.net/mqFdk/10/
dengan CSS
sumber
Saya mencari untuk menemukan jawaban untuk pertanyaan ini juga, tetapi jawaban yang diterima itu mematahkan bagi saya. Tampaknya menggunakan window.innerWidth tidak portabel. Itu berfungsi di beberapa browser, tetapi saya perhatikan Firefox tidak menyukainya.
Gregg Tavares memposting sumber yang bagus di sini yang membahas masalah ini secara langsung: http://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html (Lihat 3 dan 4 pola anti-pola #).
Menggunakan canvas.clientWidth alih-alih window.innerWidth tampaknya berfungsi dengan baik.
Inilah loop render yang disarankan Gregg:
sumber
(Memperluas jawaban 動靜 能量)
Gaya kanvas untuk mengisi tubuh. Saat merender ke kanvas memperhitungkan ukurannya.
http://jsfiddle.net/mqFdk/356/
CSS:
Javascript:
sumber
Untuk ponsel, lebih baik menggunakannya
karena akan ditampilkan secara tidak benar setelah mengubah orientasi. "viewport" akan meningkat ketika mengubah orientasi ke potret. Lihat contoh lengkap
sumber