پادکست CSS - 009: Layout
تصور کنید که به عنوان یک توسعه دهنده کار می کنید و یک همکار طراح طراحی یک وب سایت کاملاً جدید را به شما می دهد. این طرح دارای انواع چیدمان ها و ترکیب بندی های جالب است: چیدمان های دو بعدی که به عرض و ارتفاع درگاه دید توجه می کنند، و همچنین طرح هایی که باید روان و انعطاف پذیر باشند. چگونه بهترین راه برای استایل دادن به اینها با CSS را انتخاب می کنید؟
CSS راههای مختلفی را برای حل مسائل طرحبندی، در محور افقی، محور عمودی یا حتی هر دو در اختیار ما قرار میدهد. انتخاب روش چیدمان مناسب برای یک زمینه ممکن است سخت باشد، و اغلب ممکن است برای حل مشکل خود به بیش از یک روش چیدمان نیاز داشته باشید. برای کمک به این امر، در ماژولهای زیر، با ویژگیهای منحصربهفرد هر مکانیزم طرحبندی CSS برای اطلاع از آن تصمیمها آشنا میشوید.
چیدمان: تاریخچه مختصر
در روزهای اولیه وب، طرح های پیچیده تر از یک سند ساده با عناصر <table>
طراحی می شدند. جداسازی HTML از سبک های بصری زمانی که CSS به طور گسترده توسط مرورگرها در اواخر دهه 90 مورد استفاده قرار گرفت، آسان تر شد. CSS راه را برای توسعه دهندگان باز کرد که بتوانند ظاهر و احساس یک وب سایت را بدون دست زدن به HTML کاملاً تغییر دهند. این قابلیت جدید الهامبخش پروژههایی مانند The CSS Zen Garden است که برای نشان دادن قدرت CSS برای تشویق توسعهدهندگان بیشتر به یادگیری آن ایجاد شده است.
CSS با توجه به نیازهای ما برای طراحی وب و فناوری مرورگر تکامل یافته است. میتوانید در این مقاله توسط ریچل اندرو مطالعه کنید که چگونه طرحبندی CSS و رویکرد ما به چیدمان در طول زمان تکامل یافته است.
چیدمان: حال و آینده
CSS مدرن دارای ابزار طرح بندی فوق العاده قدرتمندی است. ما سیستمهای اختصاصی برای چیدمان داریم و قبل از بررسی جزئیات بیشتر Flexbox و Grid در ماژولهای بعدی، نگاهی سطح بالا به آنچه در اختیار داریم، خواهیم داشت.
درک ویژگی display
ویژگی display
دو کار را انجام می دهد. اولین کاری که انجام می دهد این است که مشخص می کند جعبه ای که روی آن اعمال می شود به صورت خطی عمل می کند یا بلوک.
.my-element {
display: inline;
}
عناصر درون خطی مانند کلمات در یک جمله رفتار می کنند. در جهت خطی کنار هم می نشینند. عناصری مانند <span>
و <strong>
، که معمولاً برای استایل دادن به قطعات متن در داخل عناصری مانند <p>
(پاراگراف) استفاده میشوند، بهطور پیشفرض درون خط هستند. آنها همچنین فضای سفید اطراف را حفظ می کنند.
شما نمی توانید عرض و ارتفاع صریح را روی عناصر درون خطی تنظیم کنید. هر گونه حاشیه سطح بلوک و بالشتک توسط عناصر اطراف نادیده گرفته می شود.
.my-element {
display: block;
}
عناصر بلوک در کنار یکدیگر قرار نمی گیرند. آنها یک خط جدید برای خود ایجاد می کنند. مگر اینکه توسط کدهای CSS دیگر تغییر کند، یک عنصر بلوک به اندازه بعد درون خطی گسترش می یابد، بنابراین در حالت نوشتن افقی، تمام عرض را در بر می گیرد. حاشیه در هر طرف یک عنصر بلوک رعایت خواهد شد.
.my-element {
display: flex;
}
ویژگی display
همچنین تعیین می کند که فرزندان یک عنصر چگونه باید رفتار کنند. به عنوان مثال، تنظیم ویژگی display
برای display: flex
جعبه را به یک جعبه در سطح بلوک تبدیل میکند و همچنین فرزندان آن را به آیتمهای flex تبدیل میکند. این ویژگیهای انعطافپذیر را فعال میکند که تراز، ترتیب و جریان را کنترل میکنند.
فلکس باکس و گرید
دو مکانیزم چیدمان اصلی وجود دارد که قوانین چیدمان را برای چندین عنصر ایجاد می کند، flexbox و grid . آنها شباهت های مشترکی دارند، اما برای حل مشکلات طرح بندی مختلف طراحی شده اند.
فلکس باکس
.my-element {
display: flex;
}
Flexbox مکانیزم چیدمان برای چیدمان های یک بعدی است. چیدمان در یک محور، به صورت افقی یا عمودی. بهطور پیشفرض، flexbox فرزندان عنصر را در جهت درونی در کنار یکدیگر تراز میکند و آنها را در جهت بلوک میکشد، بنابراین ارتفاع همه آنها یکسان است.
اقلام در همان محور باقی می مانند و در صورت تمام شدن فضا بسته نمی شوند. در عوض، آنها سعی خواهند کرد تا روی خطی مشابه یکدیگر قرار گیرند. این رفتار را می توان با استفاده از ویژگی های align-items
، justify-content
و flex-wrap
تغییر داد.
Flexbox همچنین عناصر فرزند را به آیتمهای انعطافپذیر تبدیل میکند، به این معنی که میتوانید قوانینی در مورد نحوه رفتار آنها در یک ظرف انعطافپذیر بنویسید. شما می توانید تراز، ترتیب و توجیه را در یک مورد جداگانه تغییر دهید. همچنین می توانید نحوه کوچک شدن یا رشد آن را با استفاده از ویژگی flex
تغییر دهید.
.my-element div {
flex: 1 0 auto;
}
ویژگی flex
مختصری برای flex-grow
، flex-shrink
و flex-basis
است. می توانید مثال بالا را به این صورت گسترش دهید:
.my-element div {
flex-grow: 1;
flex-shrink: 0;
flex-basis: auto;
}
توسعهدهندگان این قوانین سطح پایین را ارائه میکنند تا به مرورگر اشاره کنند که وقتی طرحبندی با ابعاد محتوا و دید به چالش کشیده میشود، چگونه باید رفتار کند. این باعث می شود که مکانیزم بسیار مفیدی برای طراحی وب سایت واکنش گرا باشد.
شبکه
.my-element {
display: grid;
}
Grid از بسیاری جهات مشابه flexbox است، اما برای کنترل طرحبندیهای چند محوره به جای طرحبندیهای تک محوره (فضای عمودی یا افقی) طراحی شده است.
Grid شما را قادر می سازد تا قوانین چیدمان را روی عنصری بنویسید که دارای display: grid
، و چند اصل اولیه جدید برای استایل چیدمان معرفی می کند، مانند توابع repeat()
و minmax()
. یکی از واحدهای شبکه مفید، واحد fr
است - که کسری از فضای باقیمانده است - می توانید شبکه های سنتی 12 ستونی، با فاصله بین هر آیتم، با 3 ویژگی CSS بسازید:
.my-element {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 1rem;
}
این مثال بالا یک طرح تک محوری را نشان می دهد. در جایی که flexbox بیشتر با اقلام به عنوان یک گروه برخورد می کند، شبکه به شما کنترل دقیقی بر روی قرارگیری آنها در دو بعد می دهد. میتوانیم تعریف کنیم که اولین مورد در این شبکه 2 ردیف و 3 ستون دارد:
.my-element :first-child {
grid-row: 1/3;
grid-column: 1/4;
}
ویژگیهای grid-row
و grid-column
به اولین عنصر در شبکه دستور میدهد تا از ابتدای ستون چهارم، از ستون اول، سپس به ردیف سوم، از سطر اول باز شود.
طرح جریان
اگر از شبکه یا فلکس باکس استفاده نمی کنید، عناصر شما در جریان عادی نمایش داده می شوند. تعدادی روش چیدمان وجود دارد که می توانید از آنها برای تنظیم رفتار و موقعیت آیتم ها در جریان عادی استفاده کنید.
بلوک درون خطی
به یاد داشته باشید که چگونه عناصر اطراف به حاشیه بلوک و بالشتک روی یک عنصر درون خطی احترام نمی گذارند؟ با inline-block
می توانید این اتفاق را ایجاد کنید.
p span {
display: inline-block;
}
استفاده از inline-block
کادری را به شما میدهد که برخی از ویژگیهای یک عنصر سطح بلوک را دارد، اما همچنان با متن جریان دارد.
p span {
margin-top: 0.5rem;
}
شناورها
اگر تصویری دارید که در یک پاراگراف از متن قرار میگیرد، آیا این کار مفیدی نیست که آن متن در اطراف آن تصویر بپیچد، همانطور که ممکن است در روزنامه ببینید؟ شما می توانید این کار را با شناور انجام دهید.
img {
float: left;
margin-right: 1em;
}
ویژگی float
به یک عنصر دستور می دهد تا در جهت مشخص شده "شناور" شود. به تصویر در این مثال دستور داده شده که به سمت چپ شناور شود، که سپس به عناصر خواهر و برادر اجازه میدهد تا دور آن بپیچند. شما می توانید به یک عنصر دستور دهید که left
، right
یا inherit
شناور شود.
طرح چند ستونی
اگر شما یک لیست واقعا طولانی از عناصر، مانند لیستی از تمام کشورهای جهان دارید، می تواند منجر به پیمایش زیاد و اتلاف وقت برای کاربر شود. همچنین می تواند فضای خالی اضافی در صفحه ایجاد کند. با CSS چند ستونی، می توانید آن را به چندین ستون تقسیم کنید تا به هر دوی این مسائل کمک کنید.
<h1>All countries</h1>
<ul class="countries">
<li>Argentina</li>
<li>Aland Islands</li>
<li>Albania</li>
<li>Algeria</li>
<li>American Samoa</li>
<li>Andorra</li>
…
</ul>
.countries {
column-count: 2;
column-gap: 1em;
}
این به طور خودکار لیست طولانی را به دو ستون تقسیم می کند و یک شکاف بین دو ستون اضافه می کند.
.countries {
width: 100%;
column-width: 260px;
column-gap: 1em;
}
بهجای تنظیم تعداد ستونهایی که محتوا به آنها تقسیم میشود، میتوانید با استفاده از column-width
، حداقل عرض دلخواه را نیز تعریف کنید. با در دسترس قرار گرفتن فضای بیشتر در viewport، ستون های بیشتری به طور خودکار ایجاد می شوند و با کاهش فضا، ستون ها نیز کاهش می یابد. این در زمینه های طراحی وب واکنش گرا بسیار مفید است.
موقعیت یابی
آخرین مورد در این نمای کلی از مکانیسم های چیدمان، موقعیت یابی است. ویژگی position
نحوه رفتار یک عنصر در جریان عادی سند و نحوه ارتباط آن با سایر عناصر را تغییر می دهد. گزینه های موجود relative
, absolute
, fixed
و sticky
هستند و مقدار پیش فرض static
است .
.my-element {
position: relative;
top: 10px;
}
این عنصر بر اساس موقعیت فعلی خود در سند، 10 پیکسل به پایین به سمت پایین هدایت می شود، زیرا نسبت به خودش قرار دارد. افزودن position: relative
به یک عنصر همچنین آن را به بلوک حاوی هر عنصر فرزند با position: absolute
تبدیل می کند. این بدان معناست که فرزندش اکنون به جای بالاترین نسبی والد، زمانی که یک موقعیت مطلق برای آن اعمال می شود، به این عنصر خاص تغییر مکان می دهد.
.my-element {
position: relative;
width: 100px;
height: 100px;
}
.another-element {
position: absolute;
bottom: 0;
right: 0;
width: 50px;
height: 50px;
}
وقتی position
روی absolute
تنظیم میکنید، عنصر را از جریان سند جاری خارج میکند. این یعنی دو چیز:
- میتوانید این عنصر را در هر کجا که دوست دارید، با استفاده از
top
،right
،bottom
وleft
در نزدیکترین والد نسبی آن قرار دهید. - تمام محتوای احاطه کننده یک عنصر مطلق دوباره جریان می یابد تا فضای باقی مانده از آن عنصر را پر کند.
عنصری با مقدار position
fixed
رفتاری مشابه با absolute
دارد و والد آن عنصر ریشه <html>
است. عناصر موقعیت ثابت بر اساس مقادیر top
، right
، bottom
و left
که تنظیم کردهاید، از بالا سمت چپ ثابت میمانند.
میتوانید با استفاده از sticky
به جنبههای ثابت، fixed
و جنبههای قابل پیشبینیتر مربوط به تکریم جریان اسناد relative
دست پیدا کنید. با استفاده از این مقدار، همانطور که درگاه دید از کنار عنصر عبور می کند، به مقادیر top
، right
، bottom
و left
که شما تنظیم کرده اید ثابت می ماند.
جمع بندی
انتخاب و انعطاف پذیری زیادی با طرح بندی CSS وجود دارد. برای غواصی بیشتر در قدرت CSS Flexbox و Grid ، به چند ماژول بعدی ادامه دهید.
درک خود را بررسی کنید
دانش خود را در مورد چیدمان تست کنید
ویژگی display
چه 2 کار را انجام می دهد؟
inline
یا block
یا none
را تعیین می کند.برای جریان دادن چند پاراگراف به ستون ها، کدام ویژگی CSS برای این کار بهتر است؟
display: flex
display: grid
column-count
float
اگر یک بلوک از جریان خارج شود به چه معناست؟
top
یا left
داده شده است.Flexbox و Grid فرزندان خود را به طور پیش فرض بسته بندی می کنند؟