یادگیری CSS Flexbox برای ساخت 5 طرح بندی ریسپانسیو

دوشنبه 23 فروردین 1400

در اینجا یک راهنمای کاربردی است که به شما کمک می‌کند CSS Flexbox در سال 2021 را با ساخت 5 لایه ریسپانسیو بسازید.

یادگیری CSS Flexbox برای ساخت 5 طرح بندی ریسپانسیو

Flexbox چیست؟

ما در هنگام ساخت خانه به یک نقشه اولیه نیاز داریم. به همین ترتیب، برای طرح‌بندی محتوای خود در بین مرورگرمان به نقشه اولیه نیاز داریم. گاهی اوقات ما باید طرح‌های ریسپانسیو را برای سایزهای مختلف صفحه بسازیم.

این چیزی است که Flexbox در انجام آن به ما کمک می‌کند، یعنی ساخت طرح بندی‌های ریسپانسیو.

معماری Flexbox

خوب معماری Flexbox چطور کار می‌کند؟ محتواها (flex-items) در طول محور اصلی (Main Axis) و محور متقاطع (Cross Axis) توزیع می‌شوند. و بسته به پراپرتی flex-direction، موقعیت طرح‌ بندی بین ستون ها و ردیف ها را تغییر می‌دهند.

پیش نیازها

قبل از شروع کار باید کمی HTML و CSS را بلد باشید. با این آموزش، شما یاد می‌گیرید Flexbox چطور کار می‌کند، پراپرتی‌ها و مقادیر مختلف آن چطور کار می‌کند، و مدیا کوئری‌ ها چطور کار می‌کنند (که به ما در ساخت وب سایت ‌های ریسپانسیو کمک می‌کند).

مراحل پروژه

قبل از کدنویسی، ما باید یکسری مقادیر را در متغیرها ذخیره کرده و استایل‌های پیش فرض مرورگر را پاک کنیم. همراه با این کار، باید یکسری media query mixins را تعریف کنیم تا در زمان صرفه جویی کرده و از تکرار کد جلوگیری کنیم.

SCSS چیست؟

SCSS یک پیش پردازنده از CSS است که نسبت به CSS قابلیت ‌های زیادی را به ما می‌دهد.

مثلا، ما می‌توانیم کلاس‌های child (فرزند) را در کلاس‌های parent (والد) قرار دهیم، مقادیر را در متغیرها ذخیره کنیم، و بسیاری موارد دیگر. این کار واقعا به ما کمک می‌کند تا در وقت خود صرفه جویی کنیم.

بیاید کار را با SCSS شروع کنیم. CodePen یا هر ویرایشگر کدی که دارید را باز کنید، و این مراحل قدم به قدم را همراه با ما پیش روید.

چطور SCSS را در CodePen فعال کنیم

به تنظیمات CSS بروید، و از قسمت CSS Preprocessor دراپ دان را باز کرده و SCSS را انتخاب کرده و دکمه Save & Close را بزنید.

اول مقادیر border color، gap و padding را در متغیرهای خود تعریف کنید.

$gap : 4vh;
$padding : 4vh;
$color : #48CAE4;

سپس برک پوینت‌های مختلف صفحه را در SCSS map  تعریف کنید. به خاطر دارید، در mobile، tablet ،scss map و desktop کلیدها هستند و پیکسل‌ها مقادیر هستند.

$bp : (
  mobile : 480px,
  tablet : 768px,
  desktop : 1440px,
);

برای صرفه جویی در زمان و کد، وقتی مدیا کوئری ها تعریف می‌شوند، ما ازmixin  و حلقه در برک پوینت‌هایی که در بالا تعریف کردیم استفاده می‌کنیم.

@mixin query($display){
  @each $key, $value in $bp{
    
    //  defining max-width
    @if ($display == $key){
      @media (max-width: $value){@content;}
    }
  }
}

حالا ما باید استایل های پیش فرض مرورگر را تغییر می‌دهیم. Margin و padding را تغییر می‌دهیم و box-sizing را با border-box ست می‌کنیم.

//Changing The Default Settings..

*{
  margin:0px;
  padding: 0px;
  box-sizing: border-box;
  
// Changing the body here

  body{
    width: 100%;
    min-height: 100vh;
    font-family: sans-serif;
    font-size: 45px;
  }
}

بیاید در مورد روابط بین کلاس‌های HTML ای که می‌خواهیم استفاده کنیم صحبت کنیم. همیشه به خاطر داشته باشید که Flexbox بر روی کلاس‌های child کار می‌کند.

مثلا، پراپرتی‌های Flexbox در Container class که بر روی Block کار می‌کنند تعریف می‌شوند و پراپرتی های تعریف شده در Block class بر روی Box class کار می‌کنند.

در اینجا یک توضیح تصویری از آنچه که گفتیم آورده شده است:

حالا بیاید این طرح‌ها را بسازیم. با آسان‌ترین سطح از نظر دشواری شروع می‌کنیم و به سمت طرح ‌های پیشرفته تر پیش می‌رویم.

سطح یک، نحوه ساخت Card Layout

HTML

container class سه تا فرزند را نگه می‌دارد: block-1، block-2 و block-3.

