Próbuję stworzyć element płótna, który zajmuje 100% szerokości i wysokości widoku.
Możesz zobaczyć w moim przykładzie tutaj, że ma miejsce, jednak dodaje paski przewijania zarówno w Chrome, jak i FireFox. Jak mogę zapobiec dodatkowym paskom przewijania i po prostu określić dokładnie szerokość i wysokość okna, aby odpowiadały rozmiarowi płótna?
Odpowiedzi:
Aby płótno było zawsze na całej szerokości i wysokości ekranu, co oznacza, że nawet po zmianie rozmiaru przeglądarki, musisz uruchomić pętlę rysowania w funkcji, która zmienia rozmiar obszaru roboczego na window.innerHeight i window.innerWidth.
Przykład: http://jsfiddle.net/jaredwilli/qFuDr/
HTML
JavaScript
CSS
W ten sposób poprawnie wykonujesz płótno na pełną szerokość i wysokość przeglądarki. Wystarczy umieścić cały kod do rysowania na płótnie w funkcji drawStuff ().
źródło
debounce
zmienić rozmiar, w przeciwnym razie zalejisz przeglądarkę.display: block
: To nie tylko usuwa paski przewijania, ale także usuwa 2 piksele z wysokości treści dokumentu, które zwykle są dodawane pod liniami tekstu wewnątrz bloku. Więc +1 za toMożesz wypróbować jednostki widoku (CSS3):
źródło
display: block;
i spełnia swoje zadanie.Odpowiem na bardziej ogólne pytanie, jak dynamicznie dostosowywać rozmiar płótna po zmianie rozmiaru okna. Zaakceptowana odpowiedź odpowiednio obsługuje przypadek, w którym szerokość i wysokość mają wynosić 100%, o co pytano, ale co również zmieni proporcje płótna. Wielu użytkowników będzie chciało zmienić rozmiar płótna przy zmianie rozmiaru okna, ale zachowując współczynnik proporcji nietknięty. Nie jest to dokładne pytanie, ale „pasuje”, po prostu umieszczając pytanie w nieco bardziej ogólnym kontekście.
Okno będzie miało pewne proporcje (szerokość / wysokość), podobnie jak obiekt płótna. To, w jaki sposób chcesz, aby te dwa współczynniki kształtu odnosiły się do siebie, to jedna rzecz, którą musisz wyjaśnić, nie ma jednej odpowiedzi na to pytanie - omówię kilka typowych przypadków chcieć.
Najważniejsza rzecz, o której musisz wiedzieć: obiekt html canvas ma atrybut szerokości i atrybut wysokości; a następnie css tego samego obiektu ma również atrybut szerokości i wysokości. Te dwie szerokości i wysokości są różne, obie są przydatne do różnych rzeczy.
Zmiana atrybutów szerokości i wysokości to jedna z metod, dzięki której zawsze możesz zmienić rozmiar swojego płótna, ale wtedy będziesz musiał przemalować wszystko, co zajmie trochę czasu i nie zawsze jest konieczne, ponieważ możesz dokonać pewnej zmiany rozmiaru poprzez atrybuty css, w takim przypadku nie przerysujesz płótna.
Widzę 4 przypadki tego, co może się wydarzyć przy zmianie rozmiaru okna (wszystkie zaczynają się od płótna pełnoekranowego)
1: chcesz, aby szerokość pozostała 100% i chcesz, aby współczynnik proporcji pozostał taki, jaki był. W takim przypadku nie musisz przerysowywać płótna; nie potrzebujesz nawet obsługi zmiany rozmiaru okna. Wszystko czego potrzebujesz to
gdzie ctx to kontekst twojego płótna. skrzypce: resizeByWidth
2: chcesz, aby szerokość i wysokość pozostały na 100%, i chcesz, aby wynikowa zmiana współczynnika proporcji miała efekt rozciągniętego obrazu. Teraz nadal nie musisz przerysowywać płótna, ale potrzebujesz programu obsługi zmiany rozmiaru okna. W programie obsługi tak
skrzypce: messWithAspectratio
3: chcesz, aby szerokość i wysokość pozostały w 100%, ale odpowiedź na zmianę współczynnika kształtu jest czymś innym niż rozciągnięcie obrazu. Następnie musisz przerysować i zrób to w sposób opisany w zaakceptowanej odpowiedzi.
skrzypce: przerysuj
4: chcesz, aby szerokość i wysokość były równe 100% podczas ładowania strony, ale później pozostań na stałym poziomie (brak reakcji na zmianę rozmiaru okna.
skrzypce: naprawiono
Wszystkie skrzypce mają identyczny kod, z wyjątkiem linii 63, w której ustawiono tryb. Możesz również skopiować kod skrzypcowy, aby uruchomić go na komputerze lokalnym, w którym to przypadku możesz wybrać tryb za pomocą argumentu querystring, jak? Mode = redraw
źródło
$(ctx.canvas).css("width", "100%");
jest odpowiednikiem$(canvas).css("width", "100%");
(płótno kontekstu to tylko płótno)ctx.canvas
jest dużo krótszy niżcanvas.getContext('2d')
- dlatego robię 2). Dlatego nie ma zmiennej o nazwie canvas, ale istnieje ctx.canvas. Stąd pochodzi ctx.canvas.http://jsfiddle.net/mqFdk/10/
z CSS
źródło
Szukałem odpowiedzi na to pytanie, ale zaakceptowana odpowiedź była dla mnie załamująca. Najwyraźniej użycie window.innerWidth nie jest przenośne. Działa w niektórych przeglądarkach, ale zauważyłem, że Firefoxowi się to nie spodobało.
Gregg Tavares zamieścił tutaj świetne źródło, które bezpośrednio rozwiązuje ten problem: http://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html (patrz przeciw wzorowi # 3 i 4).
Wydaje się, że użycie canvas.clientWidth zamiast window.innerWidth działa dobrze.
Oto sugerowana pętla renderowania Gregga:
źródło
(Rozszerzanie odpowiedzi 動靜 能量)
Stylizuj płótno, aby wypełniło ciało. Podczas renderowania na płótnie należy wziąć pod uwagę jego rozmiar.
http://jsfiddle.net/mqFdk/356/
CSS:
JavaScript:
źródło
W przypadku telefonów komórkowych lepiej go używać
ponieważ po zmianie orientacji będzie wyświetlany nieprawidłowo. „Rzutnia” zostanie zwiększona po zmianie orientacji na pionową. Zobacz pełny przykład
źródło