Mengaktifkan skrol balik dalam Windows

  • Terjemahan

Kesan tatal telah wujud di web sejak sekian lama, dan walaupun sudah terdapat banyak pemalam untuk dipilih, hanya segelintir daripadanya adalah ringan dan mudah seperti yang diperlukan oleh banyak pereka dan pembangun. Kebanyakan pemalam yang saya lihat cuba melakukan terlalu banyak, menjadikannya sukar untuk disertakan dalam projek anda.

Tidak lama dahulu, Apple memperkenalkan iPhone 5S, dan tapak dengan pembentangan, di mana halaman itu dibahagikan kepada bahagian, dan setiap bahagian menerangkan salah satu ciri produk. Saya fikir ia adalah cara yang bagus untuk mempersembahkan produk tanpa kehilangan maklumat penting.

Saya pergi mencari pemalam yang sesuai, dan yang mengejutkan saya, saya tidak menemuinya. Beginilah cara pemalam penomboran dilahirkan.

Pemalam Penomboran.

Pemalam berasaskan jQuery yang membolehkan anda membuat susun atur halaman berbilang bahagian dengan markup minimum.

Saya akan memberitahu anda bagaimana ia dicipta, daripada idea, untuk merancang, menguji dan menyiarkan kod percuma.

Nota: Sebelum membina pemalam, saya sudah mengetahui kontroversi sama ada skrip harus mengubah tingkah laku tatal asli penyemak imbas atau tidak - ini boleh mengelirukan pengguna. Oleh itu, saya cuba mengurangkan kesan negatif perubahan tingkah laku kebiasaan. Dalam tetapan pemalam, anda boleh menetapkan saiz skrin di mana pemalam kembali kepada tatal skrin biasa. Oleh itu, pada peranti berkuasa rendah seperti telefon pintar dan tablet, anda boleh mengekalkan kelajuan tapak. Selain itu, anda boleh menetapkan tempoh animasi apabila beralih antara bahagian.

Kenapa semua ni?

Seperti yang saya nyatakan, kebanyakan pemalam pra-bina termasuk banyak fungsi pilihan yang menghalang integrasi. Pemalam ini sepatutnya:

Mudah untuk digunakan
- mudah untuk disepadukan
- memerlukan markup minimum
- melaksanakan satu fungsi, tetapi dengan baik

1. Lukisan

Saya mula merancang pemalam dari umum kepada khusus. Ia harus menatal melalui bahagian. Untuk melakukan ini, anda perlu melumpuhkan tatal biasa dalam penyemak imbas, sambil menyajikan bahagian satu demi satu, dan memajukan halaman jika perlu.

Anda boleh bayangkan segala-galanya dalam fikiran anda, atau anda boleh membuat lakaran.

Mari pecahkan konsep kepada tugas-tugas kecil, selesaikan setiap satu secara berurutan.

1. Sediakan susun atur bahagian
Lumpuhkan tatal biasa dengan menggunakan limpahan: tersembunyi pada badan. Susun bahagian dalam urutan yang dikehendaki, kira dan sesuaikan maklumat yang diperlukan dan kelas.

2. Pasang pencetus tatal manual
Kami menangkap pencetus melalui jQuery, menentukan arah menatal, menggerakkan susun atur menggunakan CSS.

3. Tambah ciri
Mari tambahkan kebolehsuaian, kitaran, sokongan untuk menatal pada skrin sentuh, penomboran, dsb.

4. Mari semak pelayar yang berbeza.
Jom semak pelayar Chrome Safari, Firefox, internet Explorer 10 dan sistem pengendalian paling popular Windows, Mac OS X, iOS dan Android 4.0+.

5. Jadikan pemalam tersedia dalam repositori
Mari buat repositori, tulis arahan untuk menggunakan pemalam

6. Kembangkan sokongan.
Mari kita terokai cara lain untuk meningkatkan sokongan pemalam.

2. Membina asas

Selepas mereka bentuk pemalam, saya mula membina asas pada templat ini:

Function($) ( var defaults = ( sectionContainer: "section", … ); $.fn.onepage_scroll = function(options) ( var settings = $.extend((), defaults, options); … ) )($)

Templat bermula dengan modul !function($) ( … )($) yang meletakkan pembolehubah global jQuery dalam kawasan tempatan- ini akan membantu mengurangkan beban dan mengelakkan konflik dengan perpustakaan lain.

Pembolehubah lalai mengandungi tetapan lalai.

$.fn.onepage_scroll ialah fungsi utama yang memulakan segala-galanya. Jika anda membuat pemalam anda sendiri, jangan lupa untuk menulis nama lain dan bukannya onepage_scroll.

Anda boleh menghalang penatalan standard dengan memberikan limpahan: sifat tersembunyi pada teg badan
melalui nama kelas khusus untuk pemalam itu. Adalah penting untuk menggunakan nama gaya yang unik untuk mengelakkan konflik dengan yang sedia ada. Saya biasanya menggunakan singkatan daripada nama pemalam, dan kemudian, selepas sempang, nama untuk gaya, contohnya: .onepage-wrapper.

Asas diletakkan, mari kita teruskan ke fungsi pertama.

3. Sediakan susun atur dan susun bahagian

Pada mulanya saya tersalah jalan. Saya fikir saya akan menyusun semua bahagian, melaluinya dalam satu gelung. Apa yang saya dapat dahulu:

var bahagian = $(settings.sectionContainer); var topPos = 0; $.setiap(bahagian, fungsi(i) ( $(this).css(( kedudukan: "mutlak", atas: topPos + "%" )).addClass("ops-section").attr("data-index ", i+1); topPos = topPos + 100; ));

Gelung gelung melalui semua pemilih (sectionContainer ditakrifkan dalam bahagian pembolehubah lalai), menetapkan position: absolute , dan memberikan setiap bahagian berikutnya kedudukan teratas yang betul supaya ia tidak bertindih.

Kedudukan teratas disimpan dalam topPos. Kami bermula dari awal dan menambah lagi dengan setiap kitaran. Untuk menjadikan setiap bahagian mengambil keseluruhan halaman, saya menetapkan ketinggiannya kepada 100% dan menambah 100 pada topPos .

Pembangunan dan pengesahan mengambil masa beberapa jam, tetapi pada langkah seterusnya saya menyedari bahawa semua ini tidak perlu.

4. Pencetus manual dan penukaran halaman

Seseorang akan berfikir bahawa langkah seterusnya adalah untuk mengalihkan setiap bahagian ke kedudukan baharu apabila pencetus tatal menyala... Tetapi ada cara yang lebih baik. Daripada mengalihkan setiap bahagian dalam satu gelung, saya hanya meletakkan semuanya dalam satu bekas dan menggunakan fungsi translate3d CSS3 untuk mengalihkannya. Fungsi ini menyokong peratusan, kita boleh memindahkan bahagian supaya ia betul-betul diposisikan dalam tetingkap tanpa mengira semula segala-galanya. Ia juga memudahkan untuk mengawal kelajuan dan parameter animasi lain.


Penyelesaian pertama tidak selalunya yang paling berkesan, jadi pastikan anda meninggalkan masa untuk percubaan.

Kini ia kekal hanya untuk menentukan arah menatal dan mengalihkan bekas ke arah yang betul.

