เปิดใช้งานการเลื่อนกลับใน Windows

  • แปล

เอฟเฟ็กต์การเลื่อนมีอยู่บนเว็บมานานแล้ว และในขณะที่มีปลั๊กอินให้เลือกมากมายอยู่แล้ว มีเพียงไม่กี่ปลั๊กอินเท่านั้นที่มีน้ำหนักเบาและเรียบง่ายอย่างที่นักออกแบบและนักพัฒนาจำนวนมากต้องการ ปลั๊กอินส่วนใหญ่ที่ฉันเห็นพยายามทำมากเกินไป ทำให้ยากต่อการรวมไว้ในโครงการของคุณ

ไม่นานมานี้ Apple ได้เปิดตัว iPhone 5S และไซต์ที่มีงานนำเสนอซึ่งแบ่งหน้าออกเป็นส่วนๆ และแต่ละส่วนจะอธิบายคุณลักษณะของผลิตภัณฑ์อย่างใดอย่างหนึ่ง ฉันคิดว่ามันเป็นวิธีที่ยอดเยี่ยมในการนำเสนอผลิตภัณฑ์โดยไม่พลาดข้อมูลสำคัญ

ฉันไปค้นหาปลั๊กอินที่เหมาะสมและไม่พบปลั๊กอินที่น่าแปลกใจ นี่คือที่มาของปลั๊กอินการแบ่งหน้า

ปลั๊กอินการแบ่งหน้า

ปลั๊กอินที่ใช้ jQuery ซึ่งช่วยให้คุณสร้างเลย์เอาต์ของหน้าแบบหลายส่วนโดยมีมาร์กอัปน้อยที่สุด

ฉันจะบอกคุณว่ามันถูกสร้างขึ้นตั้งแต่แนวคิดไปจนถึงการวางแผน การทดสอบ และการโพสต์โค้ดฟรี

หมายเหตุ: ก่อนสร้างปลั๊กอิน ฉันทราบดีถึงข้อโต้แย้งว่าสคริปต์ควรเปลี่ยนพฤติกรรมการเลื่อนแบบเนทีฟของเบราว์เซอร์หรือไม่ ซึ่งอาจทำให้ผู้ใช้สับสนได้ ดังนั้นฉันจึงพยายามลดผลเสียของการเปลี่ยนแปลงพฤติกรรมที่เป็นนิสัย ในการตั้งค่าปลั๊กอิน คุณสามารถกำหนดขนาดหน้าจอที่ปลั๊กอินจะกลับสู่การเลื่อนหน้าจอปกติ ดังนั้น บนอุปกรณ์ที่ใช้พลังงานต่ำ เช่น สมาร์ทโฟนและแท็บเล็ต คุณสามารถรักษาความเร็วของไซต์ได้ นอกจากนี้ คุณสามารถกำหนดระยะเวลาของภาพเคลื่อนไหวเมื่อเปลี่ยนไปมาระหว่างส่วนต่างๆ

ทำไมทั้งหมดนี้?

อย่างที่ฉันได้กล่าวไปแล้ว ปลั๊กอินที่สร้างไว้ล่วงหน้าส่วนใหญ่จะมีปลั๊กอินมากมาย ฟังก์ชั่นเสริมซึ่งขัดขวางการรวมตัว ปลั๊กอินนี้ควรเป็น:

ง่ายต่อการใช้
- ง่ายต่อการรวม
- ต้องการมาร์กอัปขั้นต่ำ
- ทำหน้าที่อย่างใดอย่างหนึ่งแต่โดยดี

1. ภาพวาด

ฉันเริ่มวางแผนปลั๊กอินตั้งแต่ทั่วไปไปจนถึงเฉพาะเจาะจง ควรเลื่อนดูส่วนต่างๆ ในการดำเนินการนี้ คุณต้องปิดใช้งานการเลื่อนตามปกติในเบราว์เซอร์ ขณะที่แสดงส่วนต่างๆ ทีละส่วน และเลื่อนหน้าไปข้างหน้าหากจำเป็น

คุณสามารถจินตนาการทุกอย่างในใจหรือสร้างภาพร่าง

แบ่งแนวคิดออกเป็นงานย่อยๆ แก้ปัญหาแต่ละอย่างตามลำดับ

1. เตรียมเค้าโครงของส่วนต่างๆ
ปิดใช้งานการเลื่อนแบบปกติโดยใช้โอเวอร์โฟลว์: ซ่อนอยู่ในเนื้อหา จัดเรียงส่วนต่างๆ ตามลำดับที่ต้องการ คำนวณและดัดแปลง ข้อมูลที่จำเป็นและชั้นเรียน

2. ติดตั้งทริกเกอร์เลื่อนด้วยตนเอง
เราจับทริกเกอร์ผ่าน jQuery กำหนดทิศทางการเลื่อน ย้ายเค้าโครงโดยใช้ CSS

3. เพิ่มคุณสมบัติ
มาเพิ่มความสามารถในการปรับตัว วงจร การรองรับการเลื่อนบนหน้าจอสัมผัส การแบ่งหน้า ฯลฯ

