تأثير تشغيل الصفحة الواقعية على JS

أقدم انتباهكم - أحد الخيارات الممكنة لتنفيذ خدعة مضحكة إلى حد ما لإنشاء تأثير تقليب الصفحة الواقعي.



عرض
Github التوضيحي والتوثيق ،

قمت بتطبيق تأثير مماثل لفترة طويلة ، في الجامعة وفي دلفي. اتضح أنه يستحق ذلك ، على الرغم من أنني قضيت الكثير من الوقت بعد ذلك. الآن - خلال فترة العزلة الذاتية ، أصبح من المثير للاهتمام تنفيذ شيء مشابه على JS ، للكمبيوتر الشخصي والأجهزة المحمولة.

بصراحة ، لست متأكدًا من قابلية التطبيق العملي لهذا التأثير ، وأعتقد أنه في معظم الحالات - لا يوجد أفضل من تغيير بسيط للصور بدون أي رسوم متحركة. ولكن من الممكن تمامًا استخدام ، على مواقع المطاعم ، لنشر قائمة (ولكن الأهم من ذلك - سيتم تكرارها بجوار الرابط!).

كل شيء مكتوب بخط مطبوع. لم يتم استخدام مكتبات الطرف الثالث. لا توجد تبعيات.

ميزات المكتبة الرئيسية


  • يعمل مع كل من الصور البسيطة ، مع العرض على قماش ، ومع كتل HTML - باستخدام تحويلات css
  • نظام تكوين مرن جدًا وواجهة برمجة تطبيقات بسيطة
  • يدعم الأجهزة المحمولة
  • تغيير الاتجاه التلقائي بين الوضع الرأسي والأفقي

تم كتابة الرمز بعين فقط على ES6 + ، والنظام المعياري أيضًا ES6. دعم المتصفح في المتوسط ​​90٪ بناءً على caniuse.com.

التركيب


التثبيت ممكن من npm:

npm install page-flip

أو قم بتنزيل الملفات التي تم جمعها من المستودع.

قد يكون خيار التهيئة الأساسي للمكتبة كالتالي:

<div id="book">
    <div class="my-page">
        Page one
    </div>
    <div class="my-page">
        Page two
    </div>
    <div class="my-page">
        Page three
    </div>
    <div class="my-page">
        Page four
    </div>
</div>

import {PageFlip} from 'page-flip';
const pageFlip = new PageFlip(document.getElementById('book'),
    {
        width: 400, // required parameter - base page width
        height: 600  // required parameter - base page height
    }
);

pageFlip.loadFromHTML(document.querySelectorAll('.my-page'));

يمكن العثور على وصف ومواصفات API أكثر تفصيلاً على الرابط أعلاه.
أريد أن أتحدث عن بعض المشاكل والفروق الدقيقة التي واجهتها أثناء التطوير.

العمليات الحسابية


أول شيء يمكن الحديث عنه هو نموذج رياضي. من حيث المبدأ ، جميع الحسابات تافهة جدًا ، لكنها استغرقت الكثير من الوقت.

المهمة الرئيسية التي تحتاج إلى حل هي تحديد زاوية تحول الصفحة. لنلق نظرة على الصورة التالية: تشير



النقطة "أ" إلى نقطة اللمس الحالية في الكتاب. بناءً على موقف هذه النقطة - من الضروري إجراء المزيد من الحسابات.

لتحديد الزاوية - من الضروري حساب قيمتين - المسافة من النقطة A إلى الحدود العليا واليمنى للكتاب. في الصورة أدناه ، يشار إليها بواسطة T و L ، على التوالي.



G هو قطري الزاوية ، يمكن حسابه بواسطة نظرية فيثاغورس.

ونتيجة لذلك ، لحساب دوران الصورة ، يمكنك استخدام الصيغة التالية: angle = - 2 * acos (L / G) ، والأهم من ذلك ، لا تنس أن نقطة التحول في هذه الحالة هي الزاوية اليسرى العليا من الصفحة.

بعد حساب الزاوية - يبقى الجزء الأكثر استهلاكا للوقت - هذا هو حساب رؤية الصفحة. ما يجب أن يكون ضروريًا على ما يبدو للمغادرة ، والباقي ، على التوالي - للتقليم.

أولاً ، تحتاج إلى العثور على نقاط تقاطع الصفحة المراد قلبها بحدود الكتاب. في الأشكال يشار إليها بالنقطتين B و C.



فعلت ذلك بأبسط الطرق وأكثرها تعقيدًا - في الجبين. قام ببناء معادلات الخطوط بنقطتين ، ثم بحث عن نقطة تقاطعها.

بعد العثور على جميع نقاط التقاطع ، نحدد رؤوس منطقة الرؤية - وفي هذه النقاط نقوم بالفعل بتقليم الصفحة المراد قلبها.



في الأساس ، كل الرياضيات هنا تنقسم إلى شيئين:

  • حساب زاوية التحول
  • حساب رؤية الصفحة

يعتمد التظليل بالفعل على الحسابات التي تم إجراؤها مسبقًا.

الآن دعنا ننتقل إلى بعض النقاط التي كان علينا مواجهتها أثناء التنفيذ.

إن الخوارزمية العامة بسيطة للغاية وتنقلب إلى صفحة التقليب والاقتصاص.

في حالة القماش والصور البسيطة ، كل شيء بسيط جدًا. بعد إجراء الحسابات ، يتم استخدام طرق سياق اللوحة ثنائية الأبعاد مثل الترجمة والتدوير والمقطع.
مع كتل أتش تي أم أل أكثر تعقيدا. وإذا لم تكن هناك مشكلة في الدوران - بفضل تحويلات css ، فقد اتضح أن اقتصاص كل شيء أسوأ قليلاً.

ونتيجة لذلك ، كانت أسهل طريقة هي استخدام خصائص مسار المقطع وخصائص css للشكل - المضلع. ولكن قبل تعيين رؤوس المضلع للاقتصاص ، من الضروري تحويل إحداثيات النقاط من اللوحة "العالمية" - إلى المحلية ، نسبة إلى عنصر html. يتم حل ذلك من خلال التطبيق العكسي لمصفوفة الدوران ، مع التحول بالنسبة لموضع العنصر.

كانت المشكلة الأخرى هي تحجيم الكتاب ووضعه تلقائيًا. لقد حاولت حل هذا باستخدام كائن التكوين ، الذي يتم تمريره أثناء الإنشاء. ولكن في النهاية ، كان هناك عدد قليل جدًا من المعلمات ، وتبين أنها ليست مريحة تمامًا وغير واضحة.

لقد استخدمت Webpack لأول مرة للتجميع ، ولكن في النهاية قررت تجربة rollup.js ، وفوجئت بالرمز النهائي. لا يزال Webpack باقًا ، نظرًا لأنه يتعامل مع التجميع بسرعة فائقة عدة مرات ، وهو أكثر ملاءمة أثناء التطوير.

يسعدني سماع التعليقات والاقتراحات لمواصلة تطوير المكتبة.

All Articles