沒穿方服

索引

顯示╱隱藏內文
顯示具有 CSS 標籤的文章。 顯示所有文章
顯示具有 CSS 標籤的文章。 顯示所有文章

貼圖記錄,十年後可以回來看古代 UI。

分頁群組太過搶眼

Firefox 138 開始支援分頁群組(Tab Groups),預設顯示是在群組下面劃一條線,結果有點太醒目,造成無法一眼辨認「目前分頁」在哪。

自救

我已經好久沒用 userChrome.css,先貼圖,詳細記在後面。

userChrome.css 內容

用法是到 about:config 開啟 toolkit.legacyUserProfileCustomizations.stylesheets,然後到 Profile 資料夾自己新增 chrome/userChrome.css 檔案。

主要策略是用 CSS color-mix() 把預設背景色調暗。 另外有把關閉按鈕拿掉,內容如下:

2026-06-20: Firefox 152 更新了定義,新版為:

.tab-background {
  &:is([selected], [multiselected]) {
    background-color: color-mix(in srgb, var(--tab-background-color-selected) 70%, black) !important;
  }
}

.tabbrowser-tab[selected] .tab-close-button {
  color: white !important;
}
.tabbrowser-tab[selected]:not(:hover) .tab-close-button {
  display: none !important;
}

以下為舊版,已經沒用了。

.tabbrowser-tab[selected] .tab-background {
  background-color: color-mix(in srgb, var(--tab-selected-bgcolor) 70%, black) !important;
}

.tabbrowser-tab[selected] .close-icon {
  color: white !important;
}
.tabbrowser-tab[selected]:not(:hover) .close-icon {
  display: none !important;
}

FontForge 造字畫面

從小寫字歪醜的我,竟然也有自己做字型的一天。

檔案 620 bytes,只有一個字符(glyph),U+0020 "space" 空白

這個字我寫得不差吧……

用途是為了網頁排版:在「等寬數字」和空白、中日韓文字混合出現時,讓空白得以被單獨調整大小。

前提是你本來就會在中英文之間「手動加入空白」,如果是不加派就不能用了。

基於 CSS font-family 的 fallback 機制,這個字型「只會」套用在空白上。而因為造字時把它做得比較窄,呈現起來就會比 monospace 小一點而比較順眼。

配合 @font-face,還可以用 size-adjust 去微調它的寬度。

CSS 使用例:

:root {
  --font-space: 'BootleqSpace';
}

@font-face {
  font-family: 'BootleqSpace';
  src: url('/assets/BootleqSpace.woff2') format('woff2');
  font-display: swap;

  /* 縮放 50% 與配套微調 */
  size-adjust: 50%;
  ascent-override: 170%;

  /* 縮放 450% 與配套微調 */
  size-adjust: 450%;
  ascent-override: 27.5%;
  descent-override: 12%;
}

.font-mixed {
  font-family: var(--font-space), 'Some monospace font', 'Noto Sans TC', sans-serif;
}

目前版本 BootleqSpace.woff2 放在 feeders-charts 專案 2025-02-11 的 commit 中,字型授權是 Public Domain,可隨意使用 → https://github.com/bootleq/feeders-charts/commit/5776c04a44

另外,如果只是想快速將字型「subset」切成只含某些字元,可以用 pyftsubset 這個工具即可。

從 react-masonry-css 示例

註 1:這篇談的是 2020 前的 CSS 解法 (flexbox),且使用 react-masonry-css 這個老套件,並非新的 JS 解或還未定案的 CSS 標準(參考),目前(2024)看來,舊方法還是有適用的地方。

註 2:能調整的前提是每個元素的高度已知。

以 CSS 為主的解法,看中的是單純性和效能,避免頻繁計算每個元素的實際尺寸,而缺點如下:

  • 排序問題,因為以多個 column「直行」為容器,所以元素其實是由上排到下,而不是由左到右。
    這點在 react-masonry-css 是用 JS 硬把元素分配給各個 column 解決。
  • 高度不均。因為根本沒有考慮元素的高度,當然避免不了有的 column 特別長或短的問題。
    具體可以看 issue #73 中的附圖:very different columns height - paulcollett/react-masonry-css