4. ตรวจสอบในเบราว์เซอร์ที่แตกต่างกัน
มาตรวจสอบกัน เบราว์เซอร์ Chromeซาฟารี, ไฟร์ฟอกซ์, อินเทอร์เน็ต เอ็กซ์พลอเรอร์ 10 และระบบปฏิบัติการยอดนิยม Windows, Mac OS X, iOS และแอนดรอยด์ 4.0+.

5. ทำให้ปลั๊กอินพร้อมใช้งานในพื้นที่เก็บข้อมูล
มาสร้างที่เก็บเขียนคำแนะนำในการใช้ปลั๊กอิน

6. ขยายการสนับสนุน
ลองสำรวจวิธีอื่นๆ ในการเพิ่มการรองรับปลั๊กอิน

2. สร้างรากฐาน

หลังจากออกแบบปลั๊กอิน ฉันเริ่มสร้างฐานบนเทมเพลตนี้:

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

เทมเพลตเริ่มต้นด้วยโมดูล !function($) ( … )($) ที่ใส่ตัวแปรส่วนกลาง jQuery ใน พื้นที่ท้องถิ่น- สิ่งนี้จะช่วยลดภาระและป้องกันการขัดแย้งกับห้องสมุดอื่น

ตัวแปรเริ่มต้นประกอบด้วยการตั้งค่าเริ่มต้น

$.fn.onepage_scroll เป็นฟังก์ชันหลักที่เริ่มต้นทุกอย่าง หากคุณสร้างปลั๊กอินของคุณเอง อย่าลืมเขียนชื่ออื่นแทน onepage_scroll

คุณสามารถป้องกันการเลื่อนแบบมาตรฐานได้โดยกำหนดคุณสมบัติ overflow: hidden ให้กับแท็ก body
ผ่านชื่อคลาสเฉพาะของปลั๊กอินนั้น สิ่งสำคัญคือต้องใช้ชื่อลักษณะเฉพาะเพื่อหลีกเลี่ยงความขัดแย้งกับชื่อที่มีอยู่ ฉันมักจะใช้ตัวย่อจากชื่อของปลั๊กอิน จากนั้นตามด้วยเครื่องหมายขีดกลาง ชื่อของสไตล์ เช่น .onepage-wrapper

วางรากฐานแล้วมาเริ่มฟังก์ชั่นแรกกันเลย

3. เตรียมเค้าโครงและจัดเรียงส่วนต่างๆ

ตอนแรกฉันไปผิดทาง ฉันคิดว่าฉันจะจัดส่วนทั้งหมดตามลำดับโดยผ่านพวกมันเป็นวง สิ่งที่ฉันได้รับเป็นอันดับแรก:

ส่วน var = $ (settings.sectionContainer); var topPos = 0; $.each(ส่วน, ฟังก์ชัน(i) ( $(นี้).css(( ตำแหน่ง: "สัมบูรณ์", ด้านบน: topPos + "%" )).addClass("ops-section").attr("data-index ", i+1); topPos = topPos + 100; ));

การวนซ้ำวนซ้ำผ่านตัวเลือกทั้งหมด (sectionContainer ถูกกำหนดในส่วนตัวแปรเริ่มต้น) กำหนดตำแหน่ง: สัมบูรณ์ และให้ตำแหน่งบนสุดที่ถูกต้องในแต่ละส่วนที่ตามมา เพื่อไม่ให้ทับซ้อนกัน

ตำแหน่งสูงสุดจะถูกเก็บไว้ใน topPos เราเริ่มจากศูนย์และเพิ่มขึ้นในแต่ละรอบ เพื่อให้แต่ละส่วนกินพื้นที่ทั้งหน้า ฉันตั้งค่าความสูงเป็น 100% และเพิ่ม 100 ใน topPos

ฉันใช้เวลาพัฒนาและตรวจสอบสองสามชั่วโมง แต่ในขั้นตอนต่อไป ฉันตระหนักว่าทั้งหมดนี้ไม่จำเป็น

4. ทริกเกอร์ด้วยตนเองและการแปลงหน้า

ใครจะคิดว่าขั้นตอนต่อไปคือการย้ายแต่ละส่วนไปยังตำแหน่งใหม่เมื่อทริกเกอร์การเลื่อนเริ่มทำงาน... แต่มีวิธีที่ดีกว่า แทนที่จะเลื่อนแต่ละส่วนในลูป ฉันแค่ใส่ทั้งหมดไว้ในคอนเทนเนอร์เดียวและใช้ฟังก์ชัน translate3d ของ CSS3 เพื่อเลื่อน ฟังก์ชันนี้รองรับเปอร์เซ็นต์ เราสามารถย้ายส่วนต่างๆ เพื่อให้อยู่ในตำแหน่งที่ถูกต้องในหน้าต่างโดยไม่ต้องคำนวณใหม่ทั้งหมด นอกจากนี้ยังช่วยให้ควบคุมความเร็วและพารามิเตอร์แอนิเมชันอื่นๆ ได้ง่ายขึ้น


วิธีแก้ปัญหาแรกไม่ได้มีประสิทธิภาพสูงสุดเสมอไป ดังนั้นโปรดเผื่อเวลาไว้สำหรับการทดลอง

ตอนนี้เหลือเพียงการกำหนดทิศทางการเลื่อนและย้ายคอนเทนเนอร์ไปในทิศทางที่ถูกต้อง

ฟังก์ชัน init_scroll(event, delta) ( var deltaOfInterest = delta, timeNow = new Date() getTime(), quietPeriod = 500; // ยกเลิกการเลื่อนหากกำลังเคลื่อนไหวหรืออยู่ในช่วงเวลาที่เงียบ 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); });

ขั้นแรก เราเชื่อมโยงฟังก์ชันเข้ากับเหตุการณ์ mousewheel (DOMMouseScroll ใน Firefox) จากนั้นเราสามารถดักจับข้อมูลและกำหนดทิศทางได้ เราฝังในการประมวลผล init_scroll ซึ่งรับ wheelData สำหรับสิ่งนี้

ใน โลกในอุดมคติมันจะเพียงพอที่จะคำนวณการเปลี่ยนแปลงใน wheelData อย่างไรก็ตาม เมื่อสร้างแอนิเมชันลำดับ คุณต้องสร้างการตรวจสอบเพื่อไม่ให้ทริกเกอร์เหตุการณ์ซ้ำกัน (มิฉะนั้น ภาพจะทับซ้อนระหว่างแอนิเมชัน) เป็นไปได้ที่จะใช้ setInterval เพื่อเรียกแต่ละแอนิเมชั่นตามลำดับ แต่สิ่งนี้จะไม่ให้ความแม่นยำและความน่าเชื่อถือเพราะ แต่ละเบราว์เซอร์จัดการแตกต่างกัน ตัวอย่างเช่น ใน Chrome และ Firefox setInterval จะทำงานช้าลงในแท็บที่ไม่ได้ใช้งาน ส่งผลให้ฟังก์ชันต่างๆ ทำงานไม่ตรงเวลา ด้วยเหตุนี้ ฉันจึงตัดสินใจใช้ฟังก์ชันที่ส่งกลับเวลาปัจจุบัน

Var timeNow = วันที่ใหม่ ().getTime (), ช่วงเวลาเงียบ = 500; …ถ้า(timeNow - LastAnimation< quietPeriod + settings.animationTime) { event.preventDefault(); return; } … lastAnimation = timeNow;

ในข้อมูลโค้ดนี้ ซึ่งฉันยกมาจากโค้ดก่อนหน้า ฉันเก็บเวลาปัจจุบันไว้ใน timeNow เพื่อที่ฉันจะได้ตรวจสอบในภายหลังว่าแอนิเมชันใช้เวลามากกว่า 500 มิลลิวินาทีหรือไม่ หากไม่มี การแปลงจะไม่เกิดขึ้นและแอนิเมชันจะไม่ทับซ้อนกัน ที่จะทำงานร่วมกับ เวลาปัจจุบันน่าเชื่อถือมากขึ้นเพราะ มันเหมือนกันสำหรับทุกคน

ถ้า(เดลต้าของดอกเบี้ย< 0) { el.moveDown() } else { el.moveUp() }

ฟังก์ชันการเลื่อนขึ้นและเลื่อนลงเปลี่ยนแอตทริบิวต์ของโครงร่างให้สะท้อน สถานะปัจจุบันเว็บไซต์. แต่ละคนเรียกวิธีการแปลงสุดท้ายเมื่อสิ้นสุดการทำงานเพื่อย้ายส่วนถัดไปไปยังวิวพอร์ต

$.fn.transformPage = function(settings, pos, index) ( … $(this).css(( "-webkit-transform": (settings.direction == "horizontal") ? "translate3d(" + pos + " %, 0, 0)" : "translate3d(0, " + pos + "%, 0)", "-webkit-transition": "all " + settings.animationTime + "ms " + settings.easing, "-moz -transform": (settings.direction == "horizontal") ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", "-moz -transition": "all " + settings.animationTime + "ms " + settings.easing, "-ms-transform": (settings.direction == "horizontal") ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", "-ms-transition": "all " + settings.animationTime + "ms " + settings.easing, "transform": (settings. ทิศทาง == "แนวนอน") ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", "การเปลี่ยนผ่าน": "ทั้งหมด" + การตั้งค่า animationTime + "ms" + settings.easing )); ... )

นี่เป็นวิธีการแปลงที่เปลี่ยนส่วนต่างๆ ฉันทำมันในจาวาสคริปต์แทนที่จะตั้งค่าสไตล์แยกกัน เพื่อให้นักพัฒนาสามารถเปลี่ยนการตั้งค่าในตัวปลั๊กอินเอง (โดยหลักคือความเร็วของภาพเคลื่อนไหวและการเร่งความเร็ว) และไม่ต้องค้นหาไฟล์สไตล์เพื่อค้นหาการตั้งค่า นอกจากนี้ เปอร์เซ็นต์การเปลี่ยนแปลงยังคงต้องคำนวณใหม่ ดังนั้นจาวาสคริปต์จึงขาดไม่ได้

5. คุณสมบัติเพิ่มเติม

ตอนแรกฉันไม่ต้องการเพิ่มอะไร แต่ฉันได้รับข้อเสนอแนะมากมายจากชุมชน GitHub ที่ฉันตัดสินใจปรับปรุงปลั๊กอินอย่างค่อยเป็นค่อยไป ฉันเปิดตัวเวอร์ชัน 1.2.1 ซึ่งเพิ่มการเรียกกลับและลูปจำนวนมาก และสิ่งที่ยากที่สุดคือความสามารถในการปรับตัว

ฉันไม่ได้สร้างปลั๊กอินในตอนแรกโดยคำนึงถึงแพลตฟอร์มมือถือ (ซึ่งฉันเสียใจ) เราต้องติดตามและคำนวณเหตุการณ์บนหน้าจอสัมผัสใหม่ในรูปแบบที่เหมาะสมสำหรับใช้ใน init_scroll สิ่งนี้ทำงานได้ไม่ดีในเบราว์เซอร์ทั้งหมด ดังนั้นเราจึงต้องสร้างคุณลักษณะการย้อนกลับ - เมื่อเบราว์เซอร์กลับสู่การเลื่อนตามปกติเมื่อถึงความกว้างของหน้าต่างที่กำหนด

ค่าเริ่มต้น Var = ( responsiveFallback: เท็จ ... ); ฟังก์ชันตอบสนอง () ( ถ้า ($(หน้าต่าง).ความกว้าง()< 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); }); } }

มากำหนดตัวแปรเริ่มต้นกัน เราใช้ responsiveFallback เพื่อพิจารณาว่าเมื่อใดที่ปลั๊กอินควรสำรอง รหัสนี้กำหนดความกว้างของเบราว์เซอร์ ถ้ากว้าง มูลค่าน้อยลงจาก responsiveFallback ฟังก์ชันจะลบกิจกรรมทั้งหมด ย้ายหน้าไปยังจุดเริ่มต้น และอนุญาตให้คุณเลื่อนหน้าตามปกติ หากความกว้างเกินค่า ปลั๊กอินจะตรวจสอบการมีอยู่ของคลาสการเลื่อนหน้าเดียวที่ปิดใช้งานอยู่ เพื่อดูว่าได้เตรียมใช้งานไว้หรือไม่ ถ้าไม่ใช่ก็เริ่มต้นใหม่

โซลูชันนี้ไม่สมบูรณ์แบบ แต่ช่วยให้นักพัฒนาและนักออกแบบสามารถเลือกวิธีแสดงไซต์ของตนได้ แพลตฟอร์มมือถือแทนที่จะปฏิเสธแพลตฟอร์มเหล่านี้โดยสิ้นเชิง

6. การทดสอบในเบราว์เซอร์ต่างๆ

การทดสอบเป็นส่วนสำคัญของการพัฒนา ก่อนที่จะปล่อยปลั๊กอิน คุณต้องแน่ใจว่าปลั๊กอินนั้นใช้งานได้กับเครื่องส่วนใหญ่ ฉันมักจะพัฒนาใน Chrome เสมอ ประการแรก ฉันชอบเครื่องมือสำหรับนักพัฒนา และอย่างที่สอง ฉันรู้ว่าถ้าปลั๊กอินทำงานใน Chrome ปลั๊กอินก็มักจะทำงานใน Safari และ Opera

ฉันมักจะใช้ แมคบุ๊กแอร์สำหรับการพัฒนา และที่บ้านฉันมีพีซีให้ทดสอบ เมื่อปลั๊กอินทำงานใน Chrome แล้ว ฉันจะทดสอบด้วยตนเองใน Safari, Opera และสุดท้ายคือ Firefox บน Mac OS X จากนั้น Chrome, Firefox และ Internet Explorer 10 บน Windows

นั่นไม่ใช่ทั้งหมด เบราว์เซอร์ที่เป็นไปได้แต่โอเพ่นซอร์สนั้นดีเพราะนักพัฒนารายอื่นจะสามารถทดสอบและแก้ไขข้อบกพร่องได้เอง - นี่คือความหมายของมัน คุณไม่สามารถสร้างผลิตภัณฑ์ที่สมบูรณ์แบบได้ในทันที แต่ตั้งกระดานกระโดดน้ำสำหรับการเริ่มต้น

อย่าลืมทดสอบปลั๊กอินของคุณ อุปกรณ์เคลื่อนที่.

เพื่อให้การทดสอบง่ายขึ้น หลังจากปลั๊กอินเสร็จสิ้น ฉันสร้างหน้าสาธิตเพื่อแสดงคุณลักษณะทั้งหมด และอัปโหลดไปยังไซต์ของฉัน มีข้อผิดพลาดที่ไม่สามารถตรวจจับได้ในเครื่อง แต่จะผิดพลาดเมื่อทำงานบนไซต์จริง เมื่อหน้าสาธิตใช้งานได้ ฉันเริ่มทดสอบบนอุปกรณ์พกพา

7. วางปลั๊กอินในโอเพ่นซอร์ส

ขั้นตอนสุดท้ายคือการแชร์ปลั๊กอินบน GitHub ในการทำเช่นนี้ คุณต้องสร้างบัญชีที่นั่น ตั้งค่า Git และสร้างที่เก็บใหม่ จากนั้นโคลนไปที่ เครื่องท้องถิ่น- สิ่งนี้จะสร้างไดเร็กทอรีที่มีชื่อปลั๊กอิน คัดลอกปลั๊กอินที่นั่นและตั้งค่าโครงสร้าง

โครงสร้างที่เก็บ

ตั้งค่าตามที่คุณต้องการ ฉันชอบสิ่งนี้:

ไดเร็กทอรีสาธิตมีการสาธิตการทำงานพร้อมทรัพยากรที่จำเป็นทั้งหมด
- ปลั๊กอินเวอร์ชันปกติและบีบอัดอยู่ในรูท
- CSS และทรัพยากรการทดสอบ เช่น รูปภาพ (หากจำเป็น) อยู่ที่รูท
- ไฟล์ readme ที่รูท

โครงสร้างการอ่านค่า

ขั้นตอนสำคัญคือการเขียน คำแนะนำที่ชัดเจนสำหรับชุมชนโอเพ่นซอร์ส ฉันมักจะเขียนไว้ใน readme แต่สำหรับกรณีที่ซับซ้อน อาจจำเป็นต้องใช้หน้า wiki ฉันจะเขียน readme ได้อย่างไร:

1. บทนำ
ฉันอธิบายวัตถุประสงค์ของปลั๊กอิน ให้รูปภาพและลิงก์ไปยังตัวอย่าง
2. ข้อกำหนดและความเข้ากันได้
เป็นการดีกว่าที่จะย้ายส่วนนี้ให้สูงขึ้นเพื่อให้ชัดเจนในทันทีว่าบุคคลนั้นสามารถใช้ปลั๊กอินได้หรือไม่
3. หลักการใช้งานเบื้องต้น
คำแนะนำทีละขั้นตอนจาก การเชื่อมต่อ jQueryลงท้ายด้วยมาร์กอัป HTML และการเรียกใช้ฟังก์ชัน อธิบายการตั้งค่าด้วย
4. การใช้งานขั้นสูง
คำแนะนำที่ซับซ้อนมากขึ้น วิธีการสาธารณะโทรกลับและข้อมูลที่เป็นประโยชน์อื่น ๆ
5. แหล่งข้อมูลอื่นๆ
ลิงก์ไปยังบทช่วยสอน ขอบคุณ ฯลฯ

8 การขยายการสนับสนุน

โดยทั่วไปแล้วสามารถทำได้โดยไม่ต้องใช้ jQuery แต่ฉันรีบใส่ไว้ในโอเพนซอร์ส ดังนั้นฉันจึงตัดสินใจลดเวลาในการพัฒนาและใช้ฟังก์ชันสำเร็จรูปใน jQuery

แต่เพื่อเคลียร์ความรู้สึกผิดชอบชั่วดีของฉัน ฉันออกแบบปลั๊กอินใหม่โดยใช้จาวาสคริปต์ล้วนๆ (มีเวอร์ชันที่รองรับ Zepto ด้วย) ด้วย Pure JS ไม่จำเป็นต้องรวม jQuery ทุกอย่างทำงานนอกกรอบ

เพื่อแก้ไขและเฉพาะสำหรับผู้อ่านของ Smashing Magazine ฉันได้สร้างใหม่ หน้าเดียวเลื่อนโดยใช้ JavaScript บริสุทธิ์ (มีเวอร์ชัน Zepto ด้วย) ด้วยเวอร์ชัน JavaScript แท้ คุณไม่จำเป็นต้องรวม jQuery อีกต่อไป ปลั๊กอินใช้งานได้ทันทีที่แกะกล่อง

รุ่น Pure JS และ Zepto

ทำงานซ้ำของปลั๊กอิน JavaScript บริสุทธิ์

การประมวลผลดังกล่าวอาจดูเหมือนเป็นงานที่ยาก แต่นี่เป็นเพียงในตอนแรกเท่านั้น สิ่งที่ยากที่สุดคือการไม่ทำผิดพลาดกับคณิตศาสตร์ เพราะ ฉันทำไปแล้ว การพัฒนา ฟังก์ชั่นเสริมการกำจัด jQuery ใช้เวลาเพียงไม่กี่ชั่วโมง

ปลั๊กอินนี้ใช้ CSS3 ดังนั้นจึงเป็นเรื่องของการแทนที่การเรียก jQuery ด้วยการโทรที่คล้ายกันของเรา ในเวลาเดียวกัน ฉันได้จัดระเบียบโครงสร้างของสคริปต์ใหม่:

ค่าตัวแปรเริ่มต้น
เช่นเดียวกับใน รุ่นก่อนหน้า
- ฟังก์ชั่นการเริ่มต้น
เตรียมและวางโครงร่างและการเริ่มต้นของสิ่งที่เกิดขึ้นเมื่อมีการเรียกใช้ฟังก์ชัน onePageScroll นี่คือขั้นตอนทั้งหมดที่กำหนดชื่อคลาส คุณลักษณะ และลักษณะการวางตำแหน่ง
- วิธีการส่วนตัว
ทั้งหมด วิธีการภายในปลั๊กอิน - เหตุการณ์การเลื่อน การแปลงหน้า การย้อนกลับแบบปรับเปลี่ยนได้ และการติดตามการเลื่อน
- วิธีการสาธารณะ
วิธีการสำหรับนักพัฒนาทั้งหมด: moveDown(), moveUp() และ moveTo()
- วิธีการช่วยเหลือ
สิ่งใดก็ตามที่แทนที่การโทรด้วย jQuery

เจอคู่ ช่วงเวลาที่ไม่พึงประสงค์เป็นฟังก์ชันแยกต่างหากสำหรับเพิ่มหรือลบชื่อสไตล์ หรือใช้ document.querySelector แทน $ แต่ในที่สุดเราก็ได้ปลั๊กอินที่มีโครงสร้างดีกว่า

สร้างปลั๊กอินใหม่สำหรับ Zepto

ฉันตัดสินใจสนับสนุน Zepto แม้ว่าจะได้รับการออกแบบมาเพื่อคนส่วนใหญ่เท่านั้น เบราว์เซอร์สมัยใหม่(IE10+) เนื่องจาก เร็วกว่าและมีประสิทธิภาพมากกว่า jQuery 2.0+ และมี API ที่ยืดหยุ่นกว่า Zpeto มีขนาดเล็กกว่า jQuery ถึง 4 เท่า ซึ่งส่งผลต่อความเร็วในการโหลดหน้าเว็บ เนื่องจากผู้คนใช้สมาร์ทโฟนบ่อยขึ้น Zepto จึงเป็นทางเลือกที่ดีที่สุด

การแปลงปลั๊กอินจาก jQuery เป็น Zepto นั้นง่ายกว่าเพราะมี API ที่คล้ายกัน เกือบทุกอย่างเหมือนกันหมดยกเว้นในส่วนของอนิเมชั่น เนื่องจากฟังก์ชัน $.fn.animate() ของ Zepto มีการสนับสนุนแอนิเมชัน CSS3 และการสนับสนุนการเรียกกลับของ animationEnd ส่วนถัดไปคือ:

$(นี้).css(( "-webkit-transform": "translate3d(0, " + pos + "%, 0)", "-webkit-transform": "-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)", "transform": "transform " + settings.animationTime + "ms " + settings.easing )); $(นี้).หนึ่ง("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend", function(e) ( if (typeof settings.afterMove == "function") settings.afterMove(index, next_el); ));

สามารถแทนที่ด้วยรหัสนี้:

$(นี้).animate(( translate3d: "0, " + pos + "%, 0" ), settings.animationTime, settings.easing, function() ( if (typeof settings.afterMove == "function") การตั้งค่า afterMove (ดัชนี, next_el); )); )

Zepto ช่วยให้คุณเคลื่อนไหวได้โดยไม่ต้องกำหนดสไตล์ทั้งหมดหรือกำหนดการโทรกลับด้วยตัวคุณเอง

และทำไมต้องกังวลกับมัน?

เมื่อมีคนใช้ jQuery มากขึ้น มันก็ซับซ้อนขึ้นและบางครั้งก็ช้า หากคุณสนับสนุนเฟรมเวิร์กอื่น ปลั๊กอินของคุณจะได้รับความนิยมมากขึ้น
การทำงานซ้ำตั้งแต่เริ่มต้นจะช่วยให้คุณสร้างปลั๊กอินที่ดีขึ้นได้ในอนาคต jQuery และไลบรารี่อื่นๆ ให้อภัยมากสำหรับข้อผิดพลาดเล็กๆ น้อยๆ เช่น เครื่องหมายจุลภาคขาดหายไป ดังนั้นคุณจึงไม่สนใจคุณภาพงานของคุณจริงๆ หากไม่มี JavaScript เพียงอย่างเดียว ฉันรู้สึกดีขึ้นว่าปลั๊กอินของฉันทำงานอย่างไร - สิ่งใดใช้งานได้ สิ่งใดส่งผลต่อประสิทธิภาพ และสิ่งใดที่สามารถปรับปรุงได้

