پویانمایی عناصر به اندازههای پویا مانند block-size: auto یا inline-size: max-content در گذشته به جاوا اسکریپت یا هکهای شکننده «max-height» نیاز داشت. ویژگی interpolate-size و تابع calc-size() به مرورگر اجازه میدهند تا بهطور بومی بین طولهای ثابت و کلیدواژههای اندازهگذاری ذاتی درونیابی کند.
مراحل پیادهسازی
- موافقت با درونیابی کلیدواژه:
interpolate-size: allow-keywordsرا روی عنصر اصلی (معمولاً:root) اعمال کنید تا انتقالها برای ویژگیهایی که از کلیدواژههای ذاتی استفاده میکنند فعال شود. - تعریف کردن گذار: یک
transitionبرای ویژگی اندازهگذاری (مثلاًblock-size،inline-size) در عنصر هدف تنظیم کنید. - استفاده از کلیدواژههای ذاتی: ویژگی اندازهگذاری را درطول تعامل (مثلاً
:hoverیا کلاس حالت) به کلیدواژه ذاتی پشتیبانیشده (auto،min-content،max-content،fit-content، یا (برای flex-basis)content) تغییر دهید. - انجام محاسبات (اختیاری): اگر لازم است محاسبات ریاضی را روی اندازه ذاتی انجام دهید (مثلاً
auto + 2rem)، ازcalc-size()استفاده کنید.calc-size()همچنین از کلیدواژهanyبرای محاسبات مستقل از پایه پشتیبانی میکند.
مثال: الگوی گسترش عمومی
میتوانید این الگو را برای هر محتوی (مانند بخش «نمایش بیشتر» یا منو پیمایش) اعمال کنید تا بین ارتفاع محدودشده و اندازه طبیعی عنصر انتقال ایجاد کنید.
/* Opt-in globally for all children */
:root {
/* MANDATORY: Transitions to intrinsic keywords are disabled by default for compatibility */
interpolate-size: allow-keywords;
}
.expandable-container {
/* 1. Define a fixed initial size (or 0) and hide overflow */
block-size: 100px;
overflow: hidden;
/* 2. Transition the sizing property */
transition: block-size 0.4s ease-out;
}
.expandable-container.is-expanded {
/* 3. Smoothly animate to the intrinsic natural height */
block-size: auto;
}
مثال: Calculated Intrinsic Inline-Size
.badge {
inline-size: 40px;
overflow: hidden;
white-space: nowrap;
transition: inline-size 0.3s ease;
}
.badge:hover {
/* calc-size(basis, calculation) */
/* 'size' refers to the evaluated basis (max-content in this case) */
inline-size: calc-size(max-content, size + 20px);
}
مثال: انتقال از ذاتی به ثابت
همچنین میتوانید در جهت مخالف پویانمایی کنید—از اندازه طبیعی شروع کنید و به طول مشخصی جمع کنید. این برای مؤلفههای «قابلبستن» مفید است.
.collapsible-alert {
/* 1. Start with the natural content height */
block-size: auto;
overflow: hidden;
transition: block-size 0.5s ease-in-out, opacity 0.5s ease;
}
.collapsible-alert.is-dismissed {
/* 2. Smoothly collapse to zero */
block-size: 0;
opacity: 0;
pointer-events: none;
}
/* MANDATORY Copy-Paste Safety: Disable sizing animations for sensitive users */
@media (prefers-reduced-motion: reduce) {
.expandable-container,
.badge,
.collapsible-alert {
transition: none !important;
}
}
// MANDATORY Accessibility Synchronization: Ensure elements collapsed to zero dimensions are removed from the assistive technology tree, and sync aria-expanded states on triggers.
const alertElement = document.querySelector('.collapsible-alert');
alertElement.addEventListener('transitionend', (e) => {
if (e.propertyName === 'block-size' && alertElement.classList.contains('is-dismissed')) {
alertElement.hidden = true;
}
});
// Example trigger syncer
const triggerBtn = document.querySelector('.accordion-trigger');
triggerBtn?.addEventListener('click', () => {
const isExpanded = triggerBtn.getAttribute('aria-expanded') === 'true';
triggerBtn.setAttribute('aria-expanded', !isExpanded);
});
محدودیتهای کلیدی
- محدودیت کلیدواژه به کلیدواژه: نمیتوانید مستقیماً بین دو کلیدواژه مختلف پویانمایی کنید (مثلاً از
min-contentبهmax-content). یک طرف گذار باید طول یا درصد ثابتی داشته باشد (مثلاً0بهauto). - نحو Calc-size: در
calc-size()، نمیتوانید کلیدواژههای ذاتی مختلف را در یک عبارت ترکیب کنید. آرگومان اول (مبنا) تعریف میکند کهsizeنشاندهنده چیست. - الزام موافقت: انتقال به کلیدواژههای ذاتی بهطور پیشفرض غیرفعال است (
numeric-only) تا سازگاری با نسخه قدیمی حفظ شود. بایدinterpolate-size: allow-keywordsرا روی عنصر یا عنصر والد اعمال کنید.calc-size()بهعنوان یک لغوکننده برای هر ویژگی عمل میکند و هر زمان که استفاده شود، بهطور خودکار درونیابی را فعال میکند.
راهبردهای جایگزین
interpolate-size و calc-size() ارتقای پیشرو هستند. مرورگرهایی که از آنها پشتیبانی نمیکنند، پرش فوری به اندازه هدف را انجام خواهند داد.
- تنزل متین: برای انتقالهای ساده
block-size: auto، مرورگرهای استاندارد بهسادگی اندازه را فوراً تغییر میدهند که کاربردی است اما کمتر صیقلخورده است. - جایگزینهای کلیدواژه دستی: هنگام استفاده از
calc-size()، همیشه یک جایگزین کلیدواژه استاندارد برای مرورگرهای قدیمیتر ارائه دهید، زیرا آنها کل اعلانcalc-size()را نادیده میگیرند.
.card {
block-size: auto; /* Fallback for older browsers */
block-size: calc-size(auto, size); /* Modern browsers use this */
transition: block-size 0.3s ease;
}