淺談 CSS

前端工程演化史

上古時代

HTML / CSS / JS 大亂鬥

<table style="width: 300px; font-size: 18px;">
  <tr>
    <td>
      <b>我是粗體字</b>
      <button onclick="alert('123')">按鈕</button>
      <marquee>我是跑馬燈</marquee>
    </td>
  </tr>
</table>

古典時代

關注點分離

<html>
  <head>
    <title>Title</title>
    <link rel="stylesheet" href="main.css">
  </head>
  <body>
    <p>Text</p>
    <script src="main.js"></script>
  </body>
</html>

HTML 負責結構

CSS 負責樣式

JS 負責腳本

精美手工藝時期

工業革命時代

前端技術大暴走

大框架時代

關注點分離???

HTML

CSS

JS

Component

表現層面

架構層面

CSS 基礎篇

p { color: red; }

基本選擇器

Class 選擇器 

ID 選擇器 

元素選擇器

p { ... }

通用選擇器

屬性選擇器

偽類(狀態)選擇器

偽元素選擇器

.class { ... }
#id { ... }
* { ... }
[attribute] { ... }
:hover { ... }
::before { ... }

群組選擇器

直屬後代選擇器

.class1 > .class2 {
  ...
}

後代選擇器

.class1 + .class2 {
  ...
}
.class1 ~ .class2 {
  ...
}
.class1 .class2 {
  ...
}
.class1, .class2 {
  ...
}

鄰接同層選擇器

通用同層選擇器

複合選擇器

TEXT

BOX MODAL

POSITION

屬性

TEXT

color 

font-family

font-size

font-weight

font-style

line-height

text-align

text-decoration

text-indent

text-shadow

...

BOX MODAL

display

background

width

height

border

padding

margin

box-sizing

POSITION

static

relative

absolute

fixed

靜態

相對

絕對

固定

sticky

黏性

CSS FLOW 基本規則

瀏覽器如何安排 HTML 元素的顯示位置

HTML 元素流動時的排列順序

HTML 元素重疊時的顯示順序

規則可以被破壞

float 改變元素的 流動

z-index 改變元素的 堆疊

order(flex) 改變元素的 排序

CSS 命名學

OOCSS

SMACSS

BEM

讓 CSS 在大型專案下能擁有更好的重用性與維護性

OOCSS

分離結構與樣式

分離容器與內容

( Separation of Structure from Skin )

( Separation of Containers and Content )

分離結構與樣式

( Separation of Structure from Skin )

<button type="button" class="btn btn-primary btn-lg">Large button</button>
.btn {
  display: inline-block;
  width: 120px;
  height: 60px;
  border-radius: 12px;
  border: 1px solid #000000;
  font-size: 16px;
}

.btn-primary {
  background: #8866CC;
}

.btn-lg {
  font-size: 24px;
}

分離容器與內容

( Separation of Containers and Content )

容器

內容

Card

Modal

Button

Tab

Input

分離容器與內容

( Separation of Containers and Content )

.card {
  ...
}

.card .button {
  ...
}
.card {
  ...
}

.button {
  ...
}

BEM

Block

Element

Modifier

區塊

元素

修飾符

獨立的個體

有獨立存在的意義

區塊的一部份

沒有獨立存在的意義

區塊或元素的標記

用以改變它們的樣式

.btn {
  ...
}

.btn-danger {
  ...
}

.btn--icon {
  ...
}

.btn--text {
  ...
}
<button class="btn btn-danger">
  <img class="btn--icon" />
  <span class="btn--text">刪除</span>
</button>
.menu {
  ...
}

.menu__wrapper {
  ...
}

.menu__item {
  ...
}

.menu__item--highlight {
  ...
}
<nav class="menu">
  <ul class="menu__wrapper">
    <li class="menu__item">Item1</li>
    <li class="menu__item">Item2</li>
    <li class="menu__item menu__item--highlight">Item3</li>
  </ul>
</nav>
<nav class="menu">
  <ul class="menu__wrapper">
    <li class="menu__item">
      <button class="btn">
        <img class="btn__icon" />
        <span class="btn__text">新增</span>
      </button>
    </li>
    <li class="menu__item">
      <button class="btn">
        <img class="btn__icon" />
        <span class="btn__text">編輯</span>
      </button>
    </li>
    <li class="menu__item">
      <button class="btn btn--danger">
        <img class="btn__icon" />
        <span class="btn__text">刪除</span>
      </button>
    </li>
  </ul>
</nav>

Atomic CSS

CSS FOR COMPONENT-BASED FRAMEWORKS

Style with class

將 CSS style 最小元件化,重用性最大化

<div class="Bgc(#0280ae.5) C(#fff) P(20px)">
    Lorem ipsum
</div>
.Bgc\(\#0280ae\.5\) {
  background-color: rgba(2,128,174,.5);
}
.C\(\#fff\) {
  color: #fff;
}
.P\(20px\) {
  padding: 20px;
}

誰在用 Atomic CSS ???

Flex & Grid

Flex

彈性盒子

flex元素在主軸方向上的初始大小。

flex-basis

定義彈性盒子項的拉伸因子

flex-grow

flex元素的收縮規則。flex元素僅在默認寬度之和大於容器的時候才會發生收縮,其收縮的大小是依據flex-shrink的值。

flex-shrink

Grid

格線布局

Holy Grail 聖杯佈局

水平垂直置中

44年前我們就把人類送上月球了

但現在我們仍然無法在 CSS 中實現垂直置中。

RWD

Adaptive Web Design

Responsive Web Design

響應式網頁設計

自適式網頁設計

RWD

AWD

V.S.

@media (max-width: 1000px) {
  body {
    font-size: 24px;
  }
}

Media Query

<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
@media only screen and (min-width: 500px) and (max-width: 1000px) {
  body {
    font-size: 24px;
  }
}

Media Query

最常見的那種選單

CSS Transform

translate = 位移

scale = 縮放

rotate = 旋轉

skew = 偏斜

CSS Transform 就這些

CSS 3D

CSS Sass 篇

可讀性:語法與CSS非常相似
學習曲線:它只在CSS上添加了一些額外的功能
兼容性: CSS文件就是有效的SCSS文件
資源:許多在線閱讀文章和開源庫使用

Why Sass (SCSS)

Features

變數:將需要重複使用的值設為變數
嵌套:CSS 規則可以互相嵌套
Mixins:可以接受參數的自定義函數
擴展:繼承另一個選擇器的屬性
運算符:加減乘除 / 大於小於等於 / AND OR

Don't repeat yourself

變數:防止重複的
嵌套:防止重複的選擇器
Mixins & 擴展:防止重複的屬性

Variables

$hank-color: #8866CC;

header {
  border: 3px solid $hank-color;
}

.btn {
  background: $hank-color;
}

#footer {
  color: $hank-color;
}
header {
  border: 3px solid #8866CC;
}

.btn {
  background: #8866CC;
}

#footer {
  color: #8866CC;
}

SCSS

CSS

Variables

$hank-color: #8866CC;

header {
  border: 3px solid $hank-color;
}

.btn {
  background: $hank-color;
}

$hank-color: #66CCFF;

#footer {
  color: $hank-color;
}
header {
  border: 3px solid #8866CC;
}

.btn {
  background: #8866CC;
}

#footer {
  color: #66CCFF;
}

SCSS

CSS

Variables

$hank-color: #8866CC;

header {
  $hank-color: #66CCFF;
  border: 3px solid $hank-color;
}

.btn {
  background: $hank-color;
}

#footer {
  color: $hank-color;
}
header {
  border: 3px solid #66CCFF;
}

.btn {
  background: #8866CC;
}

#footer {
  color: #8866CC;
}

SCSS

CSS

Scope

Variables

$hank-color1: #8866CC;
$hank-color2: #66CCFF;

$primary-color: $hank-color2;

header {
  border: 3px solid $primary-color;
}

.btn {
  background: $primary-color;
}

#footer {
  color: $primary-color;
}

Variables

$hank-fav-colors: (
  "purple": #8866CC,
  "blue": #66CCFF
);

header {
  border: 3px solid map-get($hank-fav-colors, "purple");
}

.btn {
  background: map-get($hank-fav-colors, "blue");
}

#footer {
  color: map-get($hank-fav-colors, "purple");
}

Map

Variables

// 顏色
$yellow: #fce473;
$pink: #c71585;
$green: #32cd32;
$blue: #1d90ff;

// 字體
$serif: "Lora", "Playfair Display", Georgia, serif;
$sans-serif: "Roboto", "Source Sans Pro", "Open Sans", Arial, sans-serif;
$monospace: "Inconsolata", monospace;

// 間距
$mobile-space: 10px;
$desktop-space: 35px;

Nesting

.parent {
  color: #8866CC;
  .child {
    color: #66CCFF;
  }
}

SCSS

CSS

.parent {
  color: #8866CC;
}
.parent .child {
  color: #66CCFF;
}

Nesting

.header {
  .logo {
    width: 100px;
  }
  .menu {
    width: 300px;
    ul, ol {
      background: #000000;
      li {
        font-size: 12px;
      }
    }
  }
}

SCSS

CSS

.header .logo {
  width: 100px;
}
.header .menu {
  width: 300px;
}
.header .menu ul, .header .menu ol {
  background: #000000;
}
.header .menu ul li, .header .menu ol li {
  font-size: 12px;
}

Nesting

.parent {
  &:hover {
    color: #8866CC;
  }
  &.other-class {
    color: #66CCFF;
  }
  &-abc {
    color: #000000;
  }
}

SCSS

CSS

.parent:hover {
  color: #8866CC;
}
.parent.other-class {
  color: #66CCFF;
}
.parent-abc {
  color: #000000;
}

Parent Selector

Nesting

.header {
  font-size: 36px;
  @media (max-width: 768px) {
    font-size: 24px;
  }
}

SCSS

CSS

.header {
  font-size: 36px;
}

@media (max-width: 768px) {
  .header {
    font-size: 24px;
  }
}

Media Query

Mixins

@mixin overlay() {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.modal-login {
  @include overlay();
  background: #8866CC;
  opacity: 0.9;
}

SCSS

CSS

.modal-login {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #8866CC;
  opacity: 0.9;
}

Mixins

@mixin overlay($bg-color: #000000) {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: $bg-color;
}

.modal-login {
  @include overlay(#8866CC);
  opacity: 0.9;
}

.modal-cart {
  @include overlay(#66CCFF);
}

SCSS

CSS

.modal-login {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #8866CC;
  opacity: 0.9;
}

.modal-cart {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #66CCFF;
}

Mixins

Compass VS Node Sass ?

Mixin libraries

Extend

.overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.modal-login {
  @extend .overlay;
  background: #8866CC;
  opacity: 0.9;
}

.modal-cart {
  @extend .overlay;
}

SCSS

CSS

.overlay, .modal-login, .modal-cart {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.modal-login {
  background: #8866CC;
  opacity: 0.9;
}

Extend

Mixin ???

@extend 沒有參數, @mixin 有參數

@extend 會合併選擇器, @mixin 不會合併選擇器

Extend ???

Extend

%overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.modal-login {
  @extend %overlay;
  background: #8866CC;
  opacity: 0.9;
}

.modal-cart {
  @extend %overlay;
}

SCSS

CSS

.modal-login, .modal-cart {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.modal-login {
  background: #8866CC;
  opacity: 0.9;
}

Placeholder Selectors

Operators

$font-size: 12px;

.font-small {
 font-size: $font-size;
}

.font-middle {
 font-size: $font-size * 1.5;
}

.font-big {
 font-size: $font-size * 2;
}

SCSS

CSS

.font-small {
  font-size: 12px;
}

.font-middle {
  font-size: 18px;
}

.font-big {
  font-size: 24px;
}

SCSS With BEM

SCSS With RWD

CSS 魔術把戲

天啊~這已經是藝術了

CSS小畫家

想不到吧 意不意外

利用 checked

JS 掰掰

黏黏軟軟濕濕滑滑的

阿~ 好舒服~

裝B必備~空間感!

視差效果

這有點難喔我要研究一下

結果回座位瞬間做完

背景固定模式

汽車旅館必備!毛玻璃效果

復古風~三色旋轉燈

CSS + SVG !

賦予線條自由的靈魂

CSS in React 篇

作用域

依賴管理

CSS 現代問題

作用域

import React from "react"
import "style.scss"

// 以下省略

這是某一個 Component

.button {
  background: #8866CC;
}

這是 style.scss

不 ~ 全世界的 .button 都變色了!

作用域

import React from "react"
import "style.scss"

export default function Homepage() {
  return (
    <div className="homepage">
      <button className="button">按鈕</button>
    </div>
  )
}

這是某一個 Component

.homepage {
  .button {
    background: #8866CC;
  }
}

這是 style.scss

你確定 .homepage 是唯一的嗎 ??

依賴管理

import React from "react"
import "style.scss"

// 以下省略

這是某一個 Component

.homepage {
  .button {
    background: #8866CC;
  }
  .card {
    // ...
  }
  .test {
    // ...
  }
}

這是 style.scss

到底哪一些 class 有用阿???

CSS Modules

CSS IN JS

這些問題能解決嗎

能!!!

CSS Modules

Create React App Demo

CSS IN JS

  1. 最佳化 CSS
  2. 自動生成 Class 名稱
  3. 輕鬆刪除 CSS
  4. 簡單的動態樣式
  5. 好維護
  6. 自動添加屬性前綴詞

styled-components

Q&A

css

By 蔡阿貴

css

  • 1,197