แม้ว่าไลบรารี่อย่าง jQuery จะทำให้ชีวิตของเราง่ายขึ้น แต่การใช้งานนั้นไม่ได้ช่วยได้มากที่สุด วิธีการที่มีประสิทธิภาพบรรลุเป้าหมาย ปลั๊กอินบางตัวสามารถทำได้

บทสรุป.

นี่คือกระบวนการทั้งหมดในการสร้างปลั๊กอิน One Page Scroll มีข้อผิดพลาด แต่ฉันได้เรียนรู้จากพวกเขาในระหว่างการพัฒนา ถ้าฉันกำลังพัฒนามันในวันนี้ ฉันจะมุ่งเน้นไปที่อุปกรณ์พกพาและเพิ่มความคิดเห็นเพิ่มเติมในโค้ด

หากไม่ได้รับการสนับสนุนจากชุมชนเช่น GitHub, StackOverflow และ Smashing Magazine ฉันคงไม่สามารถสร้างปลั๊กอินได้เร็วขนาดนี้ ชุมชนเหล่านี้ช่วยฉันได้มากในการทำงาน ซึ่งเป็นเหตุผลที่ฉันทำให้ปลั๊กอินของฉันใช้งานได้ฟรีสำหรับทุกคน นี่คือวิธีตอบแทนการสนับสนุนที่ยอดเยี่ยมของฉัน

ในบทความสั้นๆ นี้ ผมต้องการแสดงวิธีกำหนดทิศทางการเลื่อนของล้อเลื่อนของเมาส์ ขอบเขตอาจไม่กว้างขวางนัก แต่ฉันเองก็เจอมากกว่าหนึ่งครั้งที่จำเป็น ตัวอย่างเช่น ในการสร้าง "เอฟเฟกต์พารัลแลกซ์" หนึ่งรายการ โดยที่หน้าเว็บไม่ควรเลื่อนจริง ๆ และเอฟเฟกต์นั้นเกิดขึ้นโดยเน้นเฉพาะว่าผู้ใช้หมุนวงล้อของเมาส์หรือไม่และไปในทิศทางใด เป็นไปได้ว่าคุณจะพบแอปพลิเคชันในโครงการของคุณ หากไม่ใช่ตอนนี้ ในอนาคต

ฟังก์ชัน addEvent(elem, type, handler)( if(elem.addEventListener)( elem.addEventListener(type, handler, false); ) else ( elem.attachEvent("on"+type, handler); ) return false; ) ฟังก์ชัน 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("Scroll " + (delta > 0 ? "up" : "down")); )); ) // วางตัวจัดการเหตุการณ์การโหลดเอกสาร - DOM-Ready addEvent(หน้าต่าง, "โหลด", scrollDirection); // สำหรับ jQuery ให้เรียกใช้ฟังก์ชันหลังจากโหลด DOM แล้ว /*$(function()( scrollDirection(); ));*/

