ویژگی تصویر

طراحی متن انعکاسی با CSS

  /  CSS   /  طراحی متن انعکاسی با CSS
بنر تبلیغاتی الف

متن انعکاسی (reflective text) یک افکت بصری جذاب است که در هدرها، بنرها و کارت‌های محصول کاربرد دارد. در این مقاله با چند روش پیاده‌سازی انعکاس متن با CSS و راهکارهای سازگاری و بهینه‌سازی آشنا می‌شوید. روش‌ها شامل استفاده از pseudo-elements و -webkit-box-reflect و SVG و ماسک‌های گرادیان هستند.

چرا از متن انعکاسی استفاده کنیم؟

  • افزایش جذابیت بصری برای هدرها و صفحهٔ فرود.
  • جذب توجه به المان‌های مهم مانند نام محصول یا شعار.
  • امکان کنترل آسان با CSS بدون افزودن تصاویر سنگین.

ملاحظات کاربردی

انعکاس باید محتاطانه استفاده شود: در رابط‌های کاری یا اپلیکیشن‌های پیچیده اثرهای تزئینی می‌تواند مزاحم شود. همچنین توجه به خوانایی، دسترس‌پذیری و عملکرد ضروری است.

روش اول: -webkit-box-reflect (ساده اما اختصاصی)

/* Works only in WebKit-based browsers */.reflect {
  font-size: 48px;
  color: #222;
  -webkit-box-reflect: below 0px linear-gradient(transparent, rgba(255,255,255,0.5));
}

این روش با یک خط CSS شدت زیادی دارد و در مرورگرهای مبتنی بر WebKit (Chrome/Safari در گذشته) کار می‌کند. محدودیت: پشتیبانی ناقص در سایر مرورگرها و رفتارهای ناسازگار در نسخه‌های جدید.

بهبود و جایگزین کراس-براوزری با pseudo-element

.reflect {
  position: relative;
  display: inline-block;
  font-size: 48px;
  color: #222;
}

.reflect::after {
  content: attr(data-text);
  position: absolute;
  left: 0;
  top: 100%;
  transform: scaleY(-1);
  opacity: 0.6;
  background: linear-gradient(to bottom, rgba(255,255,255,0), rgba(255,255,255,0.9));
  -webkit-mask-image: linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0));
  mask-image: linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0));
  pointer-events: none;
}

این کد از ::after برای ایجاد کپی آینه‌ای متن استفاده می‌کند و با transform: scaleY(-1) آن را برعکس می‌کند. ماسک گرادیان باعث می‌شود انعکاس تدریجاً محو شود. این روش در بیشتر مرورگرهای مدرن پشتیبانی خوبی دارد و قابل کنترل‌تر است.

روش دوم: استفاده از SVG برای انعکاس دقیق و قابل تنظیم

<svg width="500" height="120" viewBox="0 0 500 120">
  <defs>
    <linearGradient id="fade" x1="0" x2="0" y1="0" y2="1">
      <stop offset="0" stop-color="white" stop-opacity="0.6"/>
      <stop offset="1" stop-color="white" stop-opacity="0"/>
    </linearGradient>
    <mask id="m">
      <rect x="0" y="0" width="500" height="120" fill="url(#fade)"/>
    </mask>
  </defs>

  <text x="10" y="40" font-size="36" fill="#222">نمونه متن</text>

  <g transform="translate(0,80) scale(1,-1)" mask="url(#m)" opacity="0.7">
    <text x="10" y="40" font-size="36" fill="#222">نمونه متن</text>
  </g>
</svg>

SVG امکان کنترل رنگ، ماسک و فیلترهای پیچیده را می‌دهد و برای طرح‌هایی که نیاز به دقت بالاتری دارند مناسب است. همچنین SVG در همه مرورگرهای مدرن پشتیبانی می‌شود و برای مقیاس‌پذیری عالی است.

جدول مقایسه روش‌ها

روشپشتیبانیکنترل‌پذیریعملکرد
-webkit-box-reflectمتوسط (WebKit)کمخوب
Pseudo-element + maskخوب (مرورگرهای مدرن)بالاخوب
SVGعالیخیلی بالاخوب/عالی

نکات دسترس‌پذیری و سئو

انعکاس صرفاً یک جلوهٔ بصری است؛ محتوا باید بدون آن هم خوانا و قابل دسترس باشد. برای متن‌های مهم از عنصر <h1> یا متن قابل خواندن استفاده کنید و انعکاس را با CSS تزئینی نگه دارید. از aria-hidden="true" روی المان‌های انعکاسی استفاده کنید تا صفحه‌خوان‌ها آن‌ها را نادیده بگیرند.

نمونهٔ کامل قابل استفاده و واکنش‌گرا

.hero-title {
  position: relative;
  font-size: clamp(28px, 6vw, 64px);
  color: #111;
  display: inline-block;
}

.hero-title::after {
  content: attr(data-text);
  position: absolute;
  left: 0;
  top: 100%;
  transform: scaleY(-1);
  opacity: 0.5;
  width: 100%;
  pointer-events: none;
  background: linear-gradient(to bottom, rgba(255,255,255,0), rgba(255,255,255,0.95));
  mask-image: linear-gradient(to bottom, rgba(0,0,0,0.9), rgba(0,0,0,0));
}

در این نسخه از clamp() برای واکنش‌گرایی اندازهٔ متن استفاده شده و ماسک گرادیان باعث محوشدن مناسب انعکاس می‌شود. این الگو برای هدرها و بخش‌های قهرمان (hero) مناسب است.

بهینه‌سازی عملکرد و تست

  • افکت‌ها را فقط روی المان‌های مورد نیاز اعمال کنید تا رندرهای اضافی کاهش یابد.
  • در دستگاه‌های موبایل یا مرورگرهای ضعیف، افکت را با یک کلاس شرطی غیرفعال کنید.
  • ترکیب ماسک و transform معمولاً روی GPU اجرا می‌شود؛ از تغییرات layout (مثل تغییر width/height) در انیمیشن‌ها پرهیز کنید.

نتیجه‌گیری و توصیه‌های عملی

برای بیشترین سازگاری و کنترل، استفاده از pseudo-element با ماسک گرادیان یا SVG بهترین راه است. از -webkit-box-reflect فقط برای پشتیبانی تکمیلی استفاده کنید و همواره به دسترس‌پذیری و عملکرد توجه نمایید. انعکاس زمانی بیشتر تاثیرگذار است که ساده و نرم باشد — نه بیش از حد برجسته.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: