domahaflip
Version:
A lightweight and responsive JavaScript library for creating 3D page-flipping effects.
198 lines (161 loc) • 6.22 kB
CSS
/* styles/domahaflip.css (النسخة المطورة) */
.domahaflip-container {
position: relative;
margin: 20px auto;
box-shadow: 0 10px 25px rgba(0,0,0,0.2);
border-radius: 10px;
overflow: hidden;
perspective: 1500px;
transform-style: preserve-3d;
/* ---- بداية التغييرات الجديدة ---- */
width: 90%; /* اجعل العرض 90% من عرض العنصر الأب */
max-width: var(--max-width, 800px); /* حد أقصى للعرض نتحكم به من JS */
aspect-ratio: var(--aspect-ratio, 800 / 500); /* أهم خاصية للحفاظ على شكل الكتاب */
/* لا نحتاج لتحديد الطول (height) بعد الآن، سيتم حسابه تلقائيًا */
/* ---- نهاية التغييرات الجديدة ---- */
}
.domahaflip-page {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
border: 1px solid #ccc;
box-sizing: border-box;
display: flex; /* نجعل كل الصفحات مرئية في طبقات فوق بعضها */
align-items: center;
justify-content: center;
padding: 20px;
font-family: sans-serif;
/* خصائص التقليب والحركة */
transform-origin: left center; /* التقليب من جهة اليسار (مثل الكتاب) */
backface-visibility: hidden; /* إخفاء الوجه الخلفي للصفحة أثناء التقليب */
transition: transform var(--flip-duration, 0.8s) ease-in-out; /* مدة الحركة */
transform-style: preserve-3d;
}
/* هذا الكلاس هو الذي يقوم بفعل التقليب */
.domahaflip-page.flipped {
transform: rotateY(-180deg);
transform: rotateY(-180deg);
/* أضف هذا السطر لإضافة ظل حول الصفحة المتحركة */
box-shadow: 0 5px 20px rgba(0,0,0,0.4);
}
/* تنسيقات المحتوى الداخلي */
.domahaflip-page img {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
.domahaflip-page.text-content {
flex-direction: column;
}
/* ---- بداية كود الظل ---- */
/* إنشاء عنصر الظل الوهمي لكل صفحة وإخفاؤه مبدئيًا */
.domahaflip-page::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/* هذا هو الظل: تدرج شفاف من اليسار لليمين */
background: linear-gradient(to right, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0) 20%);
opacity: 0; /* إخفاء الظل مبدئيًا */
transition: opacity var(--flip-duration, 0.8s); /* حركة ظهور واختفاء الظل */
}
/* * السطر السحري:
* هذا يعني: "عندما يتم قلب صفحة (تأخذ كلاس .flipped)،
* قم بإظهار الظل الخاص بالصفحة التالية لها مباشرة"
*/
.domahaflip-page.flipped + .domahaflip-page::after {
opacity: 1;
}
/* ---- نهاية كود الظل ---- */
/* ---- بداية كود أزرار التنقل ---- */
.domahaflip-nav-button {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 10000;
/* الخصائص "المحصنة" التي تتجاوز إعدادات Tailwind/Bootstrap */
background-color: rgba(0, 0, 0, 0.4);
color: white;
border: none;
padding: 0;
appearance: none; /* الأهم لإلغاء المظهر الافتراضي للزر */
/* باقي الخصائص */
border-radius: 50%;
width: 40px;
height: 40px;
font-size: 20px;
line-height: 40px;
text-align: center;
cursor: pointer;
user-select: none;
opacity: 0;
transition: opacity 0.3s, background-color 0.3s;
}
/* إظهار الأزرار عند تمرير الماوس فوق الحاوية */
.domahaflip-container:hover .domahaflip-nav-button {
opacity: 1;
}
/* تغيير اللون عند تمرير الماوس فوق الزر نفسه */
.domahaflip-nav-button:hover {
background-color: rgba(0, 0, 0, 0.7);
}
/* تحديد مكان كل زر */
.domahaflip-nav-prev {
left: 15px;
}
.domahaflip-nav-next {
right: 15px;
}
/* ---- نهاية كود أزرار التنقل ---- */
/* ---- بداية كود تجاوبية الأسهم ---- */
/* هذه التنسيقات سيتم تطبيقها فقط على الشاشات التي عرضها 480 بكسل أو أقل */
@media (max-width: 480px) {
.domahaflip-nav-button {
/* نجعل الأزرار أصغر حجمًا */
width: 32px;
height: 32px;
/* نضبط حجم الخط ومحاذاته مع الحجم الجديد */
font-size: 16px;
line-height: 32px;
}
/* نقرب الأزرار من الحافة */
.domahaflip-nav-prev {
left: 8px;
}
.domahaflip-nav-next {
right: 8px;
}
}
/* ---- نهاية كود تجاوبية الأسهم ---- */
/* ---- بداية كود مؤشر التحميل ---- */
/* نضيف كلاس جديد للصفحة التي يتم تحميل صورتها */
.domahaflip-page.loading::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 30px;
height: 30px;
margin-top: -15px; /* نصف الارتفاع */
margin-left: -15px; /* نصف العرض */
border-radius: 50%;
border: 3px solid rgba(0, 0, 0, 0.2);
border-top-color: rgba(0, 0, 0, 0.6);
animation: domahaflip-spinner 0.8s linear infinite;
}
@keyframes domahaflip-spinner {
to {
transform: rotate(360deg);
}
}
/* ---- نهاية كود مؤشر التحميل ---- */
/* ---- بداية كود إلغاء الحركة ---- */
/* هذا الكلاس عند إضافته للحاوية، يلغي الحركة مؤقتًا من على الصفحات */
.domahaflip-container.no-transition .domahaflip-page {
transition: none;
}
/* ---- نهاية كود إلغاء الحركة ---- */