برنامه نویسی

ایجاد یک پنجره مودال مدرن از ابتدا: یک راهنمای گام به گام



ایجاد یک پنجره مودال مدرن از ابتدا: یک راهنمای گام به گام-جامعه Dev























tag:


id="modalOverlay" class="modal-overlay">
class="modal" role="dialog" aria-labelledby="modalTitle" aria-modal="true">
class="modal-content">

class="modal-header">

id="modalTitle" class="modal-title">Modal Title

class="modal-body"> This is a fully responsive modal popup with smooth animations. It's built with HTML, CSS, and vanilla JavaScript. The modal can be closed by:
    style="margin-left: 1.5rem; margin-top: 0.5rem;">
  • Clicking the close button
  • Clicking outside the modal
  • Pressing the Escape key

class="modal-footer">

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بگذارید ساختار را توضیح دهم:

  1. ما بیرونی داریم modal-overlay DIV که کل صفحه را در بر می گیرد و به عنوان زمینه ما عمل می کند.
  2. در داخل آن ، ما modal DIV که حاوی محتوای واقعی ما است.
  3. معین به سه بخش تقسیم می شود: هدر ، بدن و پاورقی.
  4. به ویژگی های دسترسی توجه کنید: role="dialog"با aria-labelledbyوت aria-modal="true"بشر اینها برای خوانندگان صفحه نمایش بسیار مهم است.

در این مرحله ، اگر پرونده HTML را در یک مرورگر باز کنید ، عنوان و دکمه را مشاهده خواهید کرد ، اما معین هنوز سبک یا کاربردی نخواهد بود. بیایید آن را برطرف کنیم!

اضافه کردن CSS برای یک ظاهر جلا

حال بیایید سبکی را به معین خود اضافه کنیم. در section of our HTML, let’s add a tag:


  :root {
    --primary: #6d28d9;
    --primary-light: #8b5cf6;
    --dark: #1f2937;
    --light: #f9fafb;
    --gray: #6b7280;
    --border: #e5e7eb;
    --shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
    --transition: 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
  }

  * {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }

  body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
    line-height: 1.6;
    color: var(--dark);
    background-color: var(--light);
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 2rem;
  }

  .container {
    max-width: 800px;
    width: 100%;
    text-align: center;
  }

  h1 {
    font-size: 2.5rem;
    margin-bottom: 1.5rem;
    color: var(--primary);
  }

  p {
    margin-bottom: 2rem;
    color: var(--gray);
  }

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من همیشه با متغیرهای CSS شروع می کنم زیرا آنها حفظ یک طرح رنگی مداوم را بسیار ساده تر می کنند. ما همچنین برخی از یک ظاهر طراحی اساسی برای صفحه را تنظیم کرده ایم.

حال ، بیایید سبک ها را برای دکمه ما اضافه کنیم:

/* Button Styles */
.btn {
  display: inline-block;
  background-color: var(--primary);
  color: white;
  font-weight: 600;
  font-size: 1rem;
  padding: 0.75rem 1.5rem;
  border-radius: 0.375rem;
  border: none;
  cursor: pointer;
  transition: var(--transition);
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}

.btn:hover {
  background-color: var(--primary-light);
  transform: translateY(-2px);
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
}

.btn:focus {
  outline: 2px solid var(--primary-light);
  outline-offset: 2px;
}

.btn:active {
  transform: translateY(0);
}

.btn-secondary {
  background-color: white;
  color: var(--dark);
  border: 1px solid var(--border);
}

.btn-secondary:hover {
  background-color: var(--light);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من یک اثر شناور ظریف اضافه کردم که دکمه را کمی بلند می کند و سایه را تقویت می کند. این به کاربران بازخورد فوری می دهد که این عنصر تعاملی است.

اکنون ، بیایید مدال و روکش خود را سبک کنیم:

/* Modal Styles */
.modal-overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  backdrop-filter: blur(3px);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--transition), visibility var(--transition);
}

.modal-overlay.active {
  opacity: 1;
  visibility: visible;
}

.modal {
  background-color: white;
  border-radius: 0.5rem;
  box-shadow: var(--shadow);
  width: 90%;
  max-width: 500px;
  max-height: 90vh;
  overflow-y: auto;
  padding: 2rem;
  position: relative;
  transform: scale(0.9);
  opacity: 0;
  transition: transform var(--transition), opacity var(--transition);
}

.modal-overlay.active .modal {
  transform: scale(1);
  opacity: 1;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چند مورد مهم در اینجا اتفاق می افتد:

  1. روکش ثابت است و کل صفحه را پوشش می دهد.
  2. ما استفاده می کنیم opacity: 0 وت visibility: hidden برای پنهان کردن معین در ابتدا.
  3. وقتی .active کلاس اضافه می شود ، معین با یک انتقال صاف قابل مشاهده می شود.
  4. ما استفاده می کنیم transform: scale(0.9) برای ایجاد اثر “پاپ” هنگام باز شدن معین.

بیایید با یک ظاهر طراحی شده اجزای داخلی مودال ادامه دهیم:

.modal-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 1.5rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--border);
}

.modal-title {
  font-size: 1.5rem;
  font-weight: 700;
  color: var(--dark);
}

.modal-close {
  background: none;
  border: none;
  cursor: pointer;
  width: 2rem;
  height: 2rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  transition: background-color var(--transition);
}

.modal-close:hover {
  background-color: var(--border);
}

.modal-close:focus {
  outline: 2px solid var(--primary-light);
  outline-offset: 2px;
}

.modal-close-icon {
  width: 1.25rem;
  height: 1.25rem;
  position: relative;
}

.modal-close-icon::before,
.modal-close-icon::after {
  content: '';
  position: absolute;
  width: 100%;
  height: 2px;
  background-color: var(--gray);
  top: 50%;
  left: 0;
}

.modal-close-icon::before {
  transform: rotate(45deg);
}

.modal-close-icon::after {
  transform: rotate(-45deg);
}

.modal-body {
  margin-bottom: 1.5rem;
}

.modal-footer {
  display: flex;
  justify-content: flex-end;
  gap: 0.75rem;
  padding-top: 1rem;
  border-top: 1px solid var(--border);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من یک نماد “X” سفارشی برای دکمه بستن با استفاده از عناصر شبه CSS ایجاد کرده ام. این تکنیکی است که من دوستش دارم زیرا درخواست های HTTP را کاهش می دهد و کنترل کاملی را بر روی یک ظاهر طراحی می کند.

حال ، اجازه دهید برخی از انیمیشن ها را اضافه کنیم تا حالت معین ما جلا تر شود:

/* Animation for modal content */
@keyframes fadeIn {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.modal-content {
  animation: fadeIn 0.5s ease-out forwards;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این انیمیشن باعث می شود که محتوای داخل مودال محو شود و با باز شدن معین ، اندکی بکشید.

در آخر ، بیایید مطمئن شویم که معین ما در صفحه های کوچکتر پاسخگو است:

/* Responsive adjustments */
@media (max-width: 640px) {
  .modal {
    padding: 1.5rem;
  }

  .modal-footer {
    flex-direction: column;
  }

  .modal-footer .btn {
    width: 100%;
  }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در دستگاه های تلفن همراه ، دکمه های پاورقی را به صورت عمودی جمع می کنیم تا فضای بیشتری به آنها بدهیم.

افزودن عملکرد JavaScript

اکنون که معین ما عالی به نظر می رسد ، بیایید آن را کاربردی کنیم. اضافه کردن a

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا