گذار و پویانمایی
حرکت به کاربر میگوید چه چیزی تازه عوض شد: دکمهای که بالا میآید، پنلی که باز میشود، نشانگری که میچرخد. CSS همهی اینها را بیهیچ برنامهای انجام میدهد. این درس از سادهترین حالت، گذار هنگام اشاره، شروع میکند و از دگرگونیها و سهبعدی میگذرد تا به پویانمایی با قابهای کلیدی، پویانماییای که پیمایش میراندش، و حقی که کسانی که حرکت نمیخواهند دارند برسد.
گذار
بدون گذار، ویژگی در یک قاب عوض میشود: کارتی که اشارهاش کردهاید ناگهان پایینتر است، دکمهای ناگهان سرخ. گذار (transition) به مرورگر میگوید از مقدار قدیم تا جدید را در مدتی بپیماید. هر وقت مقدار عوض شود اجرا میشود، به هر دلیل: اشاره، تمرکز یا کلاسی که برنامه جابهجایش میکند. ویژگی گذار میانبُر چهار چیز به این ترتیب است: ویژگیای که پویانمایی میشود، مدت، تابع زمانبندی و تأخیر. چند گذار را با ویرگول از هم جدا میکنند.
صفحه:
عنوان = "گذار هنگام اشاره"
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 30 پس زمینه = "#f1f5f9" پایان
جعبه:
عرض = 240
فاصله = 20
پس زمینه = white
گردی کادر = 12
سایه کادر = "0 1px 3px rgba(0, 0, 0, 0.25)"
گذار = "transform 200ms ease-out, box-shadow 200ms ease-out"
اشاره دگرگونی = "translateY(-6px)"
اشاره سایه کادر = "0 14px 24px rgba(0, 0, 0, 0.25)"
سرتیتر: اندازه = 3 فضا = "0 0 8" محتوا = "موشواره را بیاورید" پایان
پاراگراف: فضا = 0 محتوا = "کارت بالا میآید و سایهاش در ۲۰۰ میلیثانیه بزرگ میشود." پایان
پایان
پایانکارت حرکت میکند و سایهاش بزرگ میشود، هر کدام در ۲۰۰ میلیثانیه با ease-out که تند شروع میکند و آرام تمام میشود. گذار را روی حالت عادی بگذارید نه روی حالت اشاره: آنوقت کارت وقتی اشارهگر میرود هم نرم برمیگردد. ویژگیهای تکی هر کدام یک بخش را میگیرند: ویژگی گذار نام ویژگیها را میگوید (all یعنی همه، که راحت است و هدردهنده، پس آنچه را میخواهید فهرست کنید)، مدت گذار زمانی مثل 200ms یا 0.3s است، تاخیر گذار پیش از شروع صبر میکند و تابع زمانبندی گذار منحنی سرعت است.
منحنی مهمتر از آن است که بیشتر مردم فکر میکنند. linear سرعت ثابت است و مکانیکی به نظر میرسد. ease پیشفرض است، ease-in آهسته شروع میکند، ease-out آهسته تمام میکند و به چیزهایی که میرسند میخورد، و ease-in-out هر دو را دارد. cubic-bezier(x1, y1, x2, y2) منحنی خودتان را میکشد، و وقتی y از ۱ بالاتر یا از ۰ پایینتر برود حرکت از مقصد رد میشود و برمیگردد. steps(n) در n جهش پیش میرود، مثل عقربهی ساعت، و پایهی پویانماییهای اسپرایت است. «اجرا» را بزنید تا پنجتایشان را کنار هم ببینید.
واردسازی دام
تابع اجرا():
دام.تعویض کلاس(دام.با شناسه("lanes"), "go")
پایان
بخش مسیر(شیوه):
جعبه:
کلاس = "track"
موقعیت = relative
ارتفاع = 28
فضا = "6 0"
پس زمینه = "#e2e8f0"
گردی کادر = 14
جعبه: عرض = 28 ارتفاع = 28 گردی کادر = 14 پس زمینه = "#0f766e" گذار = "transform 1.5s " + شیوه پایان
پاراگراف: موقعیت = absolute بالا = 4 چپ = 40 فضا = 0 اندازه قلم = 13 محتوا = شیوه پایان
پایان
پایان
صفحه:
عنوان = "تابعهای شیوه"
سبک: محتوا = ".go .track > div { transform: translateX(260px) }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 20 پایان
جعبه:
شناسه = "lanes"
بیشینه عرض = 340
مسیر: شیوه = "linear" پایان
مسیر: شیوه = "ease-in" پایان
مسیر: شیوه = "ease-out" پایان
مسیر: شیوه = "steps(5)" پایان
مسیر: شیوه = "cubic-bezier(0.3, 1.6, 0.6, 1)" پایان
پایان
دکمه: فضا بالا = 10 کلیک = اجرا محتوا = "اجرا" پایان
پایانفقط ویژگیهایی که میانه دارند گذار میکنند: رنگ، طول، شفافیت، دگرگونی و مانند آن. رفتن از display: none به block میانهای ندارد، پس بهطور پیشفرض یکباره رخ میدهد. رفتار گذار = "allow-discrete" میگذارد چنین ویژگیهایی هم در گذار شرکت کنند و تغییرشان در انتهای درست آن رخ دهد، و همراه قاعدهی خام @starting-style میگذارد عنصر هنگام نخستین ظاهر شدنش محو و آشکار شود.
گذار دو مقدار متفاوت میخواهد. اگر عنصر از همان آغاز در حالت نهایی ساخته شود چیزی حرکت نمیکند. و اگر فقط به حالت اشاره گذار بدهید، برگشت یکباره است، که دلیل رایج حس نیمهکاره بودن است.
دگرگونی
دگرگونی (transform) پس از پایان چیدمان عنصر را جابهجا میکند، میچرخاند، مقیاس میدهد و کج میکند. یک یا چند تابع میگیرد: translate(x, y) جابهجا میکند، rotate(angle) با درجه (45deg) یا دور (0.25turn) میچرخاند، scale(n) اندازه را ضرب میکند، skew(x, y) کج میکند و matrix(a, b, c, d, e, f) همهی اینها به شکل عدد است. تابعها از راست به چپ اعمال میشوند. در translate(100px) rotate(45deg) نخست عنصر چرخانده میشود و بعد ۱۰۰ پیکسل به راست میرود، و در rotate(45deg) translate(100px) در امتداد محور خودش که از پیش چرخیده جابهجا میشود و اریب میرسد. جای تابعها را عوض کنید، تصویر دیگری میگیرید.
بخش کاشی(برچسب، حرکت، مبدا):
جعبه:
عرض = 90
ارتفاع = 60
نمایش = grid
موارد جایگذاری = center
پس زمینه = "#bfdbfe"
کادر = "2px solid #1d4ed8"
دگرگونی = حرکت
مبدا دگرگونی = مبدا
محتوا = برچسب
پایان
پایان
صفحه:
عنوان = "تابعهای دگرگونی"
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 30 پایان
جعبه:
نمایش = flex
پیچش فلکس = wrap
شکاف = 36
کاشی: برچسب = "جابهجایی" حرکت = "translate(20px, 10px)" مبدا = "center" پایان
کاشی: برچسب = "چرخش" حرکت = "rotate(-12deg)" مبدا = "center" پایان
کاشی: برچسب = "مقیاس" حرکت = "scale(1.25)" مبدا = "center" پایان
کاشی: برچسب = "کجی" حرکت = "skew(-15deg, 0)" مبدا = "center" پایان
کاشی: برچسب = "مبدا" حرکت = "rotate(25deg)" مبدا = "top left" پایان
جعبه:
عرض = 90
ارتفاع = 60
نمایش = grid
موارد جایگذاری = center
پس زمینه = "#fde68a"
کادر = "2px solid #b45309"
چرخش = "8deg"
مقیاس = 1.1
جابهجایی = "0 12px"
محتوا = "جدا"
پایان
پایان
پایانعنصر دگرگونشده جایش را در چیدمان نگه میدارد: همسایههایش جابهجا نمیشوند و تصویر عنصر جای دیگری کشیده میشود. برای همین است که دگرگونی بهترین ابزار پویانمایی است. چرخش حول میانهی عنصر رخ میدهد، مگر اینکه مبدا دگرگونی چیز دیگری بگوید: کاشی «مبدا» حول گوشهی بالا و چپش میچرخد. جعبه دگرگونی جعبهای را برمیگزیند که مبدا در آن اندازه گرفته میشود، که برای تصویرهای SVG مهم است و آنجا fill-box یعنی خود شکل عنصر.
کاشی آخر از سه ویژگی جدا استفاده میکند: جابهجایی، چرخش و مقیاس. همان کار تابعها را میکنند و به همین ترتیب پیش از دگرگونی اعمال میشوند. فایدهشان این است که یک پویانمایی میتواند چرخش را عوض کند و یک اشاره مقیاس را و هیچکدام دیگری را پاک نکند، که وقتی هر دو دگرگونی را بنویسند رخ میدهد.
پرسپکتیو و سهبعدی
بعد سوم را اضافه کنید تا بتوانید کارت را برگردانید. پرسپکتیو روی والد میگوید بیننده چقدر از صفحه دور است، به پیکسل: عدد کوچکی مثل ۳۰۰ عمق قوی و نمایشی میدهد و عدد بزرگ عمق ملایم. مبدا پرسپکتیو جای چشم بیننده است، که بهطور پیشفرض وسط است. بعد فرزند با rotateX یا rotateY حول محور افقی یا عمودی چرخانده میشود. برای اینکه رو و پشت کارت دو سمت واقعی باشند، عنصر چرخنده سبک دگرگونی = "preserve-3d" میخواهد که فرزندانش را در همان فضای سهبعدی نگه میدارد و به صفحهی خودش نمیچسباندشان، و هر رو دیدپذیری پشت = hidden که وقتی پشتش به شما است پنهانش میکند.
واردسازی دام
ناپایا برگشته := نادرست
تابع برگرداندن():
برگشته = وارونه برگشته
اگر برگشته:
دام.تنظیم سبک(دام.با شناسه("card"), "transform", "rotateY(180deg)")
وگرنه:
دام.تنظیم سبک(دام.با شناسه("card"), "transform", "rotateY(0deg)")
پایان
پایان
صفحه:
عنوان = "کارت چرخان"
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 30 پایان
جعبه:
عرض = 200
ارتفاع = 120
پرسپکتیو = 800
دکمه:
شناسه = "card"
کلیک = برگرداندن
موقعیت = relative
عرض = "100%"
ارتفاع = "100%"
فاصله = 0
کادر = none
پس زمینه = none
اندازه قلم = 18
سبک دگرگونی = "preserve-3d"
گذار = "transform 600ms"
تکه: نمایش = block موقعیت = absolute بالا = 0 چپ = 0 عرض = "100%" ارتفاع = "100%" ارتفاع خط = "120px" گردی کادر = 12 پس زمینه = "#0f766e" رنگ = white دیدپذیری پشت = hidden محتوا = "رو" پایان
تکه: نمایش = block موقعیت = absolute بالا = 0 چپ = 0 عرض = "100%" ارتفاع = "100%" ارتفاع خط = "120px" گردی کادر = 12 پس زمینه = "#f59e0b" دگرگونی = "rotateY(180deg)" دیدپذیری پشت = hidden محتوا = "پشت" پایان
پایان
پایان
پایانروی کارت کلیک کنید. رو یک رویهی عادی است و پشت از پیش نیمهچرخانده شده با rotateY(180deg)، پس وقتی کل کارت میچرخد پشت به جلو میآید. دکمه کارت را با صفحهکلید و صفحهخوان دستیافتنی میکند. کنترلکننده دگرگونی را با برنامه عوض میکند، چون وضعیت (چرخیده یا نه) در یک متغیر است، و گذار حرکت را انجام میدهد.
بعضی ویژگیها روی عنصر چرخنده preserve-3d را تخت میکنند و جلوه را خراب میکنند: سرریز غیر از visible، شفافیت زیر ۱ و پالایه. اگر پشت کارت نیست، دنبال یکی از آنها بگردید.
پویانمایی با قابهای کلیدی
گذار وقتی چیزی عوض شود از الف به ب میرود. پویانمایی (animation) خودش اجرا میشود، هر چند بار که بگویید، و از هر تعداد مرحله میتواند بگذرد. دو بخش دارد: قابهای کلیدی (keyframes) که میگویند عنصر در نقطههایی از پویانمایی چه شکلی دارد، و ویژگیهای پویانمایی روی عنصر که میگویند کدام قابها را و چگونه اجرا کند. قابهای کلیدی با قاعدهی @keyframes و یک نام نوشته میشوند. سلام برای آن عنصری ندارد، چون فهرست قابها جزئی از هیچ عنصری نیست: یک فهرست نامدار برای کل صفحه است که هر عنصری میتواند به کارش ببرد. پس CSS خام است، درون عنصر سبک.
صفحه:
عنوان = "نشانگر بارگذاری"
سبک: محتوا = "@keyframes spin { to { transform: rotate(1turn) } }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 30 پایان
جعبه:
عرض = 48
ارتفاع = 48
کادر = "6px solid #e2e8f0"
رنگ کادر بالا = "#0f766e"
گردی کادر = "50%"
پویانمایی = "spin 1s linear infinite"
پایان
پاراگراف: محتوا = "در حال بارگذاری" پایان
پایانقابها فقط میگویند کجا تمام شود: to { transform: rotate(1turn) }. آغاز، حالت عادی عنصر است. میانبُر پویانمایی روی جعبه قابها را نام میبرد و بعد مدت، تابع زمانبندی و تعداد تکرار را میدهد: یک ثانیه، سرعت ثابت، همیشه. همین را با ویژگیهای تکی نوشتن خواناتر و تغییرش آسانتر است. در نمونهی بعد هر کدام یک سطر دارد و نقطهها تاخیر پویانمایی متفاوتی میگیرند تا یکییکی بپرند.
بخش نقطه(تاخیر):
جعبه:
عرض = 16
ارتفاع = 16
گردی کادر = "50%"
پس زمینه = "#1d4ed8"
نام پویانمایی = bounce
مدت پویانمایی = "0.5s"
تابع زمانبندی پویانمایی = "ease-in-out"
تعداد تکرار پویانمایی = infinite
جهت پویانمایی = alternate
تاخیر پویانمایی = تاخیر
پایان
پایان
صفحه:
عنوان = "نقطههای جهنده"
سبک: محتوا = "@keyframes bounce { from { transform: translateY(0) } to { transform: translateY(-28px) } }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 30 پایان
جعبه:
نمایش = flex
شکاف = 10
ترازعمودی = "flex-end"
ارتفاع = 50
نقطه: تاخیر = "0s" پایان
نقطه: تاخیر = "0.15s" پایان
نقطه: تاخیر = "0.3s" پایان
پایان
پایانویژگیهای تکی اینها هستند: نام پویانمایی، قابهایی که اجرا شوند؛ مدت پویانمایی، زمان یک دور؛ تابع زمانبندی پویانمایی، منحنی هر گام میان قابها؛ تاخیر پویانمایی، صبر پیش از آغاز (تأخیر منفی پویانمایی را از میانهی راه شروع میکند)؛ تعداد تکرار پویانمایی، یک عدد یا infinite؛ و جهت پویانمایی. جهت alternate یک بار جلو و یک بار عقب میرود، برای همین نقطهها بالا و پایین میروند و نمیپرند. reverse عقبرو است و alternate-reverse از عقب شروع میکند.
پیش از آغاز و پس از پایان، عنصر طوری است که گویی پویانمایی نبوده. این برای چیزهایی که پدیدار میشوند عجیب است. با تأخیر، عنصر اول کاملاً دیده میشود، بعد به قاب نخست میپرد، بعد پویانمایی میشود، و آخر دوباره برمیگردد. حالت پرکردن پویانمایی این را عوض میکند: backwards قاب نخست را در مدت تأخیر اعمال میکند، forwards قاب آخر را پس از پایان نگه میدارد و both هر دو را. فهرست زیر both به کار میبرد تا هر سطر نادیده منتظر بماند و بعد سر جایش بماند. «بازپخش» دوباره راهش میاندازد.
واردسازی دام
تابع بازپخش():
دام.افزودن کلاس(دام.با شناسه("list"), "off")
دام.تنظیم مهلت((): دام.حذف کلاس(دام.با شناسه("list"), "off") پایان، 60)
پایان
بخش سطر(متن، نوبت):
جعبه:
فاصله = 12
فضا = "0 0 8"
پس زمینه = "#e0f2fe"
گردی کادر = 8
نام پویانمایی = rise
مدت پویانمایی = "0.5s"
حالت پرکردن پویانمایی = both
تاخیر پویانمایی = نوبت
محتوا = متن
پایان
پایان
صفحه:
عنوان = "ورود یکییکی"
سبک: محتوا = "@keyframes rise { from { opacity: 0; transform: translateY(16px) } to { opacity: 1; transform: none } } .off > div { animation: none }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 24 پایان
جعبه:
شناسه = "list"
بیشینه عرض = 320
سطر: متن = "نخست" نوبت = "0s" پایان
سطر: متن = "دوم" نوبت = "0.2s" پایان
سطر: متن = "سوم" نوبت = "0.4s" پایان
پایان
دکمه: کلیک = بازپخش محتوا = "بازپخش" پایان
پایاندکمهی بازپخش کلاسی را اضافه میکند که یک لحظه پویانمایی را خاموش میکند و بعد برش میدارد، چون پویانمایی وقتی نامش برداشته و دوباره گذاشته شود از نو شروع میشود. در صفحه، .off > div قاعدهی خامی است که تا وقتی کلاس هست animation: none میگذارد.
وضعیت پخش پویانمایی یا running است یا paused و توقف پویانمایی را همانجا نگه میدارد. هر چیزی که خودش بیش از چند ثانیه حرکت میکند باید راهی برای ایستادن داشته باشد، برای کسانی که وقتی چیزی حرکت میکند نمیتوانند بخوانند. صفحهی بعد این را با یک خط برنامه میکند، دام.تنظیم سبک(el, "animation-play-state", "paused").
واردسازی دام
ناپایا روان := درست
تابع تعویض():
روان = وارونه روان
اگر روان:
دام.تنظیم سبک(دام.با شناسه("ring"), "animation-play-state", "running")
دام.تنظیم متن(دام.با شناسه("btn"), "توقف")
وگرنه:
دام.تنظیم سبک(دام.با شناسه("ring"), "animation-play-state", "paused")
دام.تنظیم متن(دام.با شناسه("btn"), "ادامه")
پایان
پایان
صفحه:
عنوان = "توقف پویانمایی"
سبک: محتوا = "@keyframes spin { to { transform: rotate(1turn) } }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 30 پایان
جعبه:
شناسه = "ring"
عرض = 48
ارتفاع = 48
کادر = "6px solid #e2e8f0"
رنگ کادر بالا = "#be123c"
گردی کادر = "50%"
پویانمایی = "spin 1.2s linear infinite"
پایان
دکمه: شناسه = "btn" فضا بالا = 16 کلیک = تعویض محتوا = "توقف" پایان
پایانیک ویژگی دیگر، ترکیببندی پویانمایی، وقتی مهم میشود که عنصر از پیش مقداری دارد و پویانمایی به آن اضافه میکند. replace پیشفرض است و مقدار زیرین را نادیده میگیرد، add مقدار پویانمایی را به آن میافزاید و accumulate همین کار را برای فهرستهایی مثل چند تابع دگرگونی میکند. با آن دو پویانمایی که هر دو transform را مینویسند با هم کار میکنند.
نرم و کمهزینه
پویانمایی حدود ۶۰ بار در ثانیه بازکشیده میشود، پس هر قاب کمی بیشتر از ۱۶ میلیثانیه وقت دارد. عوض کردن عرض، ارتفاع، بالا یا چپ مرورگر را وادار میکند در هر قاب صفحه را دوباره بچیند، و روی تلفن این لرزش میآورد. عوض کردن دگرگونی و شفافیت معمولاً نه چیدمان میخواهد و نه حتی نقاشی: مرورگر عنصر را به شکل تصویری روی کارت گرافیک نگه میدارد و فقط جابهجایش میکند. هر وقت میتوانید با translate جابهجا کنید و با شفافیت پنهان.
تغییر پیشرو اشارهای است که یک ویژگی میخواهد عوض شود، مثل تغییر پیشرو = transform، تا مرورگر آن تصویر را زودتر آماده کند. آن را روی چند عنصر و درست پیش از پویانماییشان بگذارید و بعدش بردارید: هر عنصری که اینطور آماده شود حافظه میخورد، و صفحهای که این را برای همهچیز بگوید کندتر میشود.
حرکت روی مسیر
دگرگونی فقط خط راست میرود و منحنی ابزار دیگری میخواهد. مسیر حرکت به عنصر مسیری برای پیمودن میدهد، سادهتریناش path('M 0 40 C 60 -40, 120 120, 200 40') با دستورهای یک مسیر SVG. فاصله مسیر میگوید عنصر چقدر روی مسیر پیش رفته، از 0% تا 100%، و همین مقداری است که پویانمایی میشود. چرخش مسیر تعیین میکند رویش به کدام سو باشد: auto مثل ماشین مسیر را دنبال میکند و یک زاویه آن را ثابت نگه میدارد. لنگر حرکت نقطهای از عنصر را که روی مسیر مینشیند برمیگزیند و موقعیت حرکت نقطهی آغاز شکلهایی را که به آن نیاز دارند. حرکت مسیر چند تا از آنها را یکجا میگذارد.
صفحه:
عنوان = "حرکت روی مسیر"
سبک: محتوا = "@keyframes drive { to { offset-distance: 100% } }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 30 پایان
جعبه:
ارتفاع = 130
عرض = 260
فاصله = "40 0 0 20"
اندازه جعبه = "border-box"
کادر = "1px dashed #94a3b8"
جعبه:
عرض = 28
ارتفاع = 20
پس زمینه = "#f59e0b"
مسیر برش = "polygon(0 0, 100% 50%, 0 100%)"
مسیر حرکت = "path('M 0 40 C 60 -40, 120 120, 200 40')"
چرخش مسیر = auto
پویانمایی = "drive 3s ease-in-out infinite alternate"
پایان
پایان
پایانپیکان جعبهای است که با مسیر برش بریده شده و فاصلهاش در قابها از ۰ تا ۱۰۰ درصد میرود، با alternate رفتوبرگشتی. چرخش پیکان از چرخش مسیر = auto میآید.
پویانمایی با پیمایش
پویانمایی معمولاً ساعت را دنبال میکند. با خط زمان پویانمایی میتواند چیز دیگری را دنبال کند، مثلاً صفحه تا کجا پیمایش شده، بدون هیچ برنامهای. scroll() پیشرفت نزدیکترین نیای پیمایششدنی است، از بالا تا انتها. آنوقت پویانمایی با پیمایش کاربر از آغاز تا پایان اجرا میشود و مدت نقشی ندارد. نواری که پایین میبینید با خواندن صفحه از هیچ تا تمام عرض بزرگ میشود.
صفحه:
عنوان = "نوار پیشرفت خواندن"
سبک: محتوا = "@keyframes fill { from { transform: scaleX(0) } to { transform: scaleX(1) } }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 0 ارتفاع خط = 1.9 پایان
جعبه:
موقعیت = fixed
بالا = 0
چپ = 0
عرض = "100%"
ارتفاع = 6
پس زمینه = "#0f766e"
مبدا دگرگونی = "0 50%"
نام پویانمایی = fill
تابع زمانبندی پویانمایی = linear
خط زمان پویانمایی = "scroll()"
پایان
جعبه:
فاصله = 24
سرتیتر: اندازه = 2 محتوا = "پایین بروید" پایان
پاراگراف: تکرار = 14 محتوا = "نوار بالای صفحه با جای پیمایش بزرگ میشود. هیچ برنامهای پیمایش را نمیخواند، مرورگر پویانمایی را به آن وصل میکند." پایان
پایان
پایانview() پیشرفت خود عنصر در گذر از پیمایشگر است: وقتی عنصر شروع به وارد شدن میکند آغاز میشود و وقتی کاملاً رفته پایان مییابد. بازه پویانمایی بخشی را که به حساب میآید برمیگزیند، با نامهایی مثل entry (هنگام ورود)، exit، contain و cover (کل مسیر)، هر کدام با درصد. آغاز بازه پویانمایی و انتهای بازه پویانمایی دو سر را جدا تعیین میکنند. صفحهی زیر را پیمایش کنید: هر جعبه همانطور که وارد میشود پیدا میشود و وقتی کاملاً وارد شد کار تمام است.
صفحه:
عنوان = "نمایان شدن با پیمایش"
سبک: محتوا = "@keyframes show { from { opacity: 0; transform: translateY(30px) } to { opacity: 1; transform: none } }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 24 پایان
سرتیتر: اندازه = 2 محتوا = "پایین بروید" پایان
جعبه:
ارتفاع = 160
فضا = "0 0 40"
فاصله = 16
پس زمینه = "#e0f2fe"
گردی کادر = 10
نام پویانمایی = show
تابع زمانبندی پویانمایی = linear
حالت پرکردن پویانمایی = both
خط زمان پویانمایی = "view()"
بازه پویانمایی = "entry 0% entry 100%"
تکرار = 6
محتوا = "همین که وارد صفحه میشوم کمکم پیدا میشوم"
پایان
پایانوقتی دو عنصر تو در تو نیستند، یکی میتواند خط زمان دیگری را با نام بخواند. نام خط زمان پیمایش و محور خط زمان پیمایش (یا میانبُر خط زمان پیمایش) به پیشرفت یک پیمایشگر نامی میدهند که با دو خط تیره شروع میشود؛ نام خط زمان دید، محور خط زمان دید و فرورفتگی خط زمان دید (یا خط زمان دید) همین را برای پیشرفت یک عنصر میکنند؛ و خط زمان پویانمایی = "--name" آن را به کار میبرد. نام فقط برای نوادگان عنصری که تعریفش میکند دیده میشود، و دامنه خط زمان روی نیای مشترک این محدودیت را برمیدارد. فرورفتگی خط زمان دید ناحیهی دیدهشده را از بالا و پایین چند پیکسل کوچک میکند.
پویانمایی با پیمایش در مرورگرهای مبتنی بر کرومیوم، مثل کروم و اج، کار میکند و هنوز در همهی مرورگرهای دیگر نه. بدون پشتیبانی عنصر پویانماییشده در حالت عادیاش میماند، پس آنها را مثل تزیینی بنویسید که صفحه به آن تکیه ندارد، و محتوا را بدون آنها خوانا بگذارید. خط زمان پویانمایی را بعد از میانبُر پویانمایی بنویسید، چون میانبُر آن را از نو میگذارد.
گذار نما
گذار نما (view transition) تغییر صفحه را، حتی تغییر بزرگ را، تقریباً بیزحمت شما پویانمایی میکند. برنامه document.startViewTransition(f) را با تابعی که صفحه را عوض میکند صدا میزند. مرورگر از صفحهی قدیم عکس میگیرد، f را اجرا میکند، از صفحهی جدید عکس میگیرد و میانشان محو و آشکار میکند. عنصری که نام گذار نما دارد جداگانه رفتار میشود: عکس قدیم و جدیدش از جا و اندازهی قدیم به جدید میروند و بزرگ و کوچک میشوند، پس انگار سفر میکند. نام باید در آن لحظه در صفحه یکتا باشد. کلاس گذار دید به چند عنصر یک نام کلاس میدهد تا یک قاعده بتواند گذار همهشان را سبک دهد.
صفحه:
عنوان = "گذار نما"
سبک: محتوا = ".wide { width: 240px !important; height: 100px !important; background: #f59e0b !important } ::view-transition-group(tile) { animation-duration: 500ms }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 30 پایان
جعبه:
شناسه = "tile"
عرض = 80
ارتفاع = 80
پس زمینه = "#0f766e"
گردی کادر = 12
نام گذار نما = tile
پایان
دکمه: فضا بالا = 16 کلیک = "var f = function () { document.getElementById('tile').classList.toggle('wide') }; if (document.startViewTransition) { document.startViewTransition(f) } else { f() }" محتوا = "تغییر شکل" پایان
پایانبرنامه روی کاشی کلاس را عوض میکند و مرورگر آن را از کوچک و سبز به بزرگ و نارنجی پویانمایی میکند. قاعدهی خام روی ::view-transition-group(tile) حرکت را ۵۰۰ میلیثانیه طول میدهد. برنامه نخست میپرسد مرورگر startViewTransition دارد یا نه: در مرورگری که ندارد تغییر یکباره رخ میدهد. گذار نما در مرورگرهای تازهی کرومیوم و سافاری هست.
پویانمایی تا auto
پنلی که تا بلندی متنش باز میشود نمونهی کلاسیکی است که CSS نمیتوانست پویانماییاش کند: ارتفاع auto عدد نیست و میان ۰ و auto چیزی نبود. میانیابی اندازه = "allow-keywords" این را ممکن میکند، برای auto، min-content، max-content و fit-content. ویژگی ارثبر است، پس یک قاعده روی :root آن را برای صفحه روشن میکند، همانطور که نمونه با یک قاعدهی سراسری میکند. در مرورگری که آن را نمیشناسد پنل باز میشود اما یکباره.
واردسازی دام
ناپایا باز := نادرست
تابع تعویض():
باز = وارونه باز
اگر باز:
دام.تنظیم سبک(دام.با شناسه("panel"), "height", "auto")
وگرنه:
دام.تنظیم سبک(دام.با شناسه("panel"), "height", "0")
پایان
پایان
صفحه:
عنوان = "پویانمایی تا auto"
سراسری: گزینشگر = ":root" میانیابی اندازه = "allow-keywords" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 24 پایان
دکمه: کلیک = تعویض محتوا = "نمایش جزئیات" پایان
جعبه:
شناسه = "panel"
ارتفاع = 0
سرریز = hidden
گذار = "height 400ms ease"
پاراگراف: فضا = "12 0" محتوا = "پنل به اندازهی متنش بلند است. ارتفاعش از ۰ به auto میرود، کاری که CSS پیشتر نمیتوانست پویانمایی کند." پایان
پایان
پایانکاهش حرکت
برای بعضیها حرکت بزرگ، پارالکس و چرخش سرگیجه و تهوع میآورد. سیستمعاملها تنظیمی برایش دارند و مرورگرها آن را به شکل پرسوجوی رسانهی prefers-reduced-motion به صفحهی شما میرسانند. رعایتش بخشی از ساختن صفحه است و چند خط بیشتر خرج ندارد.
صفحه:
عنوان = "احترام به کاهش حرکت"
سبک: محتوا = "@keyframes pulse { 50% { transform: scale(1.25); opacity: 0.6 } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none !important; transition: none !important } }" پایان
سراسری: گزینشگر = "body" خانواده قلم = "Tahoma, system-ui, sans-serif" فضا = 30 پایان
جعبه:
عرض = 40
ارتفاع = 40
گردی کادر = "50%"
پس زمینه = "#be123c"
پویانمایی = "pulse 1.2s ease-in-out infinite"
پایان
پاراگراف: محتوا = "این نقطه میتپد، مگر اینکه دستگاه شما کاهش حرکت را خواسته باشد." پایان
پایانقاعدهی خام آخر سبک میگوید وقتی کاربر حرکت کمتر خواسته، هر پویانمایی و گذار خاموش باشد. !important دارد تا بر قاعدههایی که مترجم بعدتر مینویسد هم بچربد. ابزاری زمخت و گام اول خوبی است. ابزار ظریفتر معنا را نگه میدارد و حرکت را برمیدارد: پنلی که میلغزید میتواند محو و آشکار شود و سفر دراز میتواند کوتاه شود. همین پرسوجو تصمیم میگیرد رفتار پیمایش = smooth از درس پیش اصلاً روشن باشد یا نه. هر تنظیمی که کاربر داشته باشد، هرگز نگذارید چیزی بیش از سه بار در ثانیه چشمک بزند.
مرجع: ویژگیهای گذار، دگرگونی و پویانمایی
ویژگیها در گروههاییاند. هر نمونه را مترجم بررسی کرده است، پس میتوانید آن را درون یک بلوک صفحه: بگذارید، و نمونههایی که نامی مثل spin دارند قاعدهی @keyframes همنام را در یک عنصر سبک لازم دارند، مثل درسهای بالا. مقدارهای پذیرفته شده میان قلاب پس از هر توضیح هستند.
گذار
| ویژگی | کار آن و مقدارهای قابل قبول | نمونه |
|---|---|---|
گذارtransition transition | میانبُر یک گذار کامل: ویژگی، مدت، تابع زمانبندی و تأخیر، به همین ترتیب. اگر دو زمان باشد، اولی مدت است و دومی تأخیر. چند گذار را با ویرگول جدا میکنند. [comma list] | دکمه:
فاصله = "8 18"
پس زمینه = "#1d4ed8"
رنگ = white
گذار = "background 200ms ease-out, transform 100ms"
اشاره پس زمینه = "#1e3a8a"
فشردن دگرگونی = "scale(0.96)"
محتوا = "مرا فشار دهید"
پایان |
ویژگی گذارtransition property transition-property | ویژگیهایی را که گذار میکنند نام میبرد: یک یا چند نام با ویرگول، all برای هر ویژگیای که بتواند عوض شود، یا none. ویژگیهایی را که میخواهید فهرست کنید، چون all چیزهایی را هم پویانمایی میکند که به آنها فکر نکرده بودید. [name / none, all; comma list] | جعبه:
عرض = 100
ارتفاع = 40
پس زمینه = "#bfdbfe"
ویژگی گذار = "width, background"
مدت گذار = "300ms"
اشاره عرض = 200
اشاره پس زمینه = "#93c5fd"
محتوا = "فقط عرض و رنگ میلغزند"
پایان |
مدت گذارtransition duration transition-duration | گذار چقدر طول میکشد، به شکل زمانی مثل 200ms یا 0.3s. چند زمان با ویرگول به ترتیب با چند ویژگی میآیند. پیشفرض 0s یعنی بدون گذار. [time; comma list] | جعبه:
فاصله = 12
پس زمینه = "#fde68a"
گذار = "background"
مدت گذار = "600ms"
اشاره پس زمینه = "#f59e0b"
محتوا = "آهسته نارنجی میشوم"
پایان |
تابع زمانبندی گذارtransition timing function transition-timing-function | منحنی سرعت گذار. کلمهها: ease (پیشفرض)، linear، ease-in، ease-out، ease-in-out، step-start و step-end. تابعها: cubic-bezier(x1, y1, x2, y2) برای منحنی خودتان، steps(n) برای n جهش و linear(...) برای فهرستی از نقطهها. [timing function / ease, linear, ease-in, ease-out, ease-in-out, step-start, ...; comma list] | جعبه:
عرض = 40
ارتفاع = 40
پس زمینه = "#0f766e"
گذار = "transform 1s"
تابع زمانبندی گذار = "cubic-bezier(0.3, 1.6, 0.6, 1)"
اشاره دگرگونی = "translateX(120px)"
پایان |
تاخیر گذارtransition delay transition-delay | پیش از شروع گذار چقدر صبر کند، به شکل یک زمان. زمان منفی باعث میشود گذار از میانهی راه شروع شود. چند زمان با ویرگول با چند ویژگی میآیند. [time; comma list] | جعبه:
فاصله = 12
پس زمینه = "#e2e8f0"
گذار = "background 300ms"
تاخیر گذار = "500ms"
اشاره پس زمینه = "#fca5a5"
محتوا = "نیم ثانیه صبر میکنم، بعد عوض میشوم"
پایان |
رفتار گذارtransition behavior transition-behavior | انتخاب میکند ویژگیهایی که نمیشود میانشان را ساخت، مثل display، در گذار شرکت کنند یا نه. normal آنها را کنار میگذارد و یکباره عوض میشوند، و allow-discrete میگذارد در انتهای درست گذار عوض شوند. چند مقدار با ویرگول با چند ویژگی میآیند. [normal, allow-discrete; comma list] | جعبه:
فاصله = 12
پس زمینه = "#e0f2fe"
گذار = "opacity 400ms, display 400ms"
رفتار گذار = "allow-discrete"
اشاره شفافیت = 0.3
محتوا = "ویژگیهای گسسته هم در گذار شرکت میکنند"
پایان |
دگرگونی و سهبعدی
| ویژگی | کار آن و مقدارهای قابل قبول | نمونه |
|---|---|---|
دگرگونیtransform transform | پس از پایان چیدمان عنصر را جابهجا میکند، میچرخاند، مقیاس میدهد یا کج میکند. فهرستی از تابعها، مثل translate(10px, 20px)، rotate(45deg)، scale(1.5)، skew(10deg)، matrix(...) و سهبعدیهایی چون rotateX()، rotateY() و translateZ(). از راست به چپ اعمال میشوند. همسایهها جایشان را نگه میدارند. [up to 99 values] | جعبه:
عرض = 120
فاصله = 16
پس زمینه = "#bbf7d0"
دگرگونی = "rotate(-6deg) scale(1.1)"
محتوا = "چرخیده و بزرگشده"
پایان |
جابهجاییtranslate translate | عنصر را جابهجا میکند، مثل transform: translate()، اما به شکل ویژگیای جدا. یک، دو یا سه طول یا درصد برای x، y و z. درصدها به اندازهی خود عنصر برمیگردند. none آن را برمیدارد. [length / percentage / none; up to 3 values] | جعبه:
عرض = 100
فاصله = 12
پس زمینه = "#fecaca"
جابهجایی = "30px 10px"
محتوا = "کنار رفتهام"
پایان |
چرخشrotate rotate | عنصر را میچرخاند، مثل transform: rotate()، اما به شکل ویژگیای جدا. یک زاویه مثل 45deg یا 0.25turn، یا یک محور و یک زاویه مثل y 60deg برای چرخش سهبعدی. none آن را برمیدارد. [angle / none] | جعبه:
عرض = 100
فاصله = 12
پس زمینه = "#ddd6fe"
چرخش = "15deg"
محتوا = "کمی چرخیده"
پایان |
مقیاسscale scale | عنصر را مقیاس میدهد، مثل transform: scale()، اما به شکل ویژگیای جدا. یک عدد یا درصد برای هر دو جهت، دو تا برای x و y، سه تا برای x و y و z. none آن را برمیدارد. [number / percentage / none; up to 3 values] | جعبه:
عرض = 100
فاصله = 12
پس زمینه = "#fde68a"
مقیاس = 1.2
محتوا = "یکپنجم بزرگتر"
پایان |
مبدا دگرگونیtransform origin transform-origin | نقطهای که چرخش و مقیاس از آن اندازه گرفته میشود. یک تا سه مقدار: کلمههایی مثل top left و center، طول یا درصد. پیشفرض 50% 50%، یعنی میانهی عنصر است. [length / percentage; up to 3 values] | جعبه:
عرض = 100
فاصله = 12
پس زمینه = "#bae6fd"
دگرگونی = "rotate(20deg)"
مبدا دگرگونی = "top left"
محتوا = "حول گوشهام میچرخم"
پایان |
جعبه دگرگونیtransform box transform-box | جعبهای را برمیگزیند که مبدا دگرگونی و درصدها در آن اندازه گرفته میشوند. border-box و content-box برای عنصرهای عادیاند و fill-box، stroke-box و view-box برای شکلهای SVG که fill-box یعنی خود شکل. [content-box, border-box, fill-box, stroke-box, view-box] | جعبه:
عرض = 100
فاصله = 12
پس زمینه = "#fbcfe8"
جعبه دگرگونی = "border-box"
مبدا دگرگونی = "100% 0"
دگرگونی = "rotate(-10deg)"
محتوا = "مبدا در گوشهی بالا و راست"
پایان |
سبک دگرگونیtransform style transform-style | میگوید فرزندان عنصر دگرگونشده در همان فضای سهبعدی زندگی میکنند (preserve-3d) یا به صفحهی خود عنصر چسبانده میشوند (flat، پیشفرض). کارتی با دو رو preserve-3d میخواهد. سرریز، شفافیت زیر ۱ و پالایه دوباره تختش میکنند. [flat, preserve-3d] | جعبه:
پرسپکتیو = 600
جعبه:
عرض = 120
ارتفاع = 60
پس زمینه = "#99f6e4"
سبک دگرگونی = "preserve-3d"
دگرگونی = "rotateY(35deg)"
محتوا = "صحنهای سهبعدی"
پایان
پایان |
پرسپکتیوperspective perspective | فاصلهی بیننده از صفحه، که روی والد عنصرهای سهبعدی گذاشته میشود. یک طول: مقدارهای کوچک مثل 300px عمق قوی و مقدارهای بزرگ عمق ملایم میدهند. none تخت است. [length / none] | جعبه:
پرسپکتیو = 500
جعبه:
عرض = 120
فاصله = 12
پس زمینه = "#c7d2fe"
دگرگونی = "rotateY(40deg)"
محتوا = "با پرسپکتیو دیده میشوم"
پایان
پایان |
مبدا پرسپکتیوperspective origin perspective-origin | جای چشم بیننده روبهروی عنصری که پرسپکتیو دارد، جایی که خطهای عمق به هم میرسند. کلمه، طول یا درصد؛ پیشفرض وسط، یعنی 50% 50% است. [length / percentage; up to 4 values] | جعبه:
پرسپکتیو = 500
مبدا پرسپکتیو = "left top"
جعبه:
عرض = 120
فاصله = 12
پس زمینه = "#fed7aa"
دگرگونی = "rotateX(40deg)"
محتوا = "از بالا و چپ دیده میشوم"
پایان
پایان |
دیدپذیری پشتbackface visibility backface-visibility | میگوید وقتی عنصر پشتش را به بیننده میکند پشتش کشیده شود یا نه. visible پیشفرض است و تصویری آینهای نشان میدهد، hidden هیچ نشان نمیدهد. دو رو داشتن کارت چرخان را ممکن میکند. [visible, hidden] | جعبه:
عرض = 120
فاصله = 12
پس زمینه = "#a7f3d0"
دیدپذیری پشت = hidden
دگرگونی = "rotateY(180deg)"
محتوا = "پشتم دیده نمیشود"
پایان |
پویانمایی
| ویژگی | کار آن و مقدارهای قابل قبول | نمونه |
|---|---|---|
پویانماییanimation animation | میانبُری که پویانمایی قابهای کلیدی را آغاز میکند: نام، مدت، تابع زمانبندی، تأخیر، تعداد تکرار، جهت، حالت پرکردن و وضعیت پخش، که فقط نام و مدت لازماند. قاعدهی @keyframes همنام در عنصر سبک میآید. چند پویانمایی را با ویرگول جدا میکنند. [comma list] | جعبه:
عرض = 40
ارتفاع = 40
گردی کادر = "50%"
پس زمینه = "#be123c"
پویانمایی = "pulse 1.2s ease-in-out infinite"
پایان |
نام پویانماییanimation name animation-name | نام قاعدهی @keyframes که باید اجرا شود، یا none. چند نام با ویرگول چند پویانمایی را روی یک عنصر اجرا میکنند. [name / none; comma list] | جعبه:
عرض = 40
ارتفاع = 40
پس زمینه = "#0f766e"
نام پویانمایی = slide
مدت پویانمایی = "2s"
پایان |
مدت پویانماییanimation duration animation-duration | زمان یک دور پویانمایی، مثل 2s یا 300ms. پیشفرض 0s چیزی اجرا نمیکند. در پویانمایی با پیمایش مدت به کار نمیآید. [time / auto; comma list] | جعبه:
عرض = 40
ارتفاع = 40
پس زمینه = "#7c3aed"
نام پویانمایی = slide
مدت پویانمایی = "800ms"
پایان |
تابع زمانبندی پویانماییanimation timing function animation-timing-function | منحنی سرعت میان هر دو قاب کلیدی. همان مقدارهای گذار: ease، linear، ease-in، ease-out، ease-in-out، cubic-bezier()، steps(). منحنی را درون یک قاب هم میشود گذاشت. [timing function / ease, linear, ease-in, ease-out, ease-in-out, step-start, ...; comma list] | جعبه:
عرض = 40
ارتفاع = 40
پس زمینه = "#ea580c"
نام پویانمایی = slide
مدت پویانمایی = "2s"
تابع زمانبندی پویانمایی = "steps(6)"
پایان |
تاخیر پویانماییanimation delay animation-delay | صبر پیش از آغاز پویانمایی، به شکل یک زمان. زمان منفی آن را از میانهی راه شروع میکند، که راه جابهجا کردن چند نسخه از یک پویانمایی است. [time; comma list] | جعبه:
عرض = 40
ارتفاع = 40
پس زمینه = "#0891b2"
نام پویانمایی = slide
مدت پویانمایی = "2s"
تاخیر پویانمایی = "-1s"
پایان |
تعداد تکرار پویانماییanimation iteration count animation-iteration-count | پویانمایی چند بار اجرا شود: یک عدد، کسری مثل 1.5 یا infinite. پیشفرض ۱ است. [number / infinite; comma list] | جعبه:
عرض = 40
ارتفاع = 40
پس زمینه = "#65a30d"
نام پویانمایی = slide
مدت پویانمایی = "1s"
تعداد تکرار پویانمایی = 3
پایان |
جهت پویانماییanimation direction animation-direction | جهت هر دور. normal از قاب نخست به آخر میرود، reverse عقب میرود، alternate یک بار جلو و یک بار عقب میرود و alternate-reverse از عقب شروع میکند. [normal, reverse, alternate, alternate-reverse; comma list] | جعبه:
عرض = 40
ارتفاع = 40
پس زمینه = "#db2777"
نام پویانمایی = slide
مدت پویانمایی = "1s"
تعداد تکرار پویانمایی = infinite
جهت پویانمایی = alternate
پایان |
حالت پرکردن پویانماییanimation fill mode animation-fill-mode | عنصر بیرون از پویانمایی چه شکلی دارد. none سبک عادیاش را نشان میدهد، forwards قاب آخر را پس از پایان نگه میدارد، backwards قاب نخست را در مدت تأخیر اعمال میکند و both هر دو را. [none, forwards, backwards, both; comma list] | جعبه:
فاصله = 12
پس زمینه = "#e0f2fe"
نام پویانمایی = fadein
مدت پویانمایی = "600ms"
تاخیر پویانمایی = "400ms"
حالت پرکردن پویانمایی = both
محتوا = "تا نوبتم نیست دیده نمیشوم، بعد میمانم"
پایان |
وضعیت پخش پویانماییanimation play state animation-play-state | پویانمایی را اجرا یا متوقف میکند. running پیشفرض است و paused آن را همانجا که هست یخ میزند. برنامه میتواند با دام.تنظیم سبک(el, "animation-play-state", "paused") عوضش کند. [running, paused; comma list] | جعبه:
عرض = 40
ارتفاع = 40
پس زمینه = "#475569"
پویانمایی = "spin 1s linear infinite"
وضعیت پخش پویانمایی = paused
پایان |
ترکیببندی پویانماییanimation composition animation-composition | میگوید مقدار پویانماییشده چگونه با مقداری که عنصر از پیش دارد ترکیب شود. replace آن را نادیده میگیرد، add دو مقدار را جمع میکند و accumulate فهرستهایی مثل تابعهای دگرگونی را با هم میآمیزد. چند مقدار با ویرگول با چند پویانمایی میآیند. [replace, add, accumulate; comma list] | جعبه:
عرض = 40
ارتفاع = 40
پس زمینه = "#0369a1"
دگرگونی = "rotate(30deg)"
نام پویانمایی = grow
مدت پویانمایی = "1s"
ترکیببندی پویانمایی = add
پایان |
حرکت روی مسیر
| ویژگی | کار آن و مقدارهای قابل قبول | نمونه |
|---|---|---|
حرکت مسیرoffset offset | میانبُر حرکت روی مسیر: مسیر، فاصله روی آن، چرخش و پس از یک خط مورب لنگر. موقعیت آغاز میتواند اول بیاید. [path, distance, rotation, then / and an anchor position] | جعبه:
عرض = 24
ارتفاع = 24
پس زمینه = "#f59e0b"
حرکت مسیر = "path('M 0 40 C 60 -40, 120 120, 200 40') 40% auto"
پایان |
مسیر حرکتoffset path offset-path | مسیری که عنصر دنبال میکند. path('...') دستورهای یک مسیر SVG را میگیرد، ray(45deg) خطی راست از موقعیت آغاز است و none آن را برمیدارد. همراه فاصله مسیر عنصر را حرکت میدهد. [up to 2 values] | جعبه:
عرض = 24
ارتفاع = 24
پس زمینه = "#16a34a"
مسیر حرکت = "path('M 0 0 L 200 60')"
فاصله مسیر = "50%"
پایان |
فاصله مسیرoffset distance offset-distance | عنصر چقدر روی مسیر حرکتش پیش رفته: طول یا درصدی از مسیر، 0% آغاز و 100% انتها. همین مقداری است که پویانمایی حرکت روی مسیر عوض میکند. [length / percentage] | جعبه:
عرض = 24
ارتفاع = 24
پس زمینه = "#dc2626"
مسیر حرکت = "path('M 0 0 L 200 0')"
فاصله مسیر = "75%"
پایان |
چرخش مسیرoffset rotate offset-rotate | عنصر هنگام حرکت چگونه بچرخد. auto رو به سوی مسیر میماند، reverse رو به سوی مخالف، یک زاویه مثل 90deg چرخشی ثابت نگه میدارد و auto 90deg زاویهای به سوی مسیر اضافه میکند. [angle; up to 2 values] | جعبه:
عرض = 28
ارتفاع = 20
پس زمینه = "#2563eb"
مسیر حرکت = "path('M 0 40 C 60 -40, 120 120, 200 40')"
فاصله مسیر = "30%"
چرخش مسیر = "auto"
پایان |
لنگر حرکتoffset anchor offset-anchor | نقطهای از عنصر که روی مسیر مینشیند. کلمه، طول یا درصد؛ پیشفرض auto مبدا دگرگونی را به کار میبرد. [length / percentage; up to 4 values] | جعبه:
عرض = 40
ارتفاع = 20
پس زمینه = "#9333ea"
مسیر حرکت = "path('M 0 0 L 200 0')"
فاصله مسیر = "50%"
لنگر حرکت = "left top"
پایان |
موقعیت حرکتoffset position offset-position | نقطهی آغاز مسیری که خودش نقطهی آغاز ندارد، مثل ray(). کلمه، طول یا درصد در جعبهی شامل؛ normal یعنی بدون موقعیت و auto یعنی جای خود عنصر. [length / percentage; up to 4 values] | جعبه:
عرض = 20
ارتفاع = 20
پس زمینه = "#0d9488"
موقعیت حرکت = "40px 20px"
مسیر حرکت = "ray(90deg)"
فاصله مسیر = "60px"
پایان |
پویانمایی با پیمایش
| ویژگی | کار آن و مقدارهای قابل قبول | نمونه |
|---|---|---|
خط زمان پویانماییanimation timeline animation-timeline | خط زمانی که بهجای ساعت پویانمایی را میراند. scroll() جای پیمایش نزدیکترین پیمایشگر را دنبال میکند، view() اینکه عنصر چقدر از ناحیهی دیدهشده گذشته، نامی مثل --card خط زمانی نامدار را به کار میبرد، auto ساعت است و none آن را برمیدارد. فقط مرورگرهای مبتنی بر کرومیوم. آن را پس از میانبُر پویانمایی بنویسید. [comma list of dashed idents, scroll(), view() / none, auto] | جعبه:
ارتفاع = 6
پس زمینه = "#0f766e"
مبدا دگرگونی = "0 50%"
پویانمایی = "fill 1s linear"
خط زمان پویانمایی = "scroll()"
پایان |
بازه پویانماییanimation range animation-range | بخشی از خط زمان پیمایشی که پویانمایی در آن اجرا میشود، به شکل آغاز و انتها. هر کدام یک نام (entry، exit، contain، cover) با درصدی اختیاری است. فقط مرورگرهای مبتنی بر کرومیوم. [comma list of range names with optional length/percentage] | جعبه:
فاصله = 16
پس زمینه = "#e0f2fe"
پویانمایی = "show 1s linear both"
خط زمان پویانمایی = "view()"
بازه پویانمایی = "entry 0% cover 40%"
محتوا = "هنگام ورود پیدا میشوم"
پایان |
آغاز بازه پویانماییanimation range start animation-range-start | پویانمایی کجای خط زمان آغاز شود: نامی مثل entry، exit، contain یا cover با درصد یا طولی اختیاری، مثلاً entry 20%. فقط مرورگرهای مبتنی بر کرومیوم. [comma list of a range name or length/percentage] | جعبه:
فاصله = 16
پس زمینه = "#fef3c7"
پویانمایی = "show 1s linear both"
خط زمان پویانمایی = "view()"
آغاز بازه پویانمایی = "entry 20%"
محتوا = "از یکپنجم ورود شروع میشوم"
پایان |
انتهای بازه پویانماییanimation range end animation-range-end | پویانمایی کجای خط زمان پایان یابد: نامی با درصد یا طولی اختیاری، مثلاً cover 50%. فقط مرورگرهای مبتنی بر کرومیوم. [comma list of a range name or length/percentage] | جعبه:
فاصله = 16
پس زمینه = "#dcfce7"
پویانمایی = "show 1s linear both"
خط زمان پویانمایی = "view()"
انتهای بازه پویانمایی = "cover 50%"
محتوا = "نیمهی راه تمام میشوم"
پایان |
خط زمان پیمایشscroll timeline scroll-timeline | میانبُری که پیشرفت پیمایش این عنصر را برای عنصرهای دیگر نام میدهد: نام، که با دو خط تیره شروع میشود، و بعد محور. فقط مرورگرهای مبتنی بر کرومیوم. [dashed ident, optional axis, shorthand] | جعبه:
ارتفاع = 100
سرریز عمودی = auto
خط زمان پیمایش = "--page block"
پاراگراف: محتوا = "درون من پیمایش کنید" پایان
پاراگراف: محتوا = "و پویانمایی با خط زمان page دنبالش میآید" پایان
پاراگراف: محتوا = "سطر سوم" پایان
پاراگراف: محتوا = "سطر چهارم" پایان
پایان |
نام خط زمان پیمایشscroll timeline name scroll-timeline-name | نامی برای پیشرفت پیمایش این عنصر، با دو خط تیره در آغاز، مثل --page. عنصر دیگری آن را با خط زمان پویانمایی = "--page" به کار میبرد. پیشفرض none است. [comma list of dashed idents / none] | جعبه:
ارتفاع = 100
سرریز عمودی = auto
نام خط زمان پیمایش = "--list"
پاراگراف: محتوا = "پیمایشگری نامدار" پایان
پاراگراف: محتوا = "سطر دوم" پایان
پاراگراف: محتوا = "سطر سوم" پایان
پاراگراف: محتوا = "سطر چهارم" پایان
پایان |
محور خط زمان پیمایشscroll timeline axis scroll-timeline-axis | خط زمان نامدار پیمایش در کدام جهت را اندازه میگیرد: block (جهتی که سطرها روی هم میآیند)، inline یا x و y فیزیکی. [comma list of block / inline / x / y] | جعبه:
عرض = 200
سرریز افقی = auto
فضای سفید = nowrap
نام خط زمان پیمایش = "--strip"
محور خط زمان پیمایش = "inline"
محتوا = "سطری بلند که به پهلو پیمایش میشود و خط زمانی به نام strip میراند"
پایان |
خط زمان دیدview timeline view-timeline | میانبُری که پیشرفت این عنصر را در ناحیهی پیمایش برای عنصرهای دیگر نام میدهد: نام، که با دو خط تیره شروع میشود، محور و فرورفتگی. فقط مرورگرهای مبتنی بر کرومیوم. [dashed ident, optional axis and inset, shorthand] | جعبه:
فاصله = 16
پس زمینه = "#fce7f3"
خط زمان دید = "--card block"
محتوا = "پیشرفتم نام دارد"
پایان |
نام خط زمان دیدview timeline name view-timeline-name | نامی برای اینکه این عنصر چقدر از ناحیهی دیدهشدهی پیمایشگرش گذشته، با دو خط تیره در آغاز، مثل --card. عنصر دیگری میتواند با خط زمان پویانمایی دنبالش کند. پیشفرض none است. [comma list of dashed idents / none] | جعبه:
فاصله = 16
پس زمینه = "#ede9fe"
نام خط زمان دید = "--card"
محتوا = "دیگران میتوانند دنبال کنند چقدر دیدهام"
پایان |
محور خط زمان دیدview timeline axis view-timeline-axis | پیشرفت عنصر در کدام جهت اندازه گرفته شود: block، inline، x یا y. پیشفرض block است. [comma list of block / inline / x / y] | جعبه:
فاصله = 16
پس زمینه = "#cffafe"
نام خط زمان دید = "--item"
محور خط زمان دید = "inline"
محتوا = "به پهلو اندازه گرفته میشوم"
پایان |
فرورفتگی خط زمان دیدview timeline inset view-timeline-inset | ناحیهی دیدهشدهی پیمایشگر را در آغاز و انتها به اندازهای کوچک میکند، تا خط زمان دیرتر شروع و زودتر تمام شود. یک یا دو طول یا درصد، یا auto. [up to 2 lengths/percentages or auto] | جعبه:
فاصله = 16
پس زمینه = "#fef9c3"
نام خط زمان دید = "--tile"
فرورفتگی خط زمان دید = "40px"
محتوا = "خط زمانم ۴۰ پیکسل کنارهها را نمیبیند"
پایان |
دامنه خط زمانtimeline scope timeline-scope | دامنهی خط زمانهای نامدار را تا این عنصر بالا میبرد، تا عنصرهای بیرون از عنصری که خط زمان را تعریف کرده هم بتوانند دنبالش کنند. فهرستی از نامها، all یا none. فقط مرورگرهای مبتنی بر کرومیوم. [comma list of dashed idents / none, all] | جعبه:
دامنه خط زمان = "--card"
پاراگراف: محتوا = "هر عنصر درون من میتواند خط زمان card را به کار ببرد" پایان
پایان |
کارایی، گذار نما و اندازهها
| ویژگی | کار آن و مقدارهای قابل قبول | نمونه |
|---|---|---|
نام گذار نماview transition name view-transition-name | به عنصر برای گذار نما نامی میدهد، تا در گذار بهجای محو و آشکار شدن با باقی صفحه، از جا و اندازهی قدیمش به جدید جابهجا و مقیاس داده شود. نام باید در صفحه یکتا باشد. پیشفرض none است. [name / none] | جعبه:
عرض = 80
ارتفاع = 80
پس زمینه = "#0f766e"
نام گذار نما = hero
پایان |
تغییر پیشروwill change will-change | اشارهای که چند ویژگی میخواهند عوض شوند، تا مرورگر آماده شود. فهرستی از نام ویژگیها، مثل transform یا transform, opacity، یا auto. آن را روی چند عنصر و درست پیش از پویانماییشان به کار ببرید، چون هر اشاره حافظه میخورد. [name / auto; comma list] | جعبه:
عرض = 80
ارتفاع = 80
پس زمینه = "#14b8a6"
تغییر پیشرو = "transform"
گذار = "transform 300ms"
اشاره دگرگونی = "translateY(-10px)"
پایان |
کلاس گذار دیدview transition class view-transition-class | یک یا چند نام کلاس برای گذار نمای عنصر، تا یک قاعده مثل ::view-transition-group(*.card) بتواند چند عنصر با نامهای متفاوت را سبک دهد. پیشفرض none است. [space list of idents / none] | جعبه:
عرض = 80
ارتفاع = 80
پس زمینه = "#f59e0b"
نام گذار نما = tile-one
کلاس گذار دید = card
پایان |
میانیابی اندازهinterpolate size interpolate-size | میگذارد طولها میان یک عدد و کلمهای مثل auto، min-content یا max-content پویانمایی شوند. allow-keywords روشنش میکند و numeric-only پیشفرض است. ارثبر است و معمولاً یک بار روی :root گذاشته میشود. [numeric-only / allow-keywords] | جعبه:
میانیابی اندازه = "allow-keywords"
سرریز = hidden
ارتفاع = 40
گذار = "height 300ms"
اشاره ارتفاع = auto
محتوا = "وقتی اشاره میکنید ارتفاعم تا اندازهی متنم باز میشود"
پایان |
خودتان امتحان کنید
- دکمهی منویی بسازید که نمادش وقتی فشرده میشود ۹۰ درجه بچرخد، با
گذارو برنامهای کهچرخشرا عوض کند. - نمونهی نقطهها را به پنج نقطه، مدت ۰٫۸ ثانیه و
cubic-bezier(0.34, 1.56, 0.64, 1)تغییر دهید. اگرalternateرا بردارید چه عوض میشود؟ - نشانگری بنویسید که میچرخد و دکمهای که آن را میایستاند. بعد قاعدهی کاهش حرکت را اضافه کنید و با عوض کردن تنظیم سیستمتان آزمایشش کنید.
- صفحهای بلند بسازید و به هر بخشش پویانمایی نمایانشدن با
view()بدهید. بررسی کنید در مرورگری که اجرایش نمیکند هم صفحه کاملاً خواناست.