کلاس block-1 سه تا باکس را حمل خواهد کرد: box-1، box-2 و box-3.

همین قوانین برای کلاس‌های block-2 و block-3 هم اعمال می‌شود، اما مقادیر تغییر می‌کنند.

<div class="container">

<!--block-1 has 3 children, box-1,box-2,box-3 -->

  <div class="block-1">
    <div class="box-1"> A </div>
    <div class="box-2"> B </div>
    <div class="box-3"> C </div>
  </div>

<!--similar to block-1, values are changed -->

  <div class="block-2">
    <div class="box-4"> D </div>
    <div class="box-5"> E </div>
    <div class="box-6"> F </div>
  </div>

<!--similar to block-1, values are changed -->

  <div class="block-3">
    <div class="box-7"> G </div>
    <div class="box-8"> H </div>
    <div class="box-9"> I </div>
  </div>
</div>

SCSS

حالا ما به استایل کلاس container مان می‌رویم. به خاطر دارید، برای فعال کردن Flexbox و دسترسی به تمام قدرت‌های آن، باید display: flex; را بنویسید، به این صورت:

// Style rules for container class

.container{
  display: flex;

//to lay .block-* classes in a column
  flex-direction: column;

//Setting gap between the .block-* classes
  gap: $gap;
  
// to set some padding &amp;amp;amp;amp;amp; border inside
  padding: $padding;
  border: 1vh solid $color;
}

همه کلاس‌های . block-* را انتخاب کرده و با یکدیگر استایل دهی کنید. همزمان، در پایین، ما مدیا کوئری‌ها را با استفاده از mixin که در طول مرحله تنظیمات ساختیم تعریف می‌کنیم.

[class ^="block-"]{

//To lay the boxes in a row.
  display: flex;
  flex-direction: row;

//Removing border(1vh+1vh), gap, &amp;amp;amp;amp;amp; padding from the height
// And then equally distributing spaces between the 
// .block-* classes by dividing it by 3

  height: (100vh-2vh -$gap*2-$padding*2) / 3;

// putting gap between .box-* classes
  gap: $gap;
  
// Style rules for mobile display

  @include query (mobile){
    flex-direction: column;
    
// you can pick any value you wish.
    height: 500px;
  }
  
}

سپس همه کلاس‌های .box-* را انتخاب کرده و آن‌ها را با یکدیگر استایل دهی می‌کنیم، به این صورت:

[class ^="box-"]{
  
// To set the text at center of every box
  display: flex;
  justify-content: center;
  align-items: center;
  
// To divide spaces among the boxes
// try flex-gap:1; you can see the difference.
// flex-grow: 1; // 1+1+1 =3 => 1/3 X 100% => 33.33% each

  flex-basis: (100%)/3; // 33.33% each
  border : 2px solid black;
  border-radius: 10px;
  background-color: #c1c1c1;
}

سطح دو، نحوه ساخت Nav Bar Layout

HTML

کد HTML از سطح یک را حذف کرده و به جای آن این کد را بنویسید. اساسا این یک کلاس والد با 4 کلاس فرزند است.

<div class="container">
  <div class="item-1"> Home </div>
  <div class="item-2"> About </div>
  <div class="item-3"> Services </div>
  <div class="item-4"> Contact </div>
</div>

SCSS

در اینجا قوانین استایل برای کلاس container برای سطح دو است. در پایین، ما یک مدیا کوئری را با استفاده از mixin تعریف کردیم.

.container{
  font-size: 35px;
  display: flex;

//To set orientation of the items
  flex-direction: row;

// To distribute available space
  justify-content: space-evenly;
  padding: $padding;
  border : 1vh solid $color;

// style rules starts from Tablet Screens
  @include query(tablet){
    height : 100vh;
//Changing orientation of the items
    flex-direction: column;
    align-items: center;

//Setting gap for items Vertically
    gap: $gap 
  }
}

سطح سه، نحوه ساخت Sidebar Layout

HTML

حالا ما با این بلوک کد کار می‌کنیم:

<div class="container">
  <div class="block-1"> Left </div>
  <div class="block-2"> Right </div>
</div>

SCSS

قوانین استایل کلاس container با media query mixin ها در پایین برای سطح سه قرار گرفته اند:

.container{
  display: flex;
  flex-direction: row;
  gap: $gap;
  padding: $padding;

// Style Rules for Mobile Display

  @include query(mobile){
    flex-direction: column;
  }
}

در اینجا ما همه کلاس‌های .block-* را همراه با مدیا کوئری‌ها برای نمایش موبایل انتخاب کرده و استایل دهی می‌کنیم:

[class ^="block-"]{

//To put the left, right text at center
  display: flex;
  justify-content: center;
  align-items: center;

  border : 4px solid $color;
//Setting height of each block
  height: 100vh -$padding*2;

// Style Rules for Mobile Display
  @include query(mobile){
    height: 50vh -$padding*2;
  }
}

حالا به صورت جداگانه کلاس‌های block-1 و block-2 را هدف قرار می‌دهیم. همچنین برای توزیع فضای صفحه نمایش مقدار flex-grow را تغییر می‌دهیم.

// Style Rules Left Block

.block-1{
//will occupy 20% of the Available width
  flex-grow: 2;
}

// Style Rules Right Block

.block-2{
//will occupy 80% of the Available width
  flex-grow: 8;
}

سطح چهار، نحوه ساخت Card Layout 2

HTML

در اینجا قوانین HTML شبیه به سطح یک با کمی تغییر است.

<div class="container">
    
  <div class="block-1">
    <div class="box-1"> A </div>
  </div>
    
    
  <div class="block-2">
    <div class="box-2"> B </div>
    <div class="box-3"> E </div>
  </div>
    
    
  <div class="block-3">
    <div class="box-4"> C </div>
    <div class="box-5"> D </div>
  </div>
    
</div>
</div>

SCSS

کلاس container را به این صورت استایل دهی کنید:

.container {
  display: flex;
  flex-direction: column;
  padding: $padding;
  gap: $gap;
}

سپس همه کلاس‌های block-* را با همدیگر همراه با media query mixin در پایین برای دستگاه‌های موبایل انتخاب و استایل دهی کنید:

[class ^="block-"]{
  display: flex;
  flex-direction: row;
  gap: $gap;
  
// Removing Padding, Gap &amp;amp;amp;amp;amp; divide by 3
  height: (100vh -$gap*2 -$padding*2)/3;
  
// Style Rules for Mobile Version  
  @include query(mobile){
    flex-direction: column;
  }
}

حالا همه کلاس‌های box-* را با همدیگر انتخاب و استایل دهی کنید:

[class ^="box-"]{

// To place the letter at center
  display: flex;
  justify-content: center;
  align-items: center;
  
// Border, Border-radius &amp;amp;amp;amp;amp; background-color
  border : 1vh solid $color;
  border-radius: 10px;
  background-color: #c1c1c1;
}

حالا به صورت جداگانه باکس ها را هدف قرار داده و از flex-basis برای توزیع فضای صفحه استفاده می‌کنیم.

//A
.box-1{
  flex-basis: 100%;
}

//B &amp;amp;amp;amp;amp; D
.box-2, .box-5{
  flex-basis: 70%;
}
//E  &amp;amp;amp;amp;amp; C
.box-3,.box-4{
  flex-basis: 30%
}

در نهایت، media query mixin را برای ورژن موبایل قرار می‌دهیم.

// Style Rules for Mobile Version 

@include query(mobile){
  .block-2{
    height: (100vh*2)/3; // 66.66vh
  }
  .block-3{
    flex-direction: row;
  }
  
//   Selecting B, E, C, D
  .box-2,.box-3,.box-4,.box-5{
    flex-basis: 50%;
  }
}

سطح پنج، اتمام کار

HTML

در اینجا قوانین HTML شبیه به سطح یک و سطح چهار همراه با کمی تغییر است.

<div class="container">
    
  <div class="block-1">
    <div class="box-1"> A </div>
  </div>
    
  <div class="block-2">
    <div class="box-2"> B </div>
    <div class="box-3"> C </div>
    <div class="box-4"> D </div>
  </div>
    
  <div class="block-3">
    <div class="box-5"> E </div>
  </div>
</div>

SCSS

اول استایل‌های کلاس container را تغییر دهید، به این صورت:

.container{
  display: flex;
  flex-direction: column;
  gap: $gap;
  padding: $padding;
}

سپس همه کلاس‌های block-* را با همدیگر هدف قرار داده و استایل دهی کنید.

// Style rules of all .block-*

[class ^="block-"]{
  display: flex;
  flex-direction: row;
  gap: $gap;
}

سپس همه کلاس‌های box-* را با همدیگر هدف قرار داده و استایل دهی کنید.

// Style rules of all .box-*

[class ^="box-"]{
  display: flex;
  justify-content: center;
  align-items: center;
  border : 1vh solid $color;
  border-radius: 10px;
}

به صورت جداگانه باکس ها را هدف قرار داده و از flex-basis برای توزیع فضای صفحه استفاده کنید.

// Defining A &amp;amp;amp;amp;amp; E Together
.box-1,.box-5{
  flex-basis: 100%;
  height: 20vh;
}

// Defining C here
.box-3{
  flex-basis: 60%;
//   Removing Gap &amp;amp;amp;amp;amp; padding
  height: 60vh -$gap*2-$padding*2;
}

// Defining B &amp;amp;amp;amp;amp; D Together
.box-2,.box-4{
  flex-basis: 20%;
}

در آخر، media query mixin را برای ورژن موبایل قرار دهید. توجه کنید که box-2 را برای ورژن موبایل مخفی کرده‌ایم.

// Media query for mobile Screen

@include query(mobile){
  .block-2{
    flex-direction: column;
    height: 60vh;
  }
// Hiding our B block
  .box-2{
    display: none;
  }
// Increasing Height of C  
  .box-3{
    flex-basis: 80%;
  }
}

نتیجه گیری

در این مقاله سعی کردیم تا یک طرح ریسپانسیو را با Flexbox بسازیم. امیدواریم که حالا اصول Flexbox را به خوبی درک کرده باشید.

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید