Blog Cover Image

Inspire you to have New thinking, Walk out your unique Road.

有的時候,你無意間遇到的一些故事,會激發你的靈感,改變你的想法,接下來你會用與之前全然不同的觀念去創造屬於你獨特的故事。

Sign @MinaYu.

[前端小菜鳥] 前端工程師成長計畫 - 讀書篇(5) | CSS(4) Layout 樣式、Flexbox、Grid 佈局

Posted on

第五篇讀書計畫的主題還是CSS。

正式進入 CSS 後,會花費大約一個半月的時間去刷這個網站的內容,所以接下來的文章都會是以這篇網站的內容學習為主。

若對CSS沒有太大興趣的話,可以直上替代方案: CSS Cheatsheet + 標準語法糖 - w3schools

此系列的文章都是屬於本人先將網站內容消化過再總結紀錄,但如果內容太長的話…就會只挑自己覺得重要的跟要提醒的紀錄。


CSS 讀書項目

  • HTML/CSS

詳請可參考完整讀書計畫目錄


Table of Content 內容

這篇文章的內容主要是講CSS的Layout, Flexbox 跟 Grid。

此篇文章內容非常龐大,我大概是刷了好幾次才把他們看完,大概也delay了兩週左右,目錄的部分就看能不能用最直接簡單暴力的方式把重點節錄出來,有興趣直接點就好。


Layout

一個網頁的設計通常會是混用不同的 Layout。

通常layout會使用css的display屬性去設置,包含以下幾個常用的layout。

display

  • inline
  • block
  • flex
  • grid

更多layout: 參考TailwindCSS


Inline and Block spaces

這一小節是我自己加的,根據這個圖,我們能知道無論layout是 inline 或者 block,都有相對應的space,如以下。

  • margin
  • border
  • div
  • padding
  • content

設計上 inline (就是橫向)、 block (區塊) 都有其對應的空間的屬性,如圖所示,所以當調整某個空間屬性 (margin, padding),則會依據他的display去調整空間。


Flex & Grid

Flexbox 跟 Grid 在 Layout 佈局很常使用,尤其現代網頁特別的花俏以及許多需求,懂得運用這兩者layout將能做出排版更好的網站。

  • flex: 是一個一維(one-dimensional)的layout,跨單個軸線(single axis)的佈局,可以是水平方向或垂直方向。
  • grid: 是一個和flex佈局相似的佈局方式,但他被設計成可以橫跨多個軸線 (也可以說是二維的layout)

簡單的講一下怎麼使用這兩個layouts

/* Flexbox */
.container {
    display: flex;
}
<!-- Flexbox -->
<div class="container">
  <div>Item1</div>
  <div>Item2</div>
  <div>Item3</div>
</div>
/* Grid */
.container {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    gap: 1rem;
}
<!-- Grid -->
<div class="container">
  <div>Item1</div>
  <div>Item2</div>
  <div>Item3</div>
  <!-- ... -->
</div>

Flow layout

在來是一些其他的layout。

  • Inline block
  • Floats
  • Multicolumn layout
  • Positioning

Position

這邊直接補充 Position 的內容,position也是很常被使用的佈局,但他不是使用display設定,而是使用 position。

簡單介紹一下幾個常用的 position

  • Positioning
    • position: relative: 相對配置,1. 提供讓absolute內容作為定位基準。 2. 可以在某個區塊中將內容作位移擺放 (留有空間)
    • position: absolute: 絕對配置,能在某個區塊中將內容位移擺放 (無視空間),初始的基準是整個網頁 (body),除非使用 relative 重新定位。
    • position: fixed: 像是 header, navbar, sidebar, footer,要把某個區塊固定在某個位置就用這個佈局。
    • position: static
    • position: sticky

參考: position 屬性的基礎概念

根據參考的網站特別讀到,absolute 能使用 top, left, right, bottom 各種方式將內容擺放到想擺置的地方,但其實 relative 也有top, left, right, bottom屬性。我想根據這個網站來補充一些小特點。

1.position: absolute 絕對配置,如果沒有指定基準元素的話 (沒有使用 relative div 重新指定基準元素),預設是以body元素 (整個視窗為基準)。

假設body是整個網站的視窗,那麼以下的css會使該div內容在整個網站的左上方。

.div {
  position: absolute;
  top: 0px;
  left: 0px;
}

