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

استاد چیدمان
فرض کنید ما یک عنصر با position: fixed. اگر پیمایش وجود داشته باشد، متوجه خواهید شد که وقتی به مرز پایین عنصر برسید، مرورگر به حرکت روی عنصر بدنه ادامه خواهد داد. این یک اثر ناخواسته و گیج کننده است. خوشبختانه، ما می توانیم این مشکل را با CSS حل کنیم.
در این مقاله نگاهی خواهیم داشت overscroll-behavior یک ویژگی CSS، مشکلی که حل می کند چیست، چگونه کار می کند و کجا می توانیم از آن استفاده کنیم.
مقدمه
بیایید یک مشکل بسیار رایج را در نظر بگیریم. ما یک دیالوگ مودال داریم که در مرکز نما قرار دارد. در زیر این مدال محتوای واقعی صفحه وب است.

وقتی به پایان محتوای مودال رسیدیم، مرورگر به جای آن به پیمایش به محتوای صفحه اصلی ادامه میدهد. اسمش همینه پیمایش زنجیره ای. این یک رفتار پیشفرض است که اکنون میتوان با یک ویژگی CSS جدید به نام آن را لغو کرد overscroll-behavior.

این رفتار اغلب غیرضروری است و می تواند تمرکز کاربر را از تمرکز بر محتوای مودال منحرف کند. در شکل بالا، توجه کنید که چگونه وقتی به انتهای مدال رسیدیم، صفحه به حرکت ادامه داد.
راه حل قدیمی و هک
ما آن را با درخواست رفع کردیم overflow: hidden روی عنصر بدنه از طریق جاوا اسکریپت. هنگامی که یک مدال باز می شود، یک کلاس به بدنه اضافه می کنیم که وظیفه اجرای سرریز را بر عهده دارد.
body.modal-open {
overflow: hidden;
}
.modal.is-open {
display: block;
}
این راه حل در مرورگرهای دسکتاپ کاملاً کار می کرد، اما Safari در iOS آن را دوست نداشت. برای اینکه کار کند، باید اضافه کنیم position: fixed به عنصر بدن
body.modal-open {
position: fixed;
overflow: hidden;
}
.modal.is-open {
display: block;
}
این کار می کند، اما باعث می شود مرورگر به سمت بالا حرکت کند و حواس کاربر را از کار در دست منحرف کند. این یک راه حل است که مشکلات دیگری را معرفی می کند. من راه حل دیگری برای این موضوع نمی شناسم به جز راه حلی که بن فرین در این مقاله پین کرده است.
با توجه به قطعه مقاله بن، موارد زیر باید در قسمت اضافه شود element once the modal is active.
.bg-scrolling-element-when-modal-active {
touch-action: none;
-webkit-overflow-scrolling: none;
overflow: hidden;
overscroll-behavior: none;
}
به یاد دارم که در سال 2018 روی یک پروژه مشتری کار کردم که در آن به او گفتم که نمیتوانیم از پیمایش بدنه برای منوی موبایل iOS جلوگیری کنیم. او پاسخ داد:
هیچ چیز در برنامه نویسی غیر ممکن نیست. مطمئنم راه حلی هست
“برنامه نویسی” در این مورد به CSS اشاره دارد، در صورتی که شما تعجب کنید. من به تلاش و تحقیق زیاد ادامه دادم اما راه حل کاملی نداشتم. می خواهم به گذشته برگردم و شما را معرفی کنم overscroll-behavior به راه حل
را overscroll-behavior ویژگی تعیین می کند که وقتی به مرز یک منطقه قابل پیمایش می رسیم مرورگر باید چه کاری انجام دهد. در تمام مرورگرهای اصلی به جز سافاری پشتیبانی می شود. اموال مختصر است overscroll-behavior-x و overscroll-behavior-y.
به این تنظیم توجه کنید overscroll-behavior هر دو محور را تنظیم خواهد کرد. بیایید وارد مقادیر ممکن شویم.
overscroll-behavior: auto
مقدار پیش فرض است auto، که امکان پیمایش زنجیره ای را فراهم می کند. وقتی یک عنصر قابل پیمایش داریم و به مرز آن یعنی مرورگر می رسیم ادامه خواهد یافت پیمایش در content.

And here is a video that shows it better:
overscroll-behavior: contain
از نام او، ارزش contain خواهد شد حاوی پیمایش در مرز عنصر در شکل زیر، طومار درون پاکت مشخص شده با رنگ آبی قرار دارد.

و در اینجا یک ویدیو است که آن را بهتر نشان می دهد:
overscroll-behavior: none
چه زمانی none تنظیم شده است اثری مشابه دارد contain، ** علاوه بر این** برای جلوگیری از جلوه جهش در هنگام رسیدن به بالا یا پایین صفحه.
از موارد و مثال استفاده کنید
حالا که ایده ای دارید که چگونه overscroll-behavior کار می کند، اجازه دهید به چند مورد استفاده مفید نگاه کنیم.
ناوبری موبایل
هنگامی که پیمایش تلفن همراه بیش از حد طولانی است، پیمایش خیلی سریع می تواند باعث ایجاد مشکل در زنجیره محتوای اصلی شود. در شکل زیر یک لیست پیمایشی طولانی داریم.

اگر اسکرول موجود نباشد، باعث می شود محتوای اصلی پیمایش شود. ما می توانیم از این امر اجتناب کنیم
.nav {
overscroll-behavior-y: contain;
overflow-y: auto;
}
بیایید آن را در ویدیو ببینیم. من یک پسزمینه نیمه شفاف اضافه کردهام تا ناوبری بتواند زیر آن را ببیند. دقت کنید وقتی خاموشش می کنم چگونه رفتار می کند overscroll-behavior-y دارایی
وقتی خاموش شود، پیمایش بدنه اتفاق میافتد.
نکته جالبی که باید در نظر داشت این است که وقتی پیمایش کوتاه است (و در نتیجه قابل پیمایش نیست) و کاربر بدون دلیل سعی کرده است پیمایش کند، بدن حتی اگر پیمایش کند overscroll-behavior-y: contain تنظیم شده است.
متأسفانه، راه حل دیگری به جز «هکهایی» که در ابتدای مقاله ارائه شد، نمیدانم.
ناوبری جانبی
یکی دیگر از کاربردهای مفید برای overscroll-behavior زمانی است که شما یک سایدبار و یک نوار اصلی دارید. در این حالت، نوار کناری ثابت است و اگر محتوای آن بیش از حد طولانی باشد، ممکن است قابل پیمایش باشد.

برای جلوگیری از پیمایش بخش اصلی با رسیدن به حد نهایی نوار کناری، باید موارد زیر را اضافه کنیم:
.aside {
overscroll-behavior-y: contain;
}
جزء چت

با الهام از فیس بوک، جزء چت یک مورد استفاده عالی است overscroll-behavior. ما می توانیم از آن برای جلوگیری از پیمایش بدنه زمانی که به انتهای آن رسیدیم استفاده کنیم.
.aside {
overscroll-behavior-y: contain;
}
محتوای مودال
اولین مثالی که در مقاله به آن پرداختم یک مودال است، بنابراین آن را تکرار نمی کنم. با این حال، مواردی وجود دارد که ممکن است به یک لیست در یک مدال نیاز داشته باشیم، و زمانی که آن لیست قابل پیمایش است، ما نمی خواهیم پیمایش زنجیره ای اتفاق بیفتد.

به لیست گزینه های موجود در مدال توجه کنید. این یک لیست قابل پیمایش است. اگر به حد آن برسیم، محتوای مدال اسکرول میشود. برای جلوگیری از این، می توانیم استفاده کنیم overscroll-behavior.
.list-wrapper {
overscroll-behavior-y: contain;
overflow-y: auto;
max-height: 130px;
}
لیست افقی
من متوجه این مورد استفاده در صفحه اصلی فیس بوک شدم. برگه ای وجود دارد که لیستی از کاربران دارد و همانطور که در شکل زیر می بینید به صورت افقی حرکت می کند.

این یک استفاده خوب برای overscroll-behavior-x.
.list {
overscroll-behavior-x: contain;
}
نتیجه گیری
CSS overscroll-behavior یک ویژگی مفید است که مشکلی را که سال ها پیش هک می کردیم را حل می کند. امیدوارم از این مقاله چیز جدیدی یاد گرفته باشید.
آیا موارد استفاده مفید دیگری برای آن می شناسید؟ اگر چنین است، من دوست دارم از شما در توییتر @shadeed9 بشنوم.


