Saya sudah html sampel berikut, ada DIV yang memiliki lebar 100%. Ini mengandung beberapa elemen. Saat melakukan pengubahan ukuran jendela, elemen-elemen dalam dapat diposisikan ulang, dan dimensi div dapat berubah. Saya bertanya apakah mungkin untuk mengaitkan peristiwa perubahan dimensi div? dan Bagaimana cara melakukannya? Saat ini saya mengikat fungsi panggilan balik ke acara mengubah ukuran jQuery pada DIV target, namun, tidak ada log konsol yang dihasilkan, lihat di bawah:
<html>
<head>
<script type="text/javascript" language="javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript" language="javascript">
$('#test_div').bind('resize', function(){
console.log('resized');
});
</script>
</head>
<body>
<div id="test_div" style="width: 100%; min-height: 30px; border: 1px dashed pink;">
<input type="button" value="button 1" />
<input type="button" value="button 2" />
<input type="button" value="button 3" />
</div>
</body>
</html>
javascript
jquery
html
William Choi
sumber
sumber
setInterval
sini sebagai solusi yang memungkinkan. Anda selalu dapat mengikatclearInterval
tombol klik untuk menghentikan loop setelah pekerjaan Anda selesai.Jawaban:
Ada metode yang sangat efisien untuk menentukan apakah ukuran elemen telah diubah.
http://marcj.github.io/css-element-queries/
Perpustakaan ini memiliki kelas
ResizeSensor
yang dapat digunakan untuk mengubah ukuran deteksi.Ini menggunakan pendekatan berbasis peristiwa, jadi sangat cepat dan tidak membuang waktu CPU.
Contoh:
Tolong jangan gunakan plugin jQuery onresize seperti yang digunakan
setTimeout()
dalam kombinasi dengan membaca DOMclientHeight
/clientWidth
properti dalam satu lingkaran untuk memeriksa perubahan.Ini luar biasa lambat dan tidak akurat karena menyebabkan tata letak meronta-ronta .
Pengungkapan: Saya terkait langsung dengan perpustakaan ini.
sumber
requestAnimationFrame
vssetTimeout
tidak relevan, perpustakaan ini tidak berulang .requestAnimationFrame
hanya digunakan untuk debounce / throttle frekuensi menelepon callback Anda, itu tidak polling . MutationObserver secara teoritis dapat digunakan untuk efek yang sama tetapi tidak di browser lama, tidak seperti ini. Ini luar biasa pintar.Standar baru untuk ini adalah api Ubah Ukuran Pengamat, tersedia di Chrome 64.
Ubah Ukuran Pengamat
Spesifikasi: https://wicg.github.io/ResizeObserver
Polyfill: https://github.com/WICG/ResizeObserver/issues/3
Masalah Firefox: https://bugzil.la/1272409
Masalah Safari: http://wkb.ug/157743
Dukungan Saat Ini: http://caniuse.com/#feat=resizeobserver
sumber
Anda harus mengikat
resize
acara padawindow
objek, bukan pada elemen html generik.Anda kemudian dapat menggunakan ini:
dan dalam fungsi panggilan balik Anda dapat memeriksa lebar
div
panggilan Anda yang baruJadi, jawaban untuk pertanyaan Anda adalah tidak , Anda tidak dapat mengikat
resize
acara ke div.sumber
Jangka panjang, Anda akan dapat menggunakan ResizeObserver .
Sayangnya saat ini tidak didukung secara default di banyak browser.
Sementara itu, Anda dapat menggunakan fungsi seperti berikut ini. Karena, sebagian besar perubahan ukuran elemen akan berasal dari mengubah ukuran jendela atau mengubah sesuatu di DOM. Anda dapat mendengarkan pengubahan ukuran jendela dengan peristiwa pengubahan ukuran jendela dan Anda dapat mendengarkan perubahan DOM menggunakan MutationObserver .
Berikut adalah contoh fungsi yang akan memanggil Anda kembali ketika ukuran elemen yang disediakan berubah sebagai akibat dari salah satu dari peristiwa tersebut:
sumber
body
seperti dalam contoh ini, Anda dapat menonton elemen secara langsung. Itu sebenarnya lebih performan dan efisien daripada menonton seluruh tubuh.ResizeSensor.js adalah bagian dari perpustakaan besar, tapi saya mengurangi fungsinya menjadi INI :
Bagaimana cara menggunakannya:
sumber
parseInt( getComputedStyle(element) )
Saya TIDAK merekomendasikan
setTimeout()
hack karena memperlambat kinerja! Sebagai gantinya, Anda dapat menggunakan pengamat mutasi DOM untuk mendengarkan perubahan ukuran Div.JS:
HTML:
Ini biola
Cobalah untuk mengubah ukuran div.
Anda selanjutnya dapat membungkus metode Anda dalam
debounce
metode untuk meningkatkan efisiensi.debounce
akan memicu metode Anda setiap x milidetik alih-alih memicu setiap milidetik ukuran sedang DIV.sumber
Solusi terbaik adalah dengan menggunakan Elemen Query . Namun, mereka tidak standar, tidak ada spesifikasi - dan satu-satunya pilihan adalah menggunakan salah satu dari polyfill / libraries yang tersedia, jika Anda ingin pergi dengan cara ini.
Gagasan di balik kueri elemen adalah untuk memungkinkan wadah tertentu pada halaman untuk menanggapi ruang yang disediakan untuk itu. Ini akan memungkinkan untuk menulis komponen sekali dan kemudian menjatuhkannya di mana saja pada halaman, sementara itu akan menyesuaikan isinya dengan ukuran saat ini. Tidak peduli apa ukuran Jendela itu. Ini adalah perbedaan pertama yang kita lihat antara kueri elemen dan kueri media. Semua orang berharap bahwa pada suatu titik suatu spesifikasi akan dibuat yang akan membakukan permintaan elemen (atau sesuatu yang mencapai tujuan yang sama) dan menjadikannya asli, bersih, sederhana, dan kuat. Kebanyakan orang setuju bahwa pertanyaan Media sangat terbatas dan tidak membantu untuk desain modular dan responsif sebenarnya.
Ada beberapa polyfill / perpustakaan yang memecahkan masalah dengan cara yang berbeda (bisa disebut workarounds alih-alih solusi):
Saya telah melihat solusi lain untuk masalah serupa yang diajukan. Biasanya mereka menggunakan timer atau ukuran Window / viewport di bawah tenda, yang bukan solusi nyata. Lebih jauh, saya pikir idealnya ini harus diselesaikan terutama dalam CSS, dan bukan dalam javascript atau html.
sumber
Saya menemukan perpustakaan ini berfungsi ketika solusi MarcJ tidak:
https://github.com/sdecima/javascript-detect-element-resize
Ini sangat ringan dan bahkan mendeteksi ukuran alami melalui CSS atau hanya memuat / rendering HTML.
Contoh kode (diambil dari tautan):
sumber
Lihatlah http://benalman.com/code/projects/jquery-resize/examples/resize/ ini.
Ini memiliki berbagai contoh. Coba ubah ukuran jendela Anda dan lihat bagaimana elemen di dalam elemen wadah disesuaikan.
Contoh dengan js fiddle untuk menjelaskan cara membuatnya bekerja.
Lihatlah biola ini http://jsfiddle.net/sgsqJ/4/
Dalam peristiwa resize () terikat pada elemen yang memiliki kelas "test" dan juga ke objek window dan dalam mengubah ukuran callback objek window $ ('. Test'). Resize () dipanggil.
misalnya
sumber
Anda dapat menggunakan
iframe
atauobject
menggunakancontentWindow
ataucontentDocument
mengubah ukuran. TanpasetInterval
atausetTimeout
Langkah langkah:
relative
IFRAME.contentWindow
-onresize
acaraContoh HTML:
Javascript:
Contoh Menjalankan
JsFiddle: https://jsfiddle.net/qq8p470d/
Lihat lebih lanjut:
element-resize-event
sumber
IFRAME.contentWindow
tidak tersedia sampaionload
acara tersebut diaktifkan pada iframe. Juga, Anda mungkin ingin menambahkan gayavisibility:hidden;
, karena iframe dapat memblokir input mouse ke elemen di belakangnya (tampaknya "mengambang" di IE setidaknya).display
properti elemen.Hanya objek window yang menghasilkan event "resize". Satu-satunya cara saya tahu untuk melakukan apa yang ingin Anda lakukan adalah menjalankan penghitung waktu interval yang secara berkala memeriksa ukurannya.
sumber
sumber
Hebatnya setua masalah ini, ini masih menjadi masalah di sebagian besar browser.
Seperti yang dikatakan orang lain, Chrome 64+ sekarang disertakan dengan Resize Observes secara asli, namun, spesifikasi tersebut masih diselaraskan dan Chrome sekarang sedang (pada 2019-01-29) di belakang edisi terbaru dari spesifikasi .
Saya telah melihat beberapa polyfill ResizeObserver yang baik di alam bebas, namun, beberapa tidak mengikuti spesifikasi yang erat dan yang lain memiliki beberapa masalah perhitungan.
Saya sangat membutuhkan perilaku ini untuk membuat beberapa komponen web responsif yang dapat digunakan dalam aplikasi apa pun. Untuk membuatnya bekerja dengan baik, mereka perlu mengetahui dimensi mereka setiap saat, jadi ResizeObservers terdengar ideal dan saya memutuskan untuk membuat polyfill yang mengikuti spesifikasi sedekat mungkin.
Repo: https://github.com/juggle/resize-observer
Demo: https://codesandbox.io/s/myqzvpmmy9
sumber
Menggunakan Clay.js ( https://github.com/zzarcon/clay ) cukup mudah untuk mendeteksi perubahan pada ukuran elemen:
sumber
Posting blog ini membantu saya mendeteksi perubahan ukuran pada elemen DOM secara efisien.
http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/
Cara menggunakan kode ini ...
Kode paket yang digunakan oleh contoh ...
Catatan: AppConfig adalah namespace / objek yang saya gunakan untuk mengatur fungsi yang dapat digunakan kembali. Jangan ragu untuk mencari dan mengganti nama dengan apa pun yang Anda inginkan.
sumber
Plugin jQuery saya memungkinkan acara "mengubah ukuran" pada semua elemen, bukan hanya
window
.https://github.com/dustinpoissant/ResizeTriggering
sumber
Anda dapat mencoba kode di cuplikan berikut, mencakup kebutuhan Anda menggunakan javascript biasa. ( jalankan cuplikan kode dan klik tautan satu halaman penuh untuk memicu peringatan bahwa div diubah ukurannya jika Anda ingin mengujinya. ).
Anda dapat memeriksa biola juga
MEMPERBARUI
Biola yang Diperbarui
sumber
Ini adalah salinan tepat dari jawaban teratas, tetapi alih-alih sebuah tautan, itu hanya bagian dari kode yang penting, diterjemahkan menjadi IMO lebih mudah dibaca dan lebih mudah dipahami. Beberapa perubahan kecil lainnya termasuk menggunakan cloneNode (), dan tidak menempatkan html ke string js. Hal-hal kecil, tetapi Anda dapat menyalin dan menempel ini apa adanya dan itu akan berhasil.
Cara kerjanya adalah dengan membuat dua div tak terlihat mengisi elemen yang Anda tonton, lalu menempatkan pemicu di masing-masing, dan mengatur posisi gulir yang akan memicu pemicu perubahan gulir jika ukurannya berubah.
Semua kredit nyata diberikan kepada Marc J, tetapi jika Anda hanya mencari kode yang relevan, ini dia:
sumber
Solusi Javascript murni, tetapi hanya berfungsi jika elemen diubah ukurannya dengan tombol ubah ukuran css :
offsetWidth
danoffsetHeight
dengan nilai yang disimpan, dan jika berbeda, lakukan apa yang Anda inginkan dan perbarui nilai-nilai ini.sumber
Berikut ini adalah versi sederhana dari solusi oleh @nkron, yang berlaku untuk elemen tunggal (bukan array elemen dalam jawaban @ nkron, kompleksitas yang tidak saya butuhkan).
Pendengar dan pengamat acara dapat dihapus dengan:
sumber
sumber
menggunakan jawaban Bharat Patil cukup kembalikan false di dalam panggilan balik bind Anda untuk mencegah kesalahan tumpukan maksimum, lihat contoh di bawah ini:
sumber
Ini adalah pertanyaan yang sangat lama, tetapi saya pikir saya akan mengirim solusi saya untuk ini.
Saya mencoba menggunakan
ResizeSensor
karena semua orang naksir cukup besar. Setelah menerapkan meskipun, saya menyadari bahwa di bawah tenda Element Query membutuhkan elemen yang dimaksud untuk memiliki posisirelative
atauabsolute
diterapkan padanya, yang tidak berfungsi untuk situasi saya.Saya akhirnya menangani ini dengan Rxjs
interval
bukannya lurussetTimeout
ataurequestAnimationFrame
seperti implementasi sebelumnya.Apa yang baik tentang citarasa interval yang dapat diamati adalah Anda bisa memodifikasi stream, tetapi setiap observasi lainnya dapat diatasi. Bagi saya, implementasi dasar sudah cukup, tetapi Anda bisa menjadi gila dan melakukan segala macam penggabungan, dll.
Dalam contoh di bawah ini, saya melacak perubahan lebar div bagian dalam (hijau). Ini memiliki lebar yang diatur ke 50%, tetapi lebar maks 200px. Menyeret slider mempengaruhi lebar div pembungkus (abu-abu). Anda dapat melihat bahwa api yang dapat diamati hanya menyala ketika lebar div dalam berubah, yang hanya terjadi jika lebar div luar lebih kecil dari 400px.
sumber
Hanya
Window.onResize
ada dalam spesifikasi, tetapi Anda selalu dapat memanfaatkanIFrame
untuk menghasilkanWindow
objek baru di dalam DIV Anda.Silakan periksa jawaban ini . Ada plugin jquery kecil baru , yang portabel dan mudah digunakan. Anda selalu dapat memeriksa kode sumber untuk melihat bagaimana hal itu dilakukan.
sumber
saya pikir itu tidak dapat dilakukan tetapi kemudian saya memikirkannya, Anda dapat secara manual mengubah ukuran div melalui style = "resize: both;" untuk melakukan itu Anda harus mengkliknya sehingga menambahkan fungsi onclick untuk memeriksa tinggi dan lebar elemen dan berfungsi. Dengan hanya 5 baris javascript murni (tentu bisa lebih pendek) http://codepen.io/anon/pen/eNyyVN
sumber