但如果你是要內容以某個div為基準,飄在那個div上,你需要運用 position: relative 去定位那個基準點。

<html>
  <body>
    <div class="base">
      <!-- 想讓content以base div為基準 -->
      <div class="content">
        <div>
      <div>
  </body>

</html>
.base {
  position: relative
}
.content {
  position: absolute;
  top: 0px;
  left: 0px;
}

2.position: relative 相對配置,這邊來說說一些我自己本人覺得是 relative 的盲點 (就是我運用時沒學到的)。

relative會被運用在兩個點:

  • 設定絕對配置( position: absolute )的基準元素時
  • 希望元素偏移重疊 or 指定圖層上下順序且同時保留原本的空間時

前者是我在上面示範過的,如果你希望某個content能absolute在另一個div的基準點上 (而不是body),我們需要為那個div設置 position: relative,重新設定基準點。

後者是其實relative 也能使用 top, left, right, bottom 將內容擺放不同的區域,但與 absolute 不同的差別是: relative 會保持原有的空間,在當下個空間做位置的偏移。而absolute則會不會保留空間,直接浮在內容的上方,所以若下方原本有其他內容,則會直接往上移把原本的空間佔去

詳細的範例圖,請參考網站。

Note: 只能說早期我並不覺得 relative 有什麼作用,就是加了好像也跟沒加沒什麼關係,但後來發現正是因為某些場合不需要relative但我加了造成某些css的錯誤,這樣看起來我本身許多專案的code,如果不需要用到relative的場合就儘量拿掉比較好。


Flexbox

Flexbox是一個設計sidebar的設計模式。彈性的佈局模式 (Flexible Box Layout Model) 設計為一維陣列的內容,能在這一維陣列中擺放不同尺寸的內容,然後為他們調整合適的空間跟佈局。

列舉一些使用 flex layout 達成的效果:

  • 可以佈局為一行水平的row或垂直的column。
  • 依據writing mode 改變顯示方向
  • 通常初始值為單行(一維),但可以用 wrap將內容切成多行。
  • 在layout中,Items 可以在視覺上被重新排行或調換順序 (但要注意邏輯沒變)
  • layout中的空間能被彈性調整,能根據items跟flexbox設置的div調整空間。
  • 在被 wrapped 切成多行的 flex layout中,Items 之間或周圍的空間可以用 Alignment properties 去調整。
  • Items 也能在跨軸 (cross axis) 中被調整空間。

Flexbox 主要是一維陣列,那他的概念有

  • main axis (主軸)
  • cross axis (跨軸)

在水平方向時,主軸就是水平方向、一維內的items或內容就是呈現水平方向擺放,而跨軸就是垂直方向,如果你需要調整空間或者使用到一些額外擺放屬性 (align),就會動到跨軸。

關於跨軸的運用,當你使用 wrap屬性將內容切成多行時,或者能使用 align 屬性來在在跨軸安排更多的空間或者佈置內容的擺放。


Creating a flex container (display: flex)

創造一個 flexbox 佈局,你需要先在一個div中設置 display: flex。接著在這個div中,加入更多 divs (不同的 Items)

如果你沒有設置其他屬性,那麼以下是初始值:

  • Items 會呈現單行的row
  • 不會被 wrap (就是超出就超出,不會被切行)
  • Items 不會填滿 container
  • Items 會在 container 的 start 位置

Controlling the direction of items (flex-direction)

兩種方式能調整flex的方向:

  • flex-direction: row, row-reverse, column, column-reverse
  • writing-mode and direction

你可以透過 flex-direction 決定這個 flexbox的方向是 row 還是 column。或者透過設定 writing-mode 更改方向。

但使用row-reverse 跟 column-reverse 要注意,有的時候他會造成一些問題,比方說他是視覺上的將 div 顛倒,但並不是邏輯改變了,如果有賦予一些邏輯的計算跟函式,要多測試幾次驗證。

除了使用 flex-direction 設定 flex 的方向外,還能使用 writing-mode 和 direction 屬性去設置。

  • direction: rtl (從右到左), ltr (從左到右)
  • writing-mode: horizontal-tb, vertical-lr, vertical-rl

Wrapping flex items (flex-wrap)

如果想要超出的flex內容自動換行,可以使用 flex-wrap 屬性達成。initial的值是no-wrap,就是不自動換行。

當設置換行時,設定以下的 css就可以自動把內容換行,而不會讓他超出div

.container {
  display: flex;
  flex-wrap: wrap;
}

再來介紹一個縮寫的屬性 -> flex-flow,則是 flex-direction + flex-wrap的縮寫,可賦予一~兩個值定義flex的方向以及要不要wrap。

參考屬性表

/* flex-flow:<'flex-direction'> */
flex-flow: row;
flex-flow: row-reverse;
flex-flow: column;
flex-flow: column-reverse;

/* flex-flow:<'flex-wrap'> */
flex-flow: nowrap;
flex-flow: wrap;
flex-flow: wrap-reverse;

/* flex-flow:<'flex-direction'> 和 <'flex-wrap'> */
flex-flow: row nowrap;
flex-flow: column wrap;
flex-flow: column-reverse wrap-reverse;
.container {
  display: flex;
  /* column方向、需要被wrap */
  flex-flow: column wrap;
}

Warning: Using order has the same problems as the row-reverse and column-reverse values of flex-direction. It would be very easy to create a disconnected experience for some users. Do not use order because you are fixing things being out of order in the document. If the items logically should be in a different order, change your HTML!

總之就是類似這類型視覺上的順序變化,邏輯端是沒有改變的,所以使用時要多注意。


Controlling space inside flex items (flex-grow, flex-shrink, flex-basis and flex)

通常在沒有設置任何有關縮放屬性的值時,flex裡的div會根據其內容做縮放 (也就是內在尺寸 Intrinsic Sizing),所以如果在一般情況下,有三個div,很有可能3個div都擠在 main axis 的左方,右方留很大一個空間。

為了能夠更自由的調整縮放這些內容,有幾種方式:

  • flex-grow: 可以指定某個 div 是否寬度延展到最大 (1) 或 不要做延展 (0)
    • flex-grow: 1; -> items can grow larger than their flex-basis.
    • flex-grow: 0;
  • flex-shrink: 可以指定某個div 縮短它的寬度,可比原本設定的寬度(flex-basis)更窄(1) 或 不縮短它的寬度 (0)
    • flex-shrink: 1; -> items can shrink smaller than their flex-basis.
    • flex-shrink: 0;
  • flex-basis: 可以指定某個 div 他的寬度的大小 (直接賦予值)
    • flex-basis: [值];
    • flex-basis: 0; -> items have a base size of 0.

縮寫 - 透過 flex屬性直接指定寬度:

你可以透過flex的屬性,一次性的賦予三個值,其格式為此:

flex: [flex-grow] [flex-shrink] [flex-basis];

一樣是針對 display:flex 內各個 div 賦予。

  .item1 {
  flex: 1 1 auto;
}
<div class="flex">
  <div class="item1"></div>
  <div class="item2"></div>
  <div class="item3"></div>
</div>

以上的範例就是 item1 的 div,其 flex-grow: 1, flex-shrink: 1 及 flex-basis: 0%

你可以參考 TailwindCSS去理解。


Reordering flex items

.container {
  display: flex;
  gap: 1rem;
}

.box:nth-child(2) {
  order: 2;
}

.box:nth-child(3) {
  order: 3;
}

可以用order這個屬性來改變 div 的排序位置,但跟 reverse一樣要小心運用。


Flexbox alignment overview (alignment-overview)

再來是有三個方式可以在 flex layout中分佈與調整空間。

  • justify-content: 調整 main axis 的空間
  • align-content: 調整 cross axis 的空間
  • place-content: 同時設置上面兩個屬性的簡寫,可以設置1~2個

然後調整 align (cross axis) 空間的屬性:

  • align-self: 在 cross axis 調整單個 div or item.
  • align-items: 在 cross axis 調整 一群組的 div 或者 items - 整排

口訣: 如果跟調整 main axis 有關的空間就使用 justify- 開頭,如果調整跟 cross-axis 有關的空間就使用align-開頭的屬性。


Distributing space on the main axis (Justify-)

調整 main axis 空間的屬性叫 justify-,justify 的初始值為 flex-start

.container {
  display: flex;
  /* 也就是所有的flex div都擠在左邊 */
  justify-content: flex-start;
}

justify-content有許多值,這邊列舉幾個

  • flex-start: 全擠在左邊
  • flex-end: 全擠在右邊
  • center: 至中
  • space-between: 均等空間分散

參考網站: TailwindCSS/justify-content


換成 flex-direction: column,也是差不多的道理,只是變成直立。

  • flex-start: 全擠在上面
  • flex-end: 全擠在下面
  • center: 至中
  • space-between: 均等空間分散

Distributing space on the cross axis (Align-)

調整 cross axis 空間的屬性叫 align-,但調整的align屬性有兩種。

如果 justify-content 的初始值是 flex-start,那align- 的初始值是stretch。

基本上值都差不多,只需要搭配圖像意會一下,align 就是在 cross-axis 調整單個或整排的上下空間 (往上浮、至中、往下浮或者其他..)。

如果是 flex-direction: column,其cross-axis就會變成左右的空間。

是需要一點時間了解。


The place-content shorthand (place-content)

就是用 place-content 這個屬性可以一次賦予調整兩個 axis 的屬性。

place-content: [align-content] [justify-content]
/* 如果只設定一個值,那代表這個值會同時實現兩個空間的調整,請注意使用 */
place-content: []

Margin auto

如果你在 flexbox樣式裡,你想把一個div刻意推遠,那麼你可以使用 margin: auto 來達成這個效果,將 margin: auto 下在你希望那個被推遠的div樣式上。


How to center an item vertically and horizontally

使用下面的樣式,就能把一個div 完全置中。

.container {
  width: 400px;
  height: 300px;
  display: flex;
  justify-content: center;
  align-items: center;
}

Grid

本來沒有要很詳細寫 Grid 的內容,因為當初第一次看完的時候,覺得內容很多又不懂。

但神奇的是,靜下心來再刷第二次時,就突然看懂了,一邊讀一邊做筆記。

阿不過,就在我進入後半邊後,又開始不懂了,隨便寫了,那個…概念上就是那些要讀XD

  • Grid: 二維的佈局,合併外在尺寸跟內在尺寸的運用
  • Flexbox: 一維的佈局,比較彈性去分佈跟調整佈局內Items的大小跟空間

當你創一個 grid 佈局時,你會同時創立 rows 跟 columns


Grid Terminology (Basic terms of Grid)

關於 Grid 的專有名詞就保留英文吧,比較好懂。

  • Grid Terminology
    • Grid lines: A grid is made up of lines.
    • Grid tracks: A track is the space between two grid lines. A row track is between two row lines and a column track between two column lines.
    • Grid cell: A grid cell is the smallest space on a grid defined by the intersection of row and column tracks. It’s just like a table cell or a cell in a spreadsheet.
    • Grid area: Several grid cells together.
    • Gaps: A gutter or alley between tracks.
    • Grid container: apply with display: grid and create grid layouts
    • Grid item: A grid item is an item which is a direct child of the grid container. (several Divs under the container)

Rows and columns

  • Intrinsic sizing keywords
    • min-content
    • max-content
    • fit-content()
  • The fr unit
  • The minmax() function
  • repeat() notation
  • auto-fill and auto-fit
.container {
    display: grid;
    /* 橫排 定義 3個不同的單位寬的格子 */
    grid-template-columns: 5em 100px 30%; 
    /* 直排 定義 第一排高 200px, 第二排自動 */
    grid-template-rows: 200px auto;
    gap: 10px;
}

grid-template-columnsgrid-template-rows 來定義 grid 內容。


Intrinsic sizing keywords

就是當你沒有刻意定義長寬高的值時,他會根據實際的內容去縮放格子(grid or div)的大小。這邊提供三個函式根據內在尺寸去縮放每個 grid 格子的大小。

  • min-content: 就是將grid格子縮到最小/剛剛好貼合內容的大小,也就是說假設這個格子裡有五個英文字,那他的格子大小就是剛好擠下這5個字,或者盡可能地縮小,但不會小到連字都不見。

  • max-content: 就是會將grid格子放到最大,比方說個三個格子各有5, 7, 10 個字,那grid 就會縮放到比原本字數更寬更高的尺寸。

  • fit-content(): 就是可以下一個函式裡面擺想要指定的固定寬高值,格子就會固定那個值。比方說 fit-content(10em) ,那格子的尺寸就不會超過10em。


The fr unit

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}