Fungsi init_scroll(event, delta) ( var deltaOfInterest = delta, timeNow = new Date(). getTime(), quietPeriod = 500; // Batalkan scroll jika sedang menganimasikan atau dalam tempoh senyap if(timeNow - lastAnimation< quietPeriod + settings.animationTime) { event.preventDefault(); return; } if (deltaOfInterest < 0) { el.moveDown() } else { el.moveUp() } lastAnimation = timeNow; } $(document).bind("mousewheel DOMMouseScroll", function(event) { event.preventDefault(); var delta = event.originalEvent.wheelDelta || -event.originalEvent.detail; init_scroll(event, delta); });

Mula-mula kita mengaitkan fungsi itu ke acara roda tetikus (DOMMouseScroll dalam Firefox), kemudian kita boleh memintas data dan menentukan arah. Kami membenamkan dalam pemprosesan init_scroll, yang menerima wheelData untuk ini.

DALAM dunia yang ideal ia akan mencukupi untuk mengira perubahan dalam wheelData. Walau bagaimanapun, apabila menghidupkan jujukan, anda perlu membina semakan supaya peristiwa pencetus tidak diduplikasi (jika tidak, imej akan bertindih semasa animasi). Anda boleh menggunakan setInterval untuk memanggil setiap animasi secara bergilir-gilir, tetapi ini tidak akan memberikan ketepatan dan kebolehpercayaan, kerana setiap penyemak imbas mengendalikannya secara berbeza. Contohnya, dalam Chrome dan Firefox, setInterval menjadi perlahan dalam tab tidak aktif, akibatnya, fungsi tidak berfungsi tepat pada masanya. Akibatnya, saya memutuskan untuk menggunakan fungsi yang mengembalikan masa semasa.

Var timeNow = new Date().getTime(), quietPeriod = 500; …jika(masaSekarang - lastAnimation< quietPeriod + settings.animationTime) { event.preventDefault(); return; } … lastAnimation = timeNow;

Dalam coretan ini, yang saya petik daripada kod sebelumnya, saya menyimpan masa semasa dalam timeNow supaya saya kemudian boleh menyemak sama ada animasi telah mengambil masa lebih daripada 500ms. Jika tidak, maka transformasi tidak berlaku dan animasi tidak bertindih. Untuk Bekerja dengan masa semasa lebih dipercayai, kerana ia adalah sama untuk semua orang.

Jika(deltaOfInterest< 0) { el.moveDown() } else { el.moveUp() }

Fungsi moveUp dan moveDown menukar atribut susun atur untuk mencerminkan Keadaan sekarang tapak. Setiap daripada mereka memanggil kaedah transformasi akhir pada akhir kerja untuk memindahkan bahagian seterusnya ke dalam port pandangan.

$.fn.transformPage = fungsi(tetapan, pos, indeks) ( … $(this).css(( "-webkit-transform": (settings.direction == "mendatar") ? "translate3d(" + pos + " %, 0, 0)" : "translate3d(0, " + pos + "%, 0)", "-webkit-transition": "semua " + settings.animationTime + "ms " + settings.easing, "-moz -transform": (settings.direction == "horizontal") ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", "-moz -transition": "semua " + settings.animationTime + "ms " + settings.easing, "-ms-transform": (settings.direction == "horizontal") ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", "-ms-transition": "semua " + settings.animationTime + "ms " + settings.easing, "transform": (settings. arah == "mendatar") ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", "transition": "semua " + tetapan. animationTime + "ms" + settings.easing )); ... )

Ini ialah kaedah transformasi yang mengalih bahagian. Saya melakukannya dalam javascript dan bukannya menetapkan gaya berasingan, supaya pembangun boleh menukar tetapan dalam pemalam itu sendiri (terutamanya kelajuan dan pecutan animasi), dan tidak perlu menyelongkar fail gaya untuk mencari tetapan. Di samping itu, peratusan transformasi masih perlu dikira semula, jadi javascript sangat diperlukan.

5. Ciri-ciri tambahan

Pada mulanya saya tidak mahu menambah apa-apa, tetapi saya mendapat banyak maklum balas daripada komuniti GitHub sehingga saya memutuskan untuk menambah baik pemalam itu secara beransur-ansur. Saya mengeluarkan versi 1.2.1, yang menambah banyak panggilan balik dan gelung, dan perkara yang paling sukar ialah kebolehsuaian.

Saya tidak membuat pemalam pada mulanya dengan menggunakan platform mudah alih (yang saya kesalkan). Sebaliknya, kami perlu menjejak dan mengira semula peristiwa skrin sentuh ke dalam bentuk yang sesuai untuk digunakan dalam init_scroll. Ini tidak berfungsi dengan baik dalam semua penyemak imbas, jadi kami terpaksa membina ciri rollback - apabila penyemak imbas kembali ke penatalan biasa apabila ia mencapai lebar tetingkap tertentu.

Var lalai = ( responsiveFallback: false ... ); function responsive() ( if ($(window).width()< settings.responsiveFallback) { $("body").addClass("disabled-onepage-scroll"); $(document).unbind("mousewheel DOMMouseScroll"); el.swipeEvents().unbind("swipeDown swipeUp"); } else { if($("body").hasClass("disabled-onepage-scroll")) { $("body").removeClass("disabled-onepage-scroll"); $("html, body, .wrapper").animate({ scrollTop: 0 }, "fast"); } el.swipeEvents().bind("swipeDown", function(event) { if (!$("body").hasClass("disabled-onepage-scroll")) event.preventDefault(); el.moveUp(); }).bind("swipeUp", function(event){ if (!$("body").hasClass("disabled-onepage-scroll")) event.preventDefault(); el.moveDown(); }); $(document).bind("mousewheel DOMMouseScroll", function(event) { event.preventDefault(); var delta = event.originalEvent.wheelDelta || -event.originalEvent.detail; init_scroll(event, delta); }); } }

Mari kita tentukan pembolehubah lalai. Kami menggunakan responsiveFallback untuk menentukan masa pemalam itu akan kembali. Kod ini menentukan lebar penyemak imbas. Jika lebar kurang nilai daripada responsiveFallback , fungsi mengalih keluar semua acara, mengalihkan halaman ke permulaan dan membolehkan anda menatalnya seperti biasa. Jika lebar melebihi nilai, pemalam menyemak kehadiran kelas disable-onepage-scroll untuk melihat sama ada ia telah dimulakan. Jika tidak, ia dimulakan semula.

Penyelesaiannya tidak sempurna, tetapi membenarkan pembangun dan pereka bentuk memilih cara untuk memaparkan tapak mereka platform mudah alih, bukannya menolak sepenuhnya platform ini.

6. Menguji dalam pelayar yang berbeza.

Pengujian adalah bahagian penting dalam pembangunan, sebelum mengeluarkan pemalam anda perlu memastikan ia berfungsi pada kebanyakan mesin. Saya sentiasa membangunkan dalam Chrome - pertama, saya suka alat pembangunnya, dan kedua, saya tahu bahawa jika pemalam berfungsi dalam Chrome, kemungkinan besar ia akan berfungsi dalam Safari dan Opera.

saya biasa guna Macbook Air untuk pembangunan, dan di rumah saya mempunyai PC untuk diuji. Setelah pemalam berfungsi dalam Chrome, saya mengujinya secara manual dalam Safari, Opera, dan akhirnya Firefox pada Mac OS X, dan kemudian Chrome, Firefox dan Internet Explorer 10 pada Windows.

Bukan itu sahaja pelayar yang mungkin, tetapi sumber terbuka bagus kerana pembangun lain akan dapat menguji dan membetulkan pepijat sendiri - inilah maksudnya. Anda tidak boleh segera membuat produk yang sempurna, tetapi tetapkan papan anjal untuk bermula.

Jangan lupa untuk menguji pemalam anda peranti mudah alih.

Untuk memudahkan ujian, selepas pemalam selesai, saya membuat halaman demo untuk menunjukkan semua cirinya, dan memuat naiknya ke tapak saya. Terdapat ralat yang tidak dapat ditangkap secara tempatan, tetapi ralat itu keluar apabila bekerja di tapak sebenar. Apabila halaman demo berfungsi, saya mula menguji pada peranti mudah alih.

7. Meletakkan pemalam dalam sumber terbuka

Langkah terakhir ialah berkongsi pemalam di GitHub. Untuk melakukan ini, anda perlu membuat akaun di sana, menyediakan Git dan membuat repositori baharu. Kemudian klon ke mesin tempatan- ini akan membuat direktori dengan nama pemalam. Salin pemalam di sana dan sediakan struktur.

Struktur repositori

Sediakan sesuka hati. Saya melakukan seperti ini:

Direktori demo mengandungi demo yang berfungsi, dengan semua sumber yang diperlukan
- versi biasa dan dimampatkan pemalam berada dalam akar
- CSS dan sumber ujian, seperti imej (jika perlu) berada di akar umbi
- fail readme di akar

struktur readme

Langkah penting ialah menulis arahan yang jelas untuk komuniti sumber terbuka. Saya biasanya menulisnya dalam readme, tetapi untuk kes yang rumit, halaman wiki mungkin diperlukan. Bagaimanakah saya menulis readme:

1. Pengenalan
Saya menerangkan tujuan pemalam, memberikan imej dan pautan ke demo.
2. Keperluan dan keserasian.
Adalah lebih baik untuk mengalihkan bahagian ini lebih tinggi supaya ia segera jelas sama ada seseorang boleh menggunakan pemalam.
3. Prinsip asas penggunaan
Arahan langkah demi langkah daripada sambungan jQuery, berakhir dengan penanda HTML dan panggilan fungsi. Tetapan juga diterangkan.
4. Penggunaan lanjutan.
Arahan yang lebih kompleks kaedah awam, panggilan balik dan maklumat berguna lain.
5. Sumber lain
Pautan ke tutorial, terima kasih, dsb.

8 Meluaskan sokongan

Secara umum, ia boleh dilakukan tanpa jQuery, tetapi saya tergesa-gesa untuk meletakkannya dalam sumber terbuka, jadi saya memutuskan untuk mengurangkan masa pembangunan dan bergantung pada fungsi siap sedia dalam jQuery.

Tetapi untuk membersihkan hati nurani saya, saya mereka bentuk semula pemalam dalam javascript tulen (versi dengan sokongan Zepto juga tersedia). Dengan JS tulen, tidak perlu memasukkan jQuery, semuanya berfungsi di luar kotak.

Untuk menebus kesalahan, dan khusus untuk pembaca Majalah Smashing, saya telah membina semula Satu Halaman Tatal menggunakan JavaScript tulen (versi Zepto juga tersedia). Dengan versi JavaScript tulen, anda tidak perlu lagi memasukkan jQuery. Pemalam berfungsi di luar kotak.

Versi JS dan Zepto tulen

Mengolah semula pemalam JavaScript tulen

Pemprosesan sedemikian mungkin kelihatan seperti tugas yang sukar, tetapi ini hanya pada mulanya. Perkara yang paling sukar ialah tidak membuat kesilapan dengan matematik. Kerana Saya sudah melakukannya, pembangunan fungsi bantu menyingkirkan jQuery hanya mengambil masa beberapa jam sahaja.

Pemalam ini berdasarkan CSS3, jadi ia hanya perlu menggantikan panggilan jQuery dengan panggilan kami yang serupa. Pada masa yang sama, saya menyusun semula struktur skrip:

Nilai Pembolehubah Lalai
Semua sama seperti dalam versi terdahulu
- fungsi permulaan
Menyediakan dan membentangkan reka letak dan permulaan apa yang berlaku apabila fungsi onePageScroll dipanggil. Di sinilah semua prosedur yang menetapkan nama kelas, atribut dan gaya kedudukan.
- kaedah persendirian
Semua kaedah dalaman pemalam - acara tatal, transformasi halaman, rollback adaptif dan penjejakan tatal.
- kaedah awam
Semua kaedah pembangun: moveDown(), moveUp() dan moveTo()
- kaedah pembantu
Apa-apa sahaja yang mengatasi panggilan jQuery.

Bertemu pasangan saat-saat yang tidak menyenangkan ialah fungsi berasingan hanya untuk menambah atau mengalih keluar nama gaya, atau gunakan document.querySelector dan bukannya $. Tetapi akhirnya kami mendapat pemalam berstruktur yang lebih baik.

Membina semula pemalam untuk Zepto

Saya memutuskan untuk menyokong Zepto, walaupun pada hakikatnya ia direka hanya untuk kebanyakan orang pelayar moden(IE10+), kerana ia lebih pantas dan lebih cekap daripada jQuery 2.0+ dan mempunyai API yang lebih fleksibel. Zpeto adalah 4 kali lebih kecil daripada jQuery, yang mempengaruhi kelajuan pemuatan halaman. Disebabkan fakta bahawa orang menggunakan telefon pintar lebih kerap, Zepto menjadi alternatif terbaik.

Menukar pemalam daripada jQuery kepada Zepto adalah lebih mudah kerana ia mempunyai API yang serupa. Hampir semuanya sama kecuali bahagian animasi. Oleh kerana fungsi $.fn.animate() Zepto mempunyai sokongan animasi CSS3 dan sokongan panggil balik animationEnd, bahagian seterusnya ialah:

$(this).css(( "-webkit-transform": "translate3d(0, " + pos + "%, 0)", "-webkit-transition": "-webkit-transform " + settings.animationTime + " ms " + settings.easing, "-moz-transform": "translate3d(0, " + pos + "%, 0)", "-moz-transition": "-moz-transform " + settings.animationTime + "ms " + settings.easing, "-ms-transform": "translate3d(0, " + pos + "%, 0)", "-ms-transition": "-ms-transform " + settings.animationTime + "ms " + settings.easing, "transform": "translate3d(0, " + pos + "%, 0)", "transition": "transform " + settings.animationTime + "ms " + settings.easing )); $(this).one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend", fungsi(e) ( if (typeof settings.afterMove == "function") settings.afterMove(index, next_el); ));

Boleh digantikan dengan kod ini:

$(this).animate(( translate3d: "0, " + pos + "%, 0" ), settings.animationTime, settings.easing, function() ( if (typeof settings.afterMove == "function") tetapan. afterMove(index, next_el); )); )

Zepto membolehkan anda menganimasikan tanpa mentakrifkan semua gaya atau memberikan panggilan balik sendiri.

Dan mengapa bersusah payah dengannya?

Memandangkan lebih ramai orang menggunakan jQuery, ia menjadi lebih kompleks dan kadangkala perlahan. Jika anda membuat sokongan untuk rangka kerja lain, pemalam anda akan menjadi lebih popular.
Mengolah semula dari awal juga akan membantu anda membuat pemalam yang lebih baik pada masa hadapan. jQuery dan perpustakaan lain sangat memaafkan kesilapan kecil, seperti kehilangan koma - akibatnya, anda tidak begitu mengambil berat tentang kualiti kerja anda. Tanpa indulgensi JavaScript tulen ini, saya lebih memahami cara pemalam saya berfungsi - perkara yang berfungsi, perkara yang mempengaruhi prestasi dan perkara yang boleh dipertingkatkan.

Walaupun perpustakaan seperti jQuery telah menjadikan hidup kita lebih mudah, penggunaannya bukanlah yang paling banyak kaedah yang berkesan pencapaian matlamat. Sesetengah pemalam boleh melakukan ini.

Kesimpulan.

Nah, inilah keseluruhan proses mencipta pemalam Tatal Satu Halaman. Terdapat kesilapan, tetapi saya belajar daripadanya semasa pembangunan. Jika saya membangunkannya hari ini, saya akan menumpukan perhatian pada peranti mudah alih dan menambah lebih banyak komen pada kod tersebut.

Tanpa sokongan komuniti seperti GitHub, StackOverflow dan Smashing Magazine, saya tidak akan dapat membuat pemalam dengan begitu cepat. Komuniti ini telah banyak membantu saya dalam kerja saya, itulah sebabnya saya menyediakan pemalam saya secara percuma kepada semua orang. Ini adalah cara saya membayar balik untuk sokongan yang hebat.

Dalam artikel pendek ini, saya ingin menunjukkan cara untuk menentukan arah tatal roda tetikus. Skopnya mungkin tidak begitu luas, tetapi saya sendiri telah menemui lebih daripada sekali di mana ia perlu. Sebagai contoh, untuk mencipta satu "kesan paralaks", di mana halaman itu, sebenarnya, tidak seharusnya menatal, dan kesannya timbul hanya memfokuskan pada sama ada pengguna memusingkan roda tetikus dan ke arah mana. Ada kemungkinan bahawa anda akan menemui permohonan dalam projek anda, jika tidak sekarang, maka pada masa hadapan.

Fungsi addEvent(elem, type, handler)( if(elem.addEventListener)( elem.addEventListener(type, handler, false); ) else ( elem.attachEvent("on"+type, handler); ) return false; ) function scrollDirection()( var weelEvt = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel", el = document.body; addEvent(el, weelEvt, function(e)( var evt = e .originalEvent ? e.originalEvent: e, delta = evt.detail ? evt.detail*(-40) : evt.wheelDelta console.log("Skrol " + (delta > 0 ? "up" : "down")); )); ) // Gantungkan pengendali acara pemuatan dokumen - DOM-Ready addEvent(window, "load", scrollDirection); // Untuk jQuery, panggil sahaja fungsi selepas DOM dimuatkan /*$(function()( scrollDirection(); ));*/

Sesuatu yang istimewa untuk dilukis, saya tidak nampak maksudnya. Satu-satunya perkara yang boleh diperhatikan untuk dirinya sendiri ialah dalam kes ini FireFox yang "terkenal", dengan acara bukan standardnya "DOMMouseScroll".
Untuk pemahaman dan persepsi yang lebih baik, saya memutuskan untuk membuat satu contoh, di mana kami menganggap tugas berikut: dengan setiap pengguna menatal, dia mesti dengan jelas sampai ke bahagian seterusnya / sebelumnya halaman, tanpa melangkaunya, walaupun dia menatal secara intensif. Pada masa yang sama, kami akan memuatkan kandungan yang sepadan ke dalam blok semasa. Mari bina HTML dan CSS ini:

* ( margin: 0; padding: 0; ) #grid li ( list-style: none; height: 300px; border-bottom: 1px dotted #333; ) #fake (height: 5000px;) /* hanya di sana pasti ada bar skrol */

Mari kita beralih ke JS. Di sini tugas kami adalah untuk membatalkan tingkah laku biasa pada acara skrol tetikus ( pada asasnya - menghalang pengguna daripada menatal halaman secara manual), hitung, bergantung pada arah roda, blok seterusnya atau sebelumnya, tatal secara animasi ke blok ini dan muatkan kandungan yang diperlukan ke dalamnya.

$(function()( var flag = false, // diperlukan untuk menghalang tindakan semasa animasi bn = 0, // blok indeks blok semasa = $("#grid li"), // semua blok cnt = blok .panjang, / / bilangan blok mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel"; // wheel scroll event blocks.eq(0).load("loadblocks. html #b0") ; // segera memuatkan kandungan ke dalam blok pertama // fungsi untuk menentukan arah fungsi tatal roda getDelta(e)( var evt = e || window.event; evt = evt.originalEvent ? evt.originalEvent: evt; delta kembali = evt.detail ? evt.detail*(-40) : evt.wheelDelta; ) // tangkap acara tatal $(document).on(mousewheelevt+".my_wheel", function(e)( e.preventDefault(); // batalkan tingkah laku biasa (halaman tidak menatal) jika (bendera) kembali palsu; // jika bendera == benar, kemudian dalam masa ini animasi berlaku jika(getDelta(e) > 0)( if(bn<= 0) return false; // если дошли до первого блока, то отменяем tindakan selanjutnya--bn; // jika blok itu bukan yang pertama, kemudian hitung indeks blok sebelumnya ) else ( if(bn >= cnt-1) return false; // jika kita mencapai blok terakhir, kemudian batalkan tindakan selanjutnya ++bn; // jika blok itu bukan yang terakhir, maka kita mengira indeks blok seterusnya ) flag = true; // tetapkan bendera untuk menunjukkan bahawa animasi telah bermula $("html, body").finish().animate(( scrollTop: blocks.eq(bn).offset().top // tatal halaman ke blok dikira dengan indeks ) , 1000, function()( blocks.eq(bn).load("loadblocks.html #b" + bn); // muatkan kandungan untuk bendera blok = palsu; // alih keluar bendera, menunjukkan bahawa animasi sudah tamat )); )); ));

Saya melukis segala-galanya dalam ulasan, tetapi ia masih menjelaskan dari mana data dimuatkan. Dalam kaedah beban(), adalah mungkin bukan sahaja untuk menentukan dokumen yang akan dimuatkan, tetapi juga untuk menentukan elemen mana yang kami perlukan. Dalam contoh, saya menggunakan dokumen html biasa dengan beberapa elemen ( mengikut bilangan blok kami) mempunyai ID daripada "b0" hingga "b6". Setelah menerima indeks blok semasa, kami memuatkan elemen dengan id yang sepadan.

Cuba, uji, dan yang paling penting, ingat bahawa beberapa perkara yang anda mungkin tidak perlukan hari ini boleh banyak membantu esok. Dan jika anda mempunyai sebarang soalan atau tugas yang luar biasa, maka tuliskannya dalam benang ini atau di bahagian "

Bagaimanakah helah hari ini berkaitan dengan tapak kami? Sekali pandang, tiada. Tetapi jika pada Mac anda Bahagian but Camp hidup di Windows, maka anda mungkin sudah perasan bahawa Microsoft tidak merancang untuk menukar arah menatal tetikus dan pad jejak dan tidak akan melakukannya. Kerana ini, ternyata dalam Mac OS X kandungan dalam tingkap akan mengikuti pergerakan jari (iaitu menatal terbalik), dan di Windows anda akan menggerakkan peluncur pada skrin, dan kandungan itu sendiri akan pergi ke yang lain. cara.

Secara umum, jika anda tidak boleh menukar daripada satu pendekatan kepada mengawal tetikus kepada yang lain, sudah tiba masanya untuk beralih kepada tindakan tegas. Terdapat dua cara (pilihan dengan menyahpasang Windows dan pemindahannya kepada mesin maya tidak akan dipertimbangkan):

  • lumpuhkan tatal belakang dalam Lion, atau singa gunung . Ini dilakukan dalam tetapan sistem, dalam alat kawalan jauh "Mouse" dan "Trackpad", masing-masing.
  • dayakan tatal terbalik dalam tingkap. Anehnya, terdapat parameter dalam pendaftaran sistem untuk ini, bagaimanapun, mendapati ia adalah pengembaraan yang berasingan.

Oleh kerana kita tidak mencari jalan mudah, hari ini kita akan bercakap tentang alternatif kedua - mengaktifkan tatal terbalik dalam Windows.

Untuk bermula, anda perlu masuk sebagai contoh, ini boleh dilakukan melalui Panel Kawalan. Dalam Penghantar, lihat dalam bahagian "Tetikus dan peranti penunjuk lain":

Pilih tetikus anda daripada senarai peranti Klik dua kali. Pergi ke tab "Butiran", dalam senarai juntai bawah anda memerlukan item "ID Perkakasan":

Perhatikan baris pertama, bermula dengan huruf VID (contohnya, VID_203A&PID_FFFC&REV_0100&MI_01). Ingat gabungan ini.

Pada papan kekunci, tekan Command + R, dalam tetingkap yang terbuka, taip regedit dan tekan Enter. Editor akan dibuka Windows Registry. Pilih cawangan di sebelah kiri HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID. Anda akan melihat senarai tetikus dan pad jejak yang dilabelkan dengan gabungan VID, PID dan MI. Anda perlu mengenal pasti peranti tersuai di sini:

Di dalam peranti, anda boleh menemui beberapa folder lagi. Dalam setiap daripada mereka, anda perlu masuk ke dalam folder Parameter Peranti dan menukar nilai parameter FlipFlopWheel dari 0 hingga 1. Selepas but semula, tatal terbalik akan berfungsi dalam Windows.