Bagaimana saya bisa mendeteksi level pembesaran halaman di semua browser modern? Sementara utas ini memberi tahu cara melakukannya di IE7 dan IE8, saya tidak bisa menemukan solusi lintas-browser yang bagus.
Firefox menyimpan tingkat pembesaran halaman untuk akses masa depan. Pada pemuatan halaman pertama, apakah saya bisa mendapatkan level zoom? Di suatu tempat saya membacanya berfungsi ketika perubahan zoom terjadi setelah halaman dimuat.
Apakah ada cara untuk menjebak
'zoom'
acara tersebut?
Saya memerlukan ini karena beberapa perhitungan saya berbasis pixel dan mungkin berfluktuasi ketika diperbesar.
Sampel yang dimodifikasi diberikan oleh @tfl
Halaman ini mengingatkan nilai ketinggian yang berbeda saat diperbesar. [jsFiddle]
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" type="text/javascript"/></script>
</head>
<body>
<div id="xy" style="border:1px solid #f00; width:100px;">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sollicitudin tortor in lacus tincidunt volutpat. Integer dignissim imperdiet mollis. Suspendisse quis tortor velit, placerat tempor neque. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent bibendum auctor lorem vitae tempor. Nullam condimentum aliquam elementum. Nullam egestas gravida elementum. Maecenas mattis molestie nisl sit amet vehicula. Donec semper tristique blandit. Vestibulum adipiscing placerat mollis.</div>
<button onclick="alert($('#xy').height());">Show</button>
</body>
</html>
javascript
browser
zoom
detection
kekurangan
sumber
sumber
Jawaban:
Sekarang berantakan bahkan lebih besar daripada saat pertanyaan ini pertama kali diajukan. Dari membaca semua tanggapan dan posting blog yang bisa saya temukan, inilah ringkasannya. Saya juga mengatur halaman ini untuk menguji semua metode pengukuran tingkat zoom ini .
Sunting (2011-12-12): Saya telah menambahkan proyek yang dapat dikloning: https://github.com/tombigel/detect-zoom
screen.deviceXDPI / screen.logicalXDPI
(atau, untuk level zoom relatif terhadap zoom default,screen.systemXDPI / screen.logicalXDPI
)var body = document.body,r = body.getBoundingClientRect(); return (r.left-r.right)/body.offsetWidth;
(terima kasih untuk contoh ini atau jawaban ini )screen.width
/ lebar layar kueri media (lihat di bawah) (memanfaatkan fakta yangscreen.width
menggunakan piksel perangkat tetapi lebar MQ menggunakan piksel CSS - berkat lebar Quirksmode )-webkit-text-size-adjust:none
.document.width / jQuery(document).width()
(terima kasih kepada Dirk van Oosterbosch di atas ). Untuk mendapatkan rasio dalam hal piksel perangkat (alih-alih relatif terhadap zoom default), kalikan denganwindow.devicePixelRatio
.parseInt(getComputedStyle(document.documentElement,null).width) / document.documentElement.clientWidth
(dari jawaban ini )document.documentElement.offsetWidth
/ lebarposition:fixed; width:100%
div. dari sini ( tabel lebar Quirksmode mengatakan itu bug; innerWidth harus berupa CSS px). Kami menggunakan posisi: elemen tetap untuk mendapatkan lebar viewport termasuk ruang di mana scrollbar berada ; document.documentElement.clientWidth tidak termasuk lebar ini. Ini rusak sejak sekitar tahun 2011; Saya tidak tahu cara untuk mendapatkan level zoom di Opera lagi.Ini adalah pencarian biner untuk Firefox 4, karena saya tidak tahu ada variabel di mana ia diekspos:
sumber
zoom: screen.deviceXDPI / screen.logicalXDPI,
bukanzoom: screen.systemXDPI / screen.logicalXDPI,
matchMedia
. Paul Irish juga menulis polyfill matchMedia serupa yang merupakan bagian dari Modernizr .Anda dapat mencoba
Ini akan memberi Anda tingkat persentase peramban pada tampilan non-retina. Untuk tampilan DPI / retina tinggi, itu akan menghasilkan nilai yang berbeda (misalnya, 200 untuk Chrome dan Safari, 140 untuk Firefox).
Untuk menangkap acara zoom yang dapat Anda gunakan
sumber
devicePixelRatio
. Ini juga sangat membantu saya mengalihkanfixed
elemen ke elemen yangabsolute
diposisikan saat acara zoom terjadi, atau ketika nilai awaldevicePixelRatio
perubahan. Sempurna! Terima kasih!!Math.round(window.devicePixelRatio * 100)
berfungsi di Chrome, IE, Edge, dan Firefox. Safari di iMac selalu menghasilkan 200.Bagi saya, untuk Chrome / Webkit,
document.width / jQuery(document).width()
tidak berfungsi. Ketika saya membuat jendela saya kecil dan memperbesar ke situs saya sehingga bilah gulir horizontal muncul,document.width / jQuery(document).width()
tidak sama dengan 1 pada pembesaran standar. Ini karenadocument.width
termasuk bagian dari dokumen di luar viewport.Menggunakan
window.innerWidth
danwindow.outerWidth
bekerja. Untuk beberapa alasan di Chrome, outerWidth diukur dalam piksel layar dan innerWidth diukur dalam piksel css.sumber
isZoomed = (screenCssPixelRatio < .98 || screenCssPixelRatio > 1.02)
switch
Pernyataan mungkin lebih baik daripada banyak jika pernyataan lain.Rekan kerja saya dan saya menggunakan skrip dari https://github.com/tombigel/detect-zoom . Selain itu, kami juga secara dinamis membuat elemen svg dan memeriksa properti currentScale-nya. Ini berfungsi dengan baik di Chrome dan kemungkinan besar sebagian besar browser juga. Pada FF, fitur "hanya teks zoom" harus dimatikan. SVG didukung di sebagian besar browser. Pada saat penulisan ini, diuji pada IE10, FF19 dan Chrome28.
sumber
Saya menemukan artikel ini sangat membantu. Terima kasih banyak untuk yonran. Saya ingin meneruskan beberapa pembelajaran tambahan yang saya temukan saat menerapkan beberapa teknik yang dia sediakan. Dalam FF6 dan Chrome 9, dukungan untuk kueri media dari JS ditambahkan, yang dapat sangat menyederhanakan pendekatan kueri media yang diperlukan untuk menentukan zoom dalam FF. Lihat dokumen di MDN di sini . Untuk keperluan saya, saya hanya perlu mendeteksi apakah browser diperbesar atau tidak, saya tidak memerlukan faktor zoom yang sebenarnya. Saya bisa mendapatkan jawaban saya dengan satu baris JavaScript:
Menggabungkan ini dengan solusi IE8 + dan Webkit, yang juga merupakan satu baris, saya dapat mendeteksi zoom pada sebagian besar browser yang mengenai aplikasi kami dengan hanya beberapa baris kode.
sumber
devicePixelRatio
: ia mempertimbangkan penskalaan tampilan akun.Itu yang kamu butuhkan.
sumber
10
dariouterWidth
?Saya punya solusi untuk ini sejak Januari 2016. Diuji bekerja di browser Chrome, Firefox dan MS Edge.
Prinsipnya adalah sebagai berikut. Kumpulkan 2 poin MouseEvent yang berjauhan. Setiap acara mouse dilengkapi dengan koordinat layar dan dokumen. Ukur jarak antara 2 titik di kedua sistem koordinat. Meskipun ada variabel offset tetap antara sistem koordinat karena furnitur browser, jaraknya antara titik harus identik jika halaman tidak diperbesar. Alasan untuk menentukan "berjauhan" (saya menempatkan ini sebagai 12 piksel) adalah agar perubahan zoom kecil (misalnya 90% atau 110%) dapat dideteksi.
Referensi: https://developer.mozilla.org/en/docs/Web/Events/mousemove
Langkah:
Tambahkan pendengar langkah mouse
Ambil 4 pengukuran dari peristiwa mouse:
Ukur jarak d_c antara 2 titik di sistem klien
Ukur jarak d_s antara 2 titik di sistem layar
Jika d_c! = D_s maka zoom diterapkan. Perbedaan antara keduanya memberi tahu Anda jumlah zoom.
NB Hanya jarang melakukan perhitungan jarak, misalnya ketika Anda dapat mencicipi acara mouse baru yang jauh dari yang sebelumnya.
Keterbatasan: Menganggap pengguna akan menggerakkan mouse setidaknya sedikit, dan zoom tidak dapat diketahui hingga saat ini.
sumber
Anda dapat menggunakan Visual Viewport API :
Ini standar dan berfungsi baik di desktop maupun seluler: dukungan browser .
sumber
Di Internet Explorer 7, 8 & 9, ini berfungsi:
"+0.9" ditambahkan untuk mencegah kesalahan pembulatan (jika tidak, Anda akan mendapatkan 104% dan 109% ketika zoom browser masing-masing diatur ke 105% dan 110%).
Di IE6 zoom tidak ada, jadi tidak perlu memeriksa zoom.
sumber
Yang saya pikirkan adalah:
1) Buat
position:fixed
<div>
denganwidth:100%
( id = zoomdiv )2) ketika halaman dimuat:
Dan itu berhasil untuk saya
ctrl+
danctrl-
memperbesar.atau saya dapat menambahkan baris ke
$(window).onresize()
acara untuk mendapatkan level zoom aktifKode:
PS: ini posting pertama saya, maafkan ada kesalahan
sumber
screen.availWidth
melaporkan lebar layar dalam piksel layar, bukan jendela browser).Ini sangat berguna bagi saya di browser berbasis webkit (Chrome, Safari):
Sepertinya tidak berfungsi di Firefox.
Ini juga berfungsi di WebKit:
sumber
document.width
pengembalian tidak terdefinisiPada dasarnya, kami memiliki:
window.devicePixelRatio
yang memperhitungkan zoom tingkat browser * serta kepadatan zoom / piksel sistem.* - pada tingkat zoom Mac / Safari tidak diperhitungkan
vw
/vh
Unit CSSresize
peristiwa, yang dipicu pada perubahan level zoom, menyebabkan ukuran efektif dari perubahan jendelaitu sudah cukup untuk normal UX . Jika Anda perlu mendeteksi level zoom yang mungkin merupakan tanda desain UI yang buruk.
Zoom lapangan lebih sulit dilacak dan saat ini tidak dipertimbangkan.
sumber
Pada perangkat seluler (dengan Chrome untuk Android atau Opera Mobile) Anda dapat mendeteksi zoom dengan window.visualViewport.scale . https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API
Deteksi Safari: document.documentElement.clientWidth / window.innerWidth (kembalikan 1 jika tidak ada pembesaran pada perangkat).
sumber
Perhitungan Anda masih didasarkan pada sejumlah piksel CSS. Ukurannya hanya berbeda di layar sekarang. Itulah titik pembesaran halaman penuh.
Apa yang Anda inginkan terjadi pada browser di perangkat 192dpi yang karenanya biasanya menampilkan empat piksel perangkat untuk setiap piksel dalam suatu gambar? Dengan zoom 50%, perangkat ini sekarang menampilkan satu piksel gambar dalam satu piksel perangkat.
sumber
Di Chrome
sumber
Tidak menguji ini untuk IE, tetapi jika Anda membuat elemen
elem
dengankemudian
akan memberi Anda tingkat zoom browser Anda (termasuk
document.body.style.zoom
faktornya).sumber
Ini untuk Chrome , setelah jawaban pengguna 800583 ...
Saya menghabiskan beberapa jam untuk masalah ini dan belum menemukan pendekatan yang lebih baik, tetapi:
window.outerWidth/window.innerWidth
, dan ketika tidak, rasionya tampaknya(window.outerWidth-16)/window.innerWidth
, namun case pertama dapat didekati oleh yang kedua.Jadi saya datang ke berikut ...
Tetapi pendekatan ini memiliki batasan: misalnya jika Anda memainkan akordeon dengan jendela aplikasi (dengan cepat memperbesar dan mengurangi lebar jendela) maka Anda akan mendapatkan celah di antara level zoom meskipun zoom tidak berubah (mungkin di luar Lebar dan di dalam Lebar tidak persis diperbarui dalam waktu yang sama).
Dan jika Anda menginginkan faktor:
sumber
Saya punya solusi ini untuk seluler saja (diuji dengan Android):
Jika Anda ingin tingkat zoom tepat setelah gerakan pinch, Anda mungkin harus mengatur sedikit waktu tunggu karena penundaan rendering (tapi saya tidak yakin karena saya tidak mengujinya).
sumber
Jawaban ini didasarkan pada komentar tentang devicePixelRatio yang kembali secara tidak benar pada jawaban pengguna1080381.
Saya menemukan bahwa perintah ini kembali secara tidak benar dalam beberapa kasus juga ketika bekerja dengan desktop, Surface Pro 3, dan Surface Pro 4.
Apa yang saya temukan adalah itu berfungsi pada desktop saya, tetapi SP3 dan SP4 memberikan angka yang berbeda satu sama lain dan desktop.
Namun saya perhatikan bahwa SP3 kembali sebagai 1 setengah kali tingkat zoom yang saya harapkan. Ketika saya melihat pengaturan tampilan, SP3 sebenarnya diatur ke 150% daripada 100% yang saya miliki di desktop saya.
Jadi, solusi untuk komentar harus membagi tingkat zoom yang dikembalikan dengan skala mesin yang sedang Anda gunakan.
Saya bisa mendapatkan skala dalam pengaturan Windows dengan melakukan hal berikut:
Jadi dalam kasus SP3 saya, ini adalah bagaimana kode ini terlihat pada zoom 100%:
Mengalikan dengan 100 di jawaban asli user1080381 maka akan memberi Anda zoom 100 (%).
sumber
Apakah saat ini berfungsi namun masih harus dipisahkan oleh browser. Diuji berhasil di Chrome (75) dan Safari (11.1) (belum menemukan cara untuk FF pada saat ini). Ini juga membuat nilai zoom benar pada tampilan retina dan perhitungan dipicu pada acara pengubahan ukuran.
sumber
ini dia tidak berubah !:
buat file html sederhana, klik tombol. terlepas dari apa tingkat zoom: itu akan menunjukkan kepada Anda lebar 400px (setidaknya dengan firefox dan ie8)
sumber
Ini mungkin atau mungkin tidak membantu siapa pun, tetapi saya memiliki halaman yang tidak dapat saya akses ke pusat dengan benar, apa pun trik Css yang saya coba, maka saya menulis halaman JQuery file call Center Page:
Masalah terjadi dengan tingkat zoom browser, halaman akan bergeser berdasarkan jika Anda 100%, 125%, 150%, dll.
Kode di bawah ini dalam file JQuery yang disebut centerpage.js.
Dari halaman saya, saya harus menautkan ke JQuery dan file ini untuk membuatnya berfungsi, meskipun halaman master saya sudah memiliki tautan ke JQuery.
centerpage.js
:Juga jika Anda ingin memusatkan panel:
sumber
Pertanyaan ini diposting seperti berabad-abad yang lalu, tetapi hari ini ketika saya sedang mencari jawaban yang sama "Bagaimana mendeteksi acara memperbesar dan memperkecil", saya tidak dapat menemukan satu jawaban yang cocok dengan semua browser.
Seperti pada saat ini: Untuk Firefox / Chrome / IE8 dan IE9, zoom in dan out menghasilkan window.resize event. Ini dapat ditangkap menggunakan:
sumber
Solusi untuk FireFox 16+ untuk menemukan DPPX (tingkat zoom) murni dengan JavaScript:
sumber
sumber
Masalahnya terletak pada jenis monitor yang digunakan, monitor 4k vs monitor standar. Sejauh ini Chrome adalah yang paling pintar untuk bisa memberi tahu kami apa tingkat zoom hanya dengan menggunakan
window.devicePixelRatio
, tampaknya itu bisa mengetahui apa kepadatan pixel dan melaporkan kembali nomor yang sama untuk apa pun.Browser lain, tidak terlalu banyak. IE dan Edge mungkin yang terburuk, karena mereka menangani level zoom jauh berbeda. Untuk mendapatkan ukuran teks yang sama pada monitor 4k, Anda harus memilih 200%, bukan 100% pada monitor standar.
Pada Mei 2018, inilah yang harus saya deteksi level zoom untuk beberapa browser paling populer, Chrome, Firefox, dan IE11. Saya sudah memberi tahu saya berapa persentase pembesaran. Untuk IE, ia melaporkan 100% bahkan untuk monitor 4k yang sebenarnya 200%, tetapi ukuran teksnya benar-benar sama.
Ini biola: https://jsfiddle.net/ae1hdogr/
Jika ada yang mau menusuk browser lain dan memperbarui biola, silakan lakukan. Tujuan utama saya adalah untuk mendapatkan 3 browser ini tertutup untuk mendeteksi jika orang menggunakan faktor zoom lebih besar dari 100% untuk menggunakan aplikasi web saya dan menampilkan pemberitahuan yang menyarankan faktor zoom lessor.
sumber