افکت گسترش متن با CSS
افکت گسترش متن یا Text Expand یکی از جلوههای ظریف و کارآمد در طراحی رابط کاربری است که میتواند توجه کاربر را جلب کرده و تجربه دیداری را بهبود بخشد. در این مقاله روشهای مختلف پیادهسازی افکت گسترش متن، نکات دسترسی، بهینهسازی عملکرد و مثالهای عملی با CSS صرف را بررسی میکنیم.
چرا از افکت گسترش متن استفاده کنیم؟
- جلب توجه: مناسب برای تیترها و کال-تو-اکشنها.
- تعامل: تجربه کاربری غنیتر بدون نیاز به اسکریپت.
- سبک و سریع: با استفاده از transform و opacity، بهترین عملکرد را دارد.
قواعد کلی و بهترین شیوهها
- اگر ممکن است از transform (مثل scaleX) برای انیمیشن استفاده کنید تا layout بازآرایی نشود.
- برای کاربران با ترجیح کاهش حرکات از prefers-reduced-motion پیروی کنید.
- متن اصلی را در DOM نگه دارید تا خوانایی صفحهخوان حفظ شود؛ از جایگزینهای aria در صورت لزوم استفاده کنید.
مثال 1 — گسترش ساده با transform: scaleX
.expand-text {
display: inline-block;
transform-origin: left center;
transform: scaleX(0);
transition: transform 350ms cubic-bezier(.2,.9,.2,1);
white-space: nowrap;
}
.expand-text.open {
transform: scaleX(1);
}این کد یک متن را با استفاده از transform: scaleX از وضعیت جمع شده (0) به وضعیت کامل (1) گسترش میدهد. advantage این روش این است که transform باعث repaint میشود نه reflow، در نتیجه عملکرد بهتری دارد. برای استفاده، کلاس .open را روی عنصر اضافه کنید (مثلاً در hover یا با جاوااسکریپت).
مثال HTML برای مثال 1
<button class="btn">
<span class="expand-text">نمایش بیشتر</span>
</button>
/* هنگام هاور یا فعال شدن: */.btn:hover .expand-text { transform: scaleX(1); }در این نمونه متن داخل یک span قرار دارد و هنگام هاور روی دکمه، کلاس تغییر نمیکند بلکه حالت هاور باعث تغییر transform میشود که ساده و بدون جاوااسکریپت است.
مثال 2 — افکت افشا (reveal) با clip-path
.reveal {
display: inline-block;
-webkit-clip-path: inset(0 100% 0 0);
clip-path: inset(0 100% 0 0);
transition: clip-path 400ms ease;
}
.reveal.open {
-webkit-clip-path: inset(0 0% 0 0);
clip-path: inset(0 0% 0 0);
}clip-path اجازه میدهد قسمتهایی از عنصر مخفی یا نمایان شوند. این روش به خصوص برای افکتهای دقیق و سینمایی مناسب است. توجه داشته باشید که در برخی مرورگرهای قدیمی پشتیبانی کامل ندارد و باید فَلوبَک (fallback) در نظر بگیرید.
مثال 3 — گسترش حرف به حرف (staggered) با متغیرهای CSS
.word { display: inline-block; }
.word span {
display: inline-block;
transform: translateY(10px);
opacity: 0;
transition: transform 350ms cubic-bezier(.2,.9,.2,1), opacity 350ms;
transition-delay: calc(var(--i) * 40ms);
}
.word.open span {
transform: translateY(0);
opacity: 1;
}این الگو هر حرف را درون یک span قرار میدهد و با استفاده از متغیر CSS --i تأخیر واکنش (stagger) ایجاد میکند. برای اضافه کردن شماره به هر حرف میتوان هنگام چاپ سرور یا با جاوااسکریپت ساده مقادیر --i را تنظیم کرد. این روش افکت گسترش زیبا و قابل تنظیمی تولید میکند.
نمونه HTML برای مثال 3
<h1 class="word">
<span style="--i:0">گ</span>
<span style="--i:1">س</span>
<span style="--i:2">س</span>
</h1>هر span نماینده یک حرف است و با تغییر کلاس به .open انیمیشنها به ترتیب اجرا میشوند. این تکنیک بدون کتابخانه خارجی و تنها با CSS پیادهسازی میشود.
نکات دسترسی (Accessibility)
- متن همیشه در DOM حفظ شود؛ از مخفیسازی کامل برای صفحهخوانها پرهیز کنید.
- برای کاربران با کاهش حرکت در تنظیمات سیستم از
@media (prefers-reduced-motion: reduce)استفاده کنید و انیمیشن را کوتاه یا غیرفعال کنید. - در صورت استفاده از انیمیشن طولانی، کنترلهای قابل دسترس (مثلاً توقف یا پخش) ارائه دهید.
عملکرد و بهینهسازی
- ترجیحاً از transform و opacity استفاده کنید تا از paint و layout زیاد جلوگیری شود.
- برای عناصر انیمیشندار از
will-change: transformمحتاطانه استفاده کنید (برای مدت طولانی روی تعداد زیاد از آن استفاده نکنید). - انیمیشنهای پیچیده را روی لایههای کمتر و عناصر کمتر اعمال کنید تا GPU استفاده شود و فریمریت بالاتری حاصل گردد.
پشتیبانی مرورگر و fallback
| ویژگی | پشتیبانی عمومی |
|---|---|
| transform (scaleX) | تقریباً تمام مرورگرهای مدرن و موبایل |
| clip-path | مرورگرهای مدرن خوب؛ در نسخههای قدیمی نیاز به fallback |
| CSS variables | مرورگرهای جدید پشتیبانی میکنند؛ IE11 فاقد پشتیبانی است |
نمونه بهینهشده و کامل (ترکیبی)
.headline {
display: inline-block;
transform-origin: left center;
transform: scaleX(0);
transition: transform 360ms cubic-bezier(.2,.9,.2,1);
will-change: transform;
}
.headline.open { transform: scaleX(1); }
@media (prefers-reduced-motion: reduce) {
.headline { transition: none; transform: none; }
}این نمونه ترکیبی از بهترین روشهاست: استفاده از transform برای عملکرد بهتر، will-change برای hint به مرورگر، و عطف به prefers-reduced-motion برای احترام به تنظیمات کاربر.
موارد کاربرد (Use Cases)
- تیترهای صفحه اصلی و هدینگهای مهم
- دکمهها و لینکهای دعوت به اقدام
- افکتهای ورود صفحه (page intro) یا بخشهای hero
- نمایش مرحلهای متن در اسلایدها یا کاروسلها
جمعبندی و توصیههای نهایی
افکت گسترش متن با CSS ابزار قدرتمندی برای بهبود تجربه کاربری است. با انتخاب مناسب ویژگیها (مثل transform و clip-path)، رعایت نکات دسترسی و بهینهسازی عملکرد، میتوانید افکتهایی جذاب و روان ایجاد کنید. همیشه تست در مرورگرها و تنظیمات مختلف کاربر را فراموش نکنید.
آیا این مطلب برای شما مفید بود ؟




