DEFENSIVE CSS

امیرعطا فرجی

علیرضا بینش

REMEMBER  TO WRAP YOUR FLEX.

01 >Ata! DEFENSIVE CSS

هر روزه از flex برای پیاده‌سازی انواع چیدمان‌ها استفاده می‌کنیم. اما گاهی اوقات بر اساس نیازهای زمان حال چیدمان را طراحی می‌کنیم و فکر آینده را نمی‌کنیم. در flex اگر تعداد فرزندها زیاد بشود ممکن است چیدمانمان به هم بریزد. با کد ساده flex-wrap: wrap; می‌توانیم این مشکل را حل کنیم.

.box {

    display: flex;

}
باکس ها در پدر خود جای نگرفته‌اند و بیرون هستند.

.box {

    display: flex;

    flex-wrap: wrap;

}
باکس‌ها به درستی درون پدر خود جای گرفته‌اند.

PREVENT IMAGE DISTORTION

02 >Ata! DEFENSIVE CSS

عکس‌ها از مهم‌ترین المان‌های هر وب‌سایتی هستند. اما ما کنترلی بر روی همه عکس‌های وب‌سایت و Aspect Ratio آن‌ها نداریم چون ممکن است از طرف کاربر آپلود شده باشند یا Back-end ما عکس‌هایی متفاوت نسبت به آنچه در ذهن داشتیم برایمان بفرستد. راحت‌ترین و بهترین کار قرار دادن object-fit: cover; بر عکس مربوطه است.

.img {

     // emptiness

}
عکس Aspect Ratio خود را از دست داده و غیر طبیعی دیده می‌شود.

.img {

    object-fit: cover;

    max-width: 100%;

}
با object-fit: cover عکس کل المان پدر خود را می‌گیرد و ابعاد عکس را به هم نمی‌ریزد.

DON'T
LET TEXT
WRAP OR OVERFL...

03 >Ata! DEFENSIVE CSS

در دنیای ایده‌آل، متن‌ها همگی به اندازه مناسبی هستند و همگی در المانی که تعبیه شده‌اند به خوبی جای می‌گیرند و از آن بیرون نمی‌زنند. اما در دنیای واقعی، ما باید آماده هر نوع متن با هر اندازه‌ای باشیم. برای این بهتر است تا حدی که المان پدر اجازه می‌دهد تا متن بدون آن که بشکند یا بیرون از آن قرار بگیرد، متن را نشان بدهیم و بقیه‌ آن را سه نقطه قرار بدهیم که با دستور text-overflow: ellipsis; قابل دستیابی می‌باشد.

.text {

     // emptiness

}

امیرعطا فرجی

علیرضا بینش

شرکت کداستار (زیر مجموعه مهیمن)

پارسا اروانه

مورد سوم در چند خط شکسته شده است و یکپارچگی طراحی را به هم میزند.

.text {

    white-space: nowrap;

    overflow: hidden;

    text-overflow: ellipsis;

}

امیرعطا فرجی

علیرضا بینش

شرکت کداستار (زیر مجموعه مهیمن)

پارسا اروانه

مورد سوم جمله رو نمی‌شکند و همچنین ادامه جمله را نشان نمی‌دهد و در آخر جمله سه نقطه نشان می‌دهد.

.text {

     // emptiness;

}

امیرعطا فرجی

علیرضا بینش

شرکتکاستار(زیرمجموعهمهیمن)

پارسا اروانه

مورد سوم یک کلمه بسیار طولانی است و جایی برای شکستن ندارد.

.text {

    overflow-wrap: break-word;

    min-width: 0;

}

امیرعطا فرجی

علیرضا بینش

شرکتکاستار(زیرمجموعهمهیمن)

پارسا اروانه

مورد سوم وقتی به انتهای المان پدرش می‌رسد، کلمه می‌شکند و به سطر بعدی می‌رود.

SET BACKGROUND COLORS FOR IMAGES

04 >Ata! DEFENSIVE CSS

بعضی وقت‌ها ممکن است نوشته‌ای را روی عکس قرار بدهیم. این کار مشکلی ندارد ولی اگر عکس load نشود و رنگ نوشته با رنگ پس‌زمینه نزدیک باشد و یا حتی هم‌رنگ باشد، آن موقع متن را به سختی می‌توان خواند. می‌توانیم با کد ساده‌ background-color: white; این مشکل را حل کنیم.

.img {

     // emptiness

}

ماشین سیاه

در این مورد عکس load شده است و متن خواناست.

ماشین سیاه

در این مورد عکس مورد نظر load نشده است و چون متن با پس زمینه رنگ نزدیکی دارد، متن خوانا نیست.

.img {

    background-color: var(--gradient-white, #fff);

}

ماشین سیاه

با این که عکسی load نشده است ولی چون رنگ پس‌زمینه دارد، متن خواناست.

INPUT ZOOM ON SAFARI

05 >Ata! DEFENSIVE CSS

مشکلی در مرورگر Safari گوشی‌ها وجود دارد و آن هم این مورد است که وقتی بر inputای می‌زنیم تا اطلاعاتمان رو وارد کنیم، صفحه زوم میشه تا آن input در مرکز توجه کاربر باشد. مشکل از جایی شروع می‌شود که نمی‌توانیم به عقب زوم کنیم. با اعمال سایز فونت ثابت
font-size: 16px; این مشکل را می‌توانیم حل کنیم.

.input {

     // emptiness

}
در حالت focus در Safari صفحه زوم می‌شود اما نمی‌توانیم زوم آن را کم کنیم.

.input {

    font-size: 16px;

}
با اعمال font-size از focus خودکار Safari می‌تونیم جلوگیری کنیم.

HOVER ON MOBILE DEVICES

06 >Ata! DEFENSIVE CSS

وقتی برای حالت hover استایل‌هایی را تعریف می‌کنیم، مخاطبمان از این کار کسانی هستند که از mouse یا trackpad استفاده می‌کنند. با موبایل هم حالت hover را با نیمه لمس کردن می‌شود فعال کرد اما نه تنها این فعال کردن خوب نیست بلکه می‌تواند به کاربر تجربه بدی بدهد. ما می‌توانیم با @media (hover: hover){ // code } این مشکل را برطرف کنیم.

@media (hover: hover) {

    .box::hover { // code }

}
این کارت را با موبایل، نمی‌توانیم حالت hoverش را فعال کنیم.

HIDDEN SCROLLBARS

07 >Alireza DEFENSIVE CSS

برای بعضی آیتم‌ها که محتوای طولانی دارند بهتر است که scrollbar قرار بدهیم. اما ممکن است متن ما متغیر باشد، و همیشه scrollbar به کارمان نیاید و در این حالت scrollbar نباید نشان داده بشود. اگر از دستور overflow-y: auto; استفاده کنیم، فقط در صورت نیاز scrollbar نشان داده می‌شود.

.box {

    overflow-y: scroll;

}
Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae facilis iure eveniet, commodi ducimus dolorum odio perferendis quibusdam accusamus amet repellendus. Eaque itaque voluptates nihil dicta quisquam omnis pariatur tempore.
Lorem ipsum dolor sit amet consectetur adipisicing elit.
حتی در جایی که متن قابل scroll نیست نیز scrollbar نشان داده می‌شود.

.box {

    overflow-y: auto;

}
Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae facilis iure eveniet, commodi ducimus dolorum odio perferendis quibusdam accusamus amet repellendus. Eaque itaque voluptates nihil dicta quisquam omnis pariatur tempore.
Lorem ipsum dolor sit amet consectetur adipisicing elit.
فقط جایی که به scroll نیاز داریم، scrollbar نشان داده می‌شود.

STICKY GRIDS

08 >Alireza DEFENSIVE CSS

ممکن است وقتی کل چینش سایت را با grid انجام داده‌اید، نیاز شده که قسمتی را sticky کنید، مثل منوی کناری. در این حالت خواهید دید که آن المان تمام ارتفاع کلی grid را می‌گیرد.
در این حالت باید با align-self: start; آن المان را از حالت پیش فرض stretch در بیاورید و به start تغییر بدهید.

.aside {

    position: sticky;

}

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eius, maxime labore dolores magni voluptates a obcaecati voluptatem ab necessitatibus doloremque quas! Vero ut amet delectus consectetur minus voluptas reiciendis cum nisi eum? Consequuntur minima temporibus ab dolore culpa pariatur itaque nesciunt tenetur unde cumque rerum aliquam id ullam, dolorem corrupti deserunt. Facilis autem veniam dicta sit eius deleniti necessitatibus at esse nulla id saepe accusantium eveniet illum exercitationem fugiat asperiores, perferendis iure repellendus? Nostrum animi harum dolorem molestiae laboriosam qui autem perferendis, nisi sed odio ratione. Minima at natus in sapiente reiciendis, veniam accusamus voluptas consectetur deleniti, voluptatum possimus ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Magnam est assumenda modi aspernatur obcaecati reiciendis error dolores, eum quasi ea.

منوی کناری ارتفاعی برابر با ارتفاع content گرفته است و خاصیت stickyاش کار نمی‌کند.

.aside {

    position: sticky;

    top: 1rem;

    align-self: start;

}

Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eius, maxime labore dolores magni voluptates a obcaecati voluptatem ab necessitatibus doloremque quas! Vero ut amet delectus consectetur minus voluptas reiciendis cum nisi eum? Consequuntur minima temporibus ab dolore culpa pariatur itaque nesciunt tenetur unde cumque rerum aliquam id ullam, dolorem corrupti deserunt. Facilis autem veniam dicta sit eius deleniti necessitatibus at esse nulla id saepe accusantium eveniet illum exercitationem fugiat asperiores, perferendis iure repellendus? Nostrum animi harum dolorem molestiae laboriosam qui autem perferendis, nisi sed odio ratione. Minima at natus in sapiente reiciendis, veniam accusamus voluptas consectetur deleniti, voluptatum possimus ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Magnam est assumenda modi aspernatur obcaecati reiciendis error dolores, eum quasi ea.
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Blanditiis eveniet explicabo odio ipsam reprehenderit officia corporis mollitia, omnis incidunt et rerum culpa molestiae perferendis expedita assumenda! Voluptatum molestiae accusamus ad laudantium beatae quo quas delectus explicabo vitae nobis ipsam similique facere officiis omnis rem cupiditate consequuntur quasi ipsum possimus impedit doloremque, necessitatibus error commodi? Quisquam aspernatur vero saepe dicta. Deleniti fuga quam ut alias accusamus quibusdam at culpa ex, ad, quaerat exercitationem nihil vero, iste optio nam animi. Expedita, veniam? Reiciendis accusantium consequatur accusamus illo dolor dolores odit alias quisquam dicta quas dolorum esse deleniti vel recusandae, cum eum nobis, error quo? Modi rem officiis architecto, ratione voluptates soluta veritatis excepturi libero cupiditate porro, dolores unde, id vitae minus! Hic, et reprehenderit omnis quas dolores sint similique doloribus eveniet velit cupiditate magnam necessitatibus enim maxime debitis odio nemo alias. Iusto non nobis consectetur consequuntur, ratione ut. Perferendis recusandae laboriosam blanditiis?

در این مورد منوی کناری position: sticky دارد و همراه با scroll ما پایین می‌آید.

WHY MY ::WEBKIT AND :MOZ DOESN'T WORK?

09 >Alireza DEFENSIVE CSS

بعضی وقت‌ها از vendorهایی مثل webkit یا moz استفاده می‌کنیم. در این حالت ممکن است چند vendor را با هم انتخاب کنیم تا استایل مشابه را به آن‌ها اعمال کنیم. اما این روش کار نمی‌کند و ممکن است اصلا بلافاصله متوجه نشوید و ساعت‌ها درگیر این موضوع بشوید. راه درست این است که جدا انتخابشان کنیم.
::webkit {} :moz {}

input::-webkit-input-placeholder,

input:-moz-placeholder {

    color: #222;

}
استایل color: #222 به هیچ کدام از selectorها اعمال نمی‌شود.

input::-webkit-input-placeholder {

    color: #222;

}

input:-moz-placeholder {

    color: #222;

}
در این مورد چون جدا selectشان کردیم، استایل مورد نظر ما اعمال می‌شود.

MIND YOUR SCROLLBAR

10 >Alireza DEFENSIVE CSS

ممکن است صفحه‌ای را با دقت زیادی طراحی کرده باشید ولی یادتان رفته باشد که scrollbarها هم فضا اشغال می‌کنند و موقعی که محتوا کمی زیاد شد و scrollbarها نشان داده شدند، چیدمان صفحه‌تان به هم خورده باشد. برای جلوگیری از این مشکل، کد
scrollbar-gutter: stable; رو به المان مد نظرتون اضافه کنید تا برای scrollbar فضا رزرو کند.

.element {

     // emptiness

}
Lorem ipsum dolor sitame consectetur adipisicing elit. Impedit facere fugit at rem! Facilis in distinctio nisi maiores harum recusandae unde esse repellat optio officia, et necessitatibus nam dolore. Distinctio similique nulla, quidem minus culpa debitis provident labore ipsam, explicabo exercitationem itaque.
Lorem ipsum dolor sitame consectetur adipisicing elit. Impedit facere!
به واژه آخر سطر اول دقت کنید. با اضافه شدن scrollbar عرض برای جای‌گیری محتوا کمتر شده است.

.element {

    scrollbar-gutter: stable;

}
Lorem ipsum dolor sitame consectetur adipisicing elit. Impedit facere fugit at rem! Facilis in distinctio nisi maiores harum recusandae unde esse repellat optio officia, et necessitatibus nam dolore. Distinctio similique nulla, quidem minus culpa debitis provident labore ipsam, explicabo exercitationem itaque.
Lorem ipsum dolor sitame consectetur adipisicing elit. Impedit facere!
با اضافه کردن این یک خط کد، خیالتان راحت است که که چیدمان صفحه‌تان دچار مشکل نمی‌شود.

AUTO-FILL
vs.
AUTO-FIT

11 >Alireza DEFENSIVE CSS

ممکن است در حین ایجاد grid بین دو کلیدواژه auto-fill و auto-fit بمانیم و در آخر شانسی یکی را انتخاب کنیم. ممکن است بعد از چند وقت، چیدمان صفحه‌مان یک سری رفتارهایی از خود نشان بدهد که ندانیم از کجا ناشی می‌شوند. مثل المان‌هایی با عرض خیلی زیاد که می‌تواند نتیجه انتخاب نادرست ما باشد. به طور کلی اگر از
repeat(auto-fill, minmax(250px, 1fr));
استفاده کنیم کمتر چنین مشکلاتی پیش می‌آید.

.wrapper {

    display: grid;

    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));

    grid-gap: 10px;

}
در auto-fit اگر المانی در کل سطر grid باشد، کل آن فضا را می‌گیرد و می‌تواند چیدمان کارت‌‌ها رو به هم بریزد.

.wrapper {

    display: grid;

    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));

    grid-gap: 10px;

}
اما در auto-fill حتی اگر فقط یک المان فرزند در یک سطر وجود داشته باشد، باز هم تمام فضا را نمی‌گیرد

SCROLL!
DON'T SCROLL!

12 >Alireza DEFENSIVE CSS

ممکن است شما هم در سایتی صفحه modalای یا inputای که متن و محتوای طولانی‌ای دارد و قابل scrollاست را می‌خوانید که scroll می‌کنید و به آخر می‌رسید و بعد آن صفحه اصلی شروع به scroll کردن می‌کند. این UX بدی می‌باشد و می‌توانیم با کد
overscroll-behavior-y: contain;
این مشکل را برطرف کنیم.

.modal {

     // emptiness;

}
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae nihil doloribus ratione non, voluptatem quos veritatis cum, praesentium illo unde fugiat officiis vitae nisi omnis, odit excepturi corrupti quasi iste minima ullam fuga eos quidem ex molestias! Dolore, temporibus illum assumenda aliquam, laudantium architecto reiciendis nesciunt quia expedita deserunt veniam. Id unde soluta tempore commodi molestiae mollitia inventore culpa quod in. Ipsa, esse, veniam dolorum placeat incidunt odio ex nam tempore, temporibus totam id explicabo fuga sunt sapiente hic veritatis. Voluptates ipsa dolores ullam perspiciatis nemo nesciunt ipsum est assumenda eius neque numquam voluptas ut natus, impedit illo quaerat maxime cum perferendis recusandae aut optio dolore fuga. Inventore doloremque animi voluptatibus itaque, tenetur ex sunt libero ducimus molestias voluptate cum. Id, tempore quos impedit nesciunt voluptate magni quasi dolore cum et culpa, ipsum in repellendus soluta quibusdam dolores illum. Dignissimos dolore est, sint earum repellendus explicabo rem nisi facilis dolor.
Odit sequi accusamus deleniti! Ab sit tenetur iusto? Quibusdam eligendi sed pariatur sapiente iure. Facilis iste maxime harum laboriosam, explicabo magni! Quasi iste pariatur, porro fugiat animi harum, nemo illum sint repellendus quidem beatae sequi. A, magnam alias.
در این حالت، بعد از اتمام scroll پنجره بالایی، پنجره پایینی شروع به scroll خوردن می‌کند.

.modal {

    overscroll-behavior-y: contain;

}
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae nihil doloribus ratione non, voluptatem quos veritatis cum, praesentium illo unde fugiat officiis vitae nisi omnis, odit excepturi corrupti quasi iste minima ullam fuga eos quidem ex molestias! Dolore, temporibus illum assumenda aliquam, laudantium architecto reiciendis nesciunt quia expedita deserunt veniam. Id unde soluta tempore commodi molestiae mollitia inventore culpa quod in. Ipsa, esse, veniam dolorum placeat incidunt odio ex nam tempore, temporibus totam id explicabo fuga sunt sapiente hic veritatis. Voluptates ipsa dolores ullam perspiciatis nemo nesciunt ipsum est assumenda eius neque numquam voluptas ut natus, impedit illo quaerat maxime cum perferendis recusandae aut optio dolore fuga. Inventore doloremque animi voluptatibus itaque, tenetur ex sunt libero ducimus molestias voluptate cum. Id, tempore quos impedit nesciunt voluptate magni quasi dolore cum et culpa, ipsum in repellendus soluta quibusdam dolores illum. Dignissimos dolore est, sint earum repellendus explicabo rem nisi facilis dolor.
Odit sequi accusamus deleniti! Ab sit tenetur iusto? Quibusdam eligendi sed pariatur sapiente iure. Facilis iste maxime harum laboriosam, explicabo magni! Quasi iste pariatur, porro fugiat animi harum, nemo illum sint repellendus quidem beatae sequi. A, magnam alias.
در این حالت scroll فقط برای بخشی اعمال می‌شود که نشانگر موس بر روی آن می‌باشد.