สิ่งที่พิเศษในการทาสีฉันไม่เห็นจุด สิ่งเดียวที่สามารถสังเกตได้ด้วยตัวเองก็คือใน กรณีนี้"โดดเด่น" FireFox ด้วยเหตุการณ์ที่ไม่ได้มาตรฐาน "DOMMouseScroll"
เพื่อความเข้าใจและการรับรู้ที่ดียิ่งขึ้น ฉันตัดสินใจสร้างตัวอย่างหนึ่งโดยที่เราถือว่างานต่อไปนี้: เมื่อผู้ใช้แต่ละคนเลื่อน เขาจะต้องไปที่ส่วนถัดไป/ก่อนหน้าของหน้าอย่างชัดเจนโดยไม่ข้าม แม้ว่าเขาจะเลื่อนอย่างเข้มข้นก็ตาม ในขณะเดียวกัน เราจะโหลดเนื้อหาที่เกี่ยวข้องลงในบล็อกปัจจุบัน มาสร้าง HTML และ CSS นี้กัน:

* ( margin: 0; padding: 0; ) #grid li ( list-style: none; height: 300px; border-bottom: 1px dotted #333; ) #fake (height: 5000px;) /* ไปถึงตรงนั้นแน่นอน แถบเลื่อน */

ไปที่ JS กันเถอะ หน้าที่ของเราคือยกเลิกพฤติกรรมปกติของเหตุการณ์การเลื่อนเมาส์ ( โดยพื้นฐานแล้ว - ป้องกันไม่ให้ผู้ใช้เลื่อนหน้าด้วยตนเอง), คำนวณ, ขึ้นอยู่กับทิศทางของวงล้อ, บล็อกถัดไปหรือก่อนหน้า, เลื่อนแบบเคลื่อนไหวไปที่บล็อกนี้และโหลดเนื้อหาที่จำเป็นลงในนั้น

$(function()( var flag = false, // จำเป็นเพื่อป้องกันการกระทำระหว่างแอนิเมชั่น bn = 0, // บล็อกดัชนีบล็อกปัจจุบัน บล็อก = $("#grid li"), // บล็อกทั้งหมด cnt = บล็อก .length, / / จำนวนบล็อก mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel"; // เหตุการณ์การเลื่อนล้อ Blocks.eq(0).load("loadblocks.html #b0") ; // โหลดเนื้อหาลงในบล็อกแรกทันที // ฟังก์ชันกำหนดทิศทางของฟังก์ชันการเลื่อนล้อ getDelta(e)( var evt = e || window.event; evt = evt.originalEvent ? evt.originalEvent: evt; return delta = evt.detail ? evt.detail*(-40) : evt.wheelDelta; ) // catch scroll เหตุการณ์ $(document).on(mousewheelevt+".my_wheel", function(e)( e.preventDefault(); // ยกเลิกพฤติกรรมปกติ (หน้าไม่เลื่อน) if(flag) return false; // if flag == true จากนั้นใน ช่วงเวลานี้ภาพเคลื่อนไหวเกิดขึ้น if(getDelta(e) > 0)( if(bn<= 0) return false; // если дошли до первого блока, то отменяем การดำเนินการต่อไป--พันล้าน; // หากบล็อกไม่ใช่บล็อกแรก ให้คำนวณดัชนีของบล็อกก่อนหน้า ) อื่น ( if(bn >= cnt-1) คืนค่าเท็จ // หากเราไปถึงบล็อกสุดท้าย ให้ยกเลิกการดำเนินการเพิ่มเติม ++bn; // ถ้าบล็อกไม่ใช่บล็อกสุดท้าย เราจะคำนวณดัชนีของบล็อกถัดไป ) flag = true; // ตั้งค่าสถานะเพื่อระบุว่าภาพเคลื่อนไหวเริ่มต้นแล้ว $("html, body").finish().animate(( scrollTop: Blocks.eq(bn).offset().top // เลื่อนหน้าไปที่บล็อก คำนวณโดย index ), 1,000, function()( Blocks.eq(bn).load("loadblocks.html #b" + bn); // โหลดเนื้อหาสำหรับบล็อกแฟล็ก = เท็จ; // ลบแฟล็กแสดงว่า ว่าอนิเมชั่นจบแล้ว )); )); ));

ฉันวาดทุกอย่างในความคิดเห็น แต่ก็ยังคงอธิบายว่าข้อมูลถูกโหลดจากที่ใด ในวิธีการ โหลด ()ไม่เพียง แต่จะระบุเอกสารที่จะโหลดเท่านั้น แต่ยังกำหนดองค์ประกอบที่เราต้องการได้อีกด้วย ในตัวอย่าง ฉันใช้เอกสาร html ปกติที่มีองค์ประกอบหลายอย่าง ( ตามจำนวนบล็อกของเรา) มีรหัสตั้งแต่ "b0" ถึง "b6" เมื่อได้รับดัชนีของบล็อกปัจจุบันแล้ว เราจะโหลดองค์ประกอบที่มีรหัสที่เกี่ยวข้อง

ลอง ทดลอง และที่สำคัญที่สุด อย่าลืมว่าบางสิ่งที่คุณอาจไม่ต้องการในวันนี้อาจช่วยได้มากในวันพรุ่งนี้ และหากคุณมีคำถามหรืองานพิเศษใดๆ ให้เขียนไว้ในกระทู้นี้หรือในส่วน "

เคล็ดลับวันนี้เกี่ยวข้องกับเว็บไซต์ของเราอย่างไร? เมื่อมองแวบแรกไม่มี แต่ถ้าบน Mac ของคุณ ส่วนการบูตค่ายอาศัยอยู่บน Windows คุณอาจสังเกตเห็นแล้วว่า Microsoft ไม่ได้วางแผนที่จะเปลี่ยนทิศทางการเลื่อนของเมาส์และแทร็กแพดและจะไม่ทำ ด้วยเหตุนี้ ปรากฎว่าใน Mac OS X เนื้อหาในหน้าต่างจะเป็นไปตามการเคลื่อนไหวของนิ้ว (เช่น การเลื่อนย้อนกลับ) และใน Windows คุณจะเลื่อนแถบเลื่อนบนหน้าจอและเนื้อหาจะไปที่อื่น ทาง.

โดยทั่วไป หากคุณไม่สามารถเปลี่ยนจากวิธีหนึ่งเพื่อควบคุมเมาส์เป็นอีกวิธีหนึ่งได้ ก็ถึงเวลาที่ต้องดำเนินการขั้นเด็ดขาด มีสองวิธี (ตัวเลือกด้วย ถอนการติดตั้ง Windowsและโอนไปยัง เครื่องเสมือนจะไม่ได้รับการพิจารณา):

  • ปิดใช้งานการเลื่อนย้อนกลับใน Lion หรือ สิงโตภูเขา . สิ่งนี้ทำได้ในการตั้งค่าระบบในรีโมท "Mouse" และ "Trackpad" ตามลำดับ
  • เปิดใช้งานการเลื่อนย้อนกลับในหน้าต่าง. มีพารามิเตอร์ในรีจิสทรีของระบบสำหรับสิ่งนี้อย่างผิดปกติ อย่างไรก็ตามการค้นหามันเป็นการผจญภัยที่แยกต่างหาก

เนื่องจากเราไม่ได้มองหาวิธีที่ง่าย วันนี้เราจะพูดถึงทางเลือกที่สอง - เปิดใช้งานการเลื่อนย้อนกลับใน Windows

ในการเริ่มต้น คุณจะต้องเข้าไป เช่น สามารถทำได้ผ่านแผงควบคุม ใน Dispatcher ดูในส่วน "เมาส์และอุปกรณ์ชี้ตำแหน่งอื่นๆ":

เลือกเมาส์ของคุณจากรายการอุปกรณ์ ดับเบิลคลิก. ไปที่แท็บ "รายละเอียด" ในรายการแบบหล่นลงคุณจะต้องมีรายการ "รหัสฮาร์ดแวร์":

สังเกตว่าบรรทัดแรกเริ่มต้นด้วยตัวอักษร VID (เช่น VID_203A&PID_FFFC&REV_0100&MI_01) จำชุดค่าผสมนี้

บนแป้นพิมพ์ ให้กด Command + R ในหน้าต่างที่เปิดขึ้น ให้พิมพ์ regedit แล้วกด Enter ตัวแก้ไขจะเปิดขึ้น รีจิสทรีของ Windows. เลือกสาขาทางด้านซ้าย HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID. คุณจะเห็นรายการของเมาส์และแทร็คแพดที่ประกอบด้วย VID, PID และ MI คุณจะต้องระบุอุปกรณ์ที่กำหนดเองที่นี่:

ภายในเครื่องคุณจะพบโฟลเดอร์เพิ่มเติมอีกสองสามโฟลเดอร์ ในแต่ละรายการคุณต้องเข้าไปข้างในโฟลเดอร์ Device Parameters และเปลี่ยนค่าของพารามิเตอร์ FlipFlopWheelจาก 0 ถึง 1 หลังจากรีบูต การเลื่อนย้อนกลับจะทำงานใน Windows