fr 單位有點像 flex: auto,這個單位給予格子更靈活的長度,不是實際定義格子的尺寸,而是定義格子占幾格方格的尺寸 (隨著container的寬高去靈活彈性變化) 。

比方說 橫三排(columns) 1fr, 1fr, 1fr,也就是3格,但如果把第三格改成 2fr,那麼橫排的寬/4,前面2個column寬個佔1/4寬、第3個column寬佔2/4寬

// 原本 1fr, 1fr, 1fr
|     |     |     |
// 當設為 1fr, 1fr, 2fr
|    |    |       |

The minmax() function

可以運用一個minmax()去定義最小跟最大的尺寸,比方說 minmax(auto, 1fr)就是最小隨著內容而定,但最大不會超過1個fr的尺寸。


The repeat()

假設今天你要寫好多好多的格子,是不是就要這樣寫?

.container {
    display: grid;
    grid-template-columns:
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr),
      minmax(0,1fr);
}

那寫100個時,該怎麼辦呢?難道真要寫100行?所以就有了repeat這個函式,改成以下這樣就能產生12個格子。

.container {
    display: grid;
    grid-template-columns: repeat(12, minmax(0,1fr));
}
.container {
    display: grid;
    grid-template-columns: 200px repeat(2, 1fr 2fr) 200px; /*creates 6 tracks*/
}

auto-fill and auto-fit

有點難解釋,先發一個參考的網站

簡單來說

  • auto-fill: 如果你給予他固定的size,他就產固定size的格子,如果剛好目前的container 第一排可以足夠擺5個固定size的格子,那他就會擺滿5個,第二排只需要2個格子,那就是2個固定size的格子其他留空。
  • auto-fit: 你雖然給他固定的size,但如果你寫的divs不夠,比方說第二排只有2個格子,那這個屬性會特別延展這兩個格子的size,不按照原本定好的,而是自動延展至符合5個格子的寬度。

Auto-placement

  • Placing items in columns: 預設
  • Spanning tracks
  • Filling gaps

就是說上面介紹了Grid的基本概念以及如何產生Grid後,接下來的章節就會跟空間、擺放之類的相關知識。

應該也就是我開始感到看不懂且痛苦的地方了Q.Q


Placing items in columns

基本上沒有設置任何方向的話,預設的grid排盤是依據row的方向,但由於實際運用場景會有不同的狀況以及不同的書寫方向(就是日文、英文、阿拉伯文跟其他),所以可以透過兩種方式變更grid排盤方向。

  • grid-auto-flow: column: 特地將屬性設為 column,那grid就會按照column方向渲染
  • writing-mode: 會根據設定的writing-mode變換grid顯示的方向
    • writing-mode: horizontal-tb (水平)
    • writing-mode: vertical-rl (直立右上開始渲染到左下)
    • writing-mode: vertical-lr (直立左上開始渲染到右下)

詳細grid怎麼變化就看網站範例


Spanning tracks

可以使用 span 來設定你的grid延展空間。

  • grid-row-end
  • grid-column-end
.item {
    grid-column-end: span 2; /* will span two lines, therefore covering two tracks */
}
.item {
    grid-column: auto / span 2;
}

Filling gaps

運用 grid-auto-flow 屬性 可以將 grid 自動填補可填補的空間。

參考範例


Placing items

  • Placing items
    • grid-column-start
    • grid-column-end
    • grid-row-start
    • grid-row-end
    • grid-column
    • grid-row
  • Stacking items
  • Negative line numbers

在最一開始的基礎概念是說 Grid 基本上是以line組成,所以是可以透過指定line的位置來擺放Grid。

有四個屬性可以設定

詳細可以點擊連結裡的網站內容,有圖像比較好理解。

基本上可以透過這四個屬性去設定Grid要在哪個 line 開始渲染或者渲染到哪條line結束。


當然也有更簡短的寫法:


Stacking items

再來是可以利用 z-index 去堆疊 Grid ,z-index 就是可以決定元素的z軸位置 (視覺上來看就是前跟後),前面運用很多不同的 span 延伸空間、運用 place items 去決定從哪條line渲染,而這個小章節是指可以用 z-index 達到 grid 格子的堆疊視覺效果。

這個呢,就只能多練習了,用文字感覺也很難達到解說。


Negative line numbers

  • explicit grid 明式格線
  • implicit grid 暗式格線