針對高度不均,造成底部有很大落差不齊的情況,折衷辦法是預先給予每個元素「高度」的參考,類似給每個 <img> 賦予已知的 height 值;然後再用 JS 計算累積高度,最後搬動特別突出的元素,直到無法再用搬動方式改善為止。

實作也很單純,主要價值還是知道多做這一小步,就能得到不少改善。

程式碼參考我的 fork: bootleq/react-masonry-css at forker,具體在 balanceColumnsmoveOddItem 兩個函數:
react-masonry-css/src/react-masonry-css.js at 4866d3596#L72

第一次嘗試 Responsive Design 和 Grid System

公司的活動頁,明明趕得要死,我還是忍不住把 Susy 用上了,為什麼?

因為前陣子在規劃新版面,我認為像樣的 grid system 能幫助我們,減少設計師、上稿人員和我,煩惱或溝通一些不必要的問題,例如某元素 margin 多少、某版位我做了多寬、……,不如先定個標準出來,要改再說,不改就我處理。

RWD 也是早就想做的事情,目前網站拆為桌面版和手機版(m.網址),結果因為 m 的功能不完整,造成 tablet 使用者處在不上不下的局面,想想 RWD 還是最輕鬆的解法。

找了不少解決方案,感覺都很難搞,最後只有 Susy 給我嘗試的勇氣。

Susy 可愛之處

  • 不用自己算寬度。 比如 960px 分成 16 欄,每欄是多寬? 我不可能算對啊!
  • 不用在 HTML 加入像 .row4 .span3 的噁心 class,那根本無法維護嘛。

Susy 實際做的事情

剛開始什麼 gutter、columns 的名詞都看不懂,但實際做一次,認識一下產生的 CSS,會發現 Susy 做的事其實不多。

※目前版本是 1.0.8,但以下會混用 2.0 alpha 未定的介面說明,我覺得更清楚。

  1. 建立 grid(set-grid(960px 12 1/4)

    主要是維護 grid 設定的工作,也就是定義「容器寬、欄數、欄間隔、留邊」等等變數; 一般會寫下幾組設定,用在不同的 media query 條件下。

    具體例子,v1.0.8 的語法

    $container-width: 970px;
    @include container;

    產生的 CSS 會包含 max-width: 970px; 以及 :after :before 的 clearfix。

  2. 安排元素的佔有欄數與定位(span(last 3 of 5 isolate)

    Susy 做掉兩個麻煩的算數問題,第一是元素本身的 width; 只要指定橫跨(span)寬度是 N 欄,Susy 就會根據當時的 grid 設定,把元素 width 設為應有的百分比

    第二是為了將元素放在正確的水平位置上,所需要設定的左右 margin (理由:Susy 採用 float 加上負 margin 實作 grid,避免 % 除不盡時,瀏覽器處理最後一個 pixel 的問題,參考 Responsive Design’s Dirty Little Secret)。

    v1.0.8 使用 @include span-columns(3 omega, 5); 指定元素佔 5 欄中的 3 欄; omega 表示是該列的最後一個元素,預設會產生反方向的 float,倒過來算,否則那幾 % 有時還是會被擠到第二列。

    另有 isolate(3) 用來將元素定位在第 3 欄; 針對列表也能以 isolate-grid(4) 讓各 item 寬 4 欄、自動對齊,且 nth-child(4n+1) 會自動 clear,產生 CSS 如:

    #AllWorks ul.gallery li {
      width: 23.07692%;
      float: left;
      margin-right: 2.5641%;
      margin-right: -100%;
    }
    #AllWorks ul.gallery li:nth-child(4n + 1) {
      margin-left: 0%;
      clear: left;
    }
    #AllWorks ul.gallery li:nth-child(4n + 2) {
      margin-left: 25.64103%;
    } ... (後略)

  3. Media query

    提供方便設定 media query 的 Mixin。 v1.0.8 用法

    $media-tablet:  640px  8 969px;
    @include at-breakpoint($media-tablet) {  // ... (block 後略)

    會產生 @media (min-width: 640px) and (max-width: 969px) { ... 的 CSS,且其中寬度會以 8 欄為標準計算。


遇到的問題

  1. 容器已經有 max-width,但某個 header 想要背景佔滿畫面寬

    要讓 content 置中,header、footer 又要橫向佔滿整個畫面,自然的作法就是將 header、content、footer 放在同一層,各自設定寬度(分別為 100%、container width、100%)。

    如果想讓 header 的「內容」也遵守 grid 設定,讓它跟 content 對齊,就要在寬 100% 的 header 下,再加一層 wrapper 且設為 grid container 才行。

    若 container 寬未佔滿全畫面,如何實現全畫面寬的 header?

    結論:這個問題跟 Susy 沒有關係。終究無法只用一個 container 就達成需求。

    註:有個用 pseudo element 的做法,參考 css - How to handle full-width element outside of a 960 compass susy grid? - Stack Overflow

  2. 預設的垂直對齊,只能靠頂(top)對齊

    因為 CSS vertical-align 只對 layout 為 inline 或 table-cell 的元素有用,而 float 會把 layout 變成 block,正好 Susy 是使用 float 排版,結果就是「垂直對齊」變得不易做到。

    預設的 grid 定位,總是垂直置頂對齊。

    可能的解法是改用 display: inline-block;,就能使用 vertical-align 了,也是我們平常實作 gallery 的方式。 (Susy 有一個相關 feature request inline-block version · Issue #69,不過被拒絕掉了)

    這次我也沒用 vertical-align,設計師可能也比較中意 vertical rhythm…… 但總之想換 inline-block 的話,要注意的應該只有:

    1. Haml tag 要用 > 和 < 把多餘的空白去掉,因為空白會佔寬度:
      %li><
        %div.image
    2. 不使用 Susy isolate,改為自己指定 width 和 margin:
      li {
        width: columns(4, 16);
        margin-right: gutter(16);
        &:nth-child(4n) {
          margin-right: 0;
        }
      }

    項目改用 inline-block 就能 vertical-align 了。

陽春的 blogspot 連留言編號都要自己做,來龍去脈請見 Abin's Tech Note: 增加文章留言回應的編號 寫得很清楚。作法方面除了該篇採用的 JavaScript 外,也可考慮 CSS counter,在樣式裡加上:

.comments {counter-reset: count;}
.comment-timestamp:before {
  content: counter(count) '.';
  counter-increment: count;
}

其中 count 變數可以隨意改名,content 屬性也可作變化,稍微搜尋一下應該就有參考了。

格式可以稍做變化

※很舊的瀏覽器不支援(我真好心,每次都提這個)

綠色編號 擷圖

目前 CSS3 裡面還沒把 ::marker 擬類別制定清楚,我們也沒有簡單規則可以指定它的樣式(如圖中綠色的部分)。

委屈一點,通常的作法是在 CSS 中:

li {color:green;}  /* 把整個 li 變成綠色 */
li * {color:blue;}  /* 再把 li 裡的元素變回原色(假設為藍色) */

然後回到 HTML,用 p, div, span 或其他標籤把 li 內容沒包的包起來,否則不符 li * 選擇規則的內容會變不回藍色。


方法已經說完了,補充一下剛講的有包沒包是啥意思:

<ol>
  <li>第一項</li>      <!-- li 之下直接出現內容,這叫做沒包的 -->
  <li><span>第</span><i>二項</i></li> <!-- 這行就不必改了 -->
</ol>

要改為:

<ol>
  <li><span>第一項</span><li>   <!-- 被 span 包起來 -->
  <li><span>第</span><i>二項</i></li>
</ol>