Use grid-template-rows and grid-template-columns to create what is known as the explicit grid (明式格線). - 基本上就是當你建立格線時,格線自己也建立了暗式格線(implicit grid)。

你能在暗式格線內透過 grid-auto-rowsgrid-auto-columns 屬性,給軌道定義一套大小。


Named grid lines

你能為 grid line 格線命名。

.container {
    display: grid;
    grid-template-columns:
      [main-start aside-start] 1fr
      [aside-end content-start] 2fr
      [content-end main-end]; /* a two column layout */
}

.sidebar {
    grid-column: aside-start / aside-end;
    /* placed between line 1 and 2*/
}

footer {
    grid-column: main-start / main-end;
    /* right across the layout from line 1 to line 3*/
}

Grid Template Areas

也能幫某個領域的 grid 命名,使用 grid-area去命名。

header {
    grid-area: header;
}

.sidebar {
    grid-area: sidebar;
}

.content {
    grid-area: content;
}

footer {
    grid-area: footer;
}

然後運用在 container 中

.container {
    display: grid;
    grid-template-columns: repeat(4,1fr);
    grid-template-areas:
        "header header header header"
        "sidebar content content content"
        "sidebar footer footer footer";
}

有某些規則:

There are a few rules when using grid-template-areas.

  • The value must be a complete grid with no empty cells. (不能有空白的單元格)
  • To span tracks repeat the name. (重複名稱可以延伸軌道)
  • The areas created by repeating the name must be rectangular and cannot be disconnected. (重複名稱的領域必須是矩形,而且不能斷開)

參考內容


Shorthand properties

Shorthand properties (就是某些屬性可以縮寫)

  • grid-template
  • grid

Alignment

感覺這樣看下來,比起flex,grid在很後面的地方才開始介紹Alignment。

基本上在 flexbox 學習到的 align 內容也都適用於 grid。

我們再複習一次

  • justify- 開頭用於 inline axis,方向會根據設置的writing mode 改變。

  • align- 開頭用於 block axis,方向會根據設置的writing mode 改變。

  • justify-content and align-content: distribute additional space in the grid container around or between tracks. (主要是分配散佈在 grid container或格子與格子中間的空間) (Note: 如果你的 container裡沒有空間可以調整,則不會有變動)

  • justify-self and align-self: are applied to a grid item to move it around inside the grid area it is placed in. (則是調整某個 grid的位置) (Note: 初始值是stretch,所以基本上grid格是填滿的,但如果item是照片或其他有固定尺寸的物件,那值會變成start)

  • justify-items and align-items: are applied to the grid container to set all of the justify-self properties on the items. (則是調整某群 grids 的位置)


好吧,承認後面有點小亂,因為想趕快結束這篇章,而且半夜2點了Q.Q。

但關於Grid的內容比較多,我想接下來幾天我應該還是會多花點時間複習。


本節小課程 - Portrait 和 Landscape,談螢幕方向

接下來要談一下 Portrait 和 Landscape,是我在寫公司專案時遇到的知識。

@media (orientation: landscape) {
  body {
    flex-direction: row;
  }
}

@media (orientation: portrait) {
  body {
    flex-direction: column;
  }
}

在寫css時,一定有遇過 media,當你的服務需要在不同裝置呈現,甚至除了制定的寬度大小以及要符合直立與橫向設計時,這時候就會需要用到 orientation這個屬性。

根據參考網站

  • 直式螢幕稱為「Portrait」
  • 橫式螢幕「Landscape」

在電腦上比較不會有這個問題,但是當手機端時就會遇到類似的問題。也就是說當你的服務需要手機橫著操作時 (參考網站舉的例是遊戲類的),那你的UI/css呈現都會不同,這需要針對並特別設計跟撰寫,不是寫一行css就搞定的。

另外某些例外是,在某些直立 (Portrait) 會有部分功能被隱藏,因為不夠顯示,但是當轉橫式(Landscape)時,由於螢幕跟空間夠大,某些功能就可以顯現出來,這些特別的設計也會使用到 orientation 屬性去特別撰寫。

那這堂小課程就到這,主要是因為我很少見到這個寫法,當初在公司專案裡的css檔案中有幸遇見不熟悉,所以特別在此篇讀書計畫提出。

詳細就請前往參考網站拜讀囉~

參考網站: Portrait 和 Landscape,談螢幕方向