沒穿方服

索引

顯示╱隱藏內文
顯示具有 網頁設計 標籤的文章。 顯示所有文章
顯示具有 網頁設計 標籤的文章。 顯示所有文章

去年十月普及的瀏覽器 text fragment(文字片段)功能,用 #:~:text=文字寫法深度連結到網頁特定位置,很實用,即使網站有轉址也能通,例如 立法院法律條文 https://www.ly.gov.tw/Pages/ashx/LawRedirect.ashx?CODE=03134#:~:text=中華民國104年2月4日公布
點進去會發現網址變了,但還是能把左邊欄「中華民國104年2月4日公布」這段字標亮。

:~: 規格: web.devMDN

不過也發現有些網站用上去沒效果,有些自己寫的網頁竟然也不行!
要是被人發現網頁不友善卻渾然不知,那多丟臉啊。

簡單記一些踩點

  • 目標文字在初次 render 就要出現,所以需要 SSR
    如果是轉圈圈載入資料再顯示的架構大概就沒救了。

  • 顯示之後重繪也會清掉效果,例如 react 能用卻沒用 useMemo 碰上多餘重繪,這關就不過。

  • 主要內容的 HTML 節點最好提早出現,例如我有一些主文放在 <dialog>,原始碼卻放在靠近底部 </body> 的位置,這樣如果目標文字也出現在其他地方就會有問題,會優先抓到別處(較不重要)。

  • 真的改不了的時候,想換條路自己解析網址再模擬「尋找、捲動、標亮」也做不到,因為安全隱私考量,# 開始的部分會被瀏覽器拆掉,不會暴露給程式,例如 location.href 就抓不到。

  • 不要隨便操作 focus 或濫用 autofocus,因為聚焦操作也可能讓捲軸位置又跑掉。

  • 操作瀏覽器寫自動測試時,我找不到方法讓 headless chrome 啟用這個功能,最後只能用頭跑,或改用 Firefox。

  • 雖然可以用 CSS ::target-text 改標亮部分的樣式,但實測只能動前景、背景色,也不能用漸層之類的值。
    那要改成怎樣才符合使用者預期?我想一般答案是先不要改吧。

第一次嘗試 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 了。

這是某人第一次的網頁設計,我覺得很不錯了 某人(倒跟本篇無關)首度嘗試的設計,
我覺得已經很不錯了。

寫給一位網頁美工朋友(我看他也蠻無奈的),內容應是網頁設計的常識;但沒接觸過的話,似乎會剛好沒想到:


  1. 不要把網頁的「主要內容」塞在小框框裡,依賴捲軸呈現。

    畫面被選單、裝飾圖等較「不重要」的資料佔據,失去焦點也浪費空間。
    而且給人一種感覺:你只是想把畫面填滿吧?

  2. 螢幕比設計圖長/寬的時候該怎麼辦?

    搶答
    寬就做 960 px,兩邊可以給我底色或底圖。
    長的問題,可以設計頂部、中間、底部 3 個背景就好,不必硬要固定高度,那很難。

    總之請不要冒然以你的螢幕為準,給我 1460×912 的圖真的很頭痛,圖文比例都要再調過。

  3. 分頁內容應規劃。

    不要一個頁面放「所有的」內容(用 #uri 錨點方式連結),捲軸都難以捲到底實在太荒謬了。
    還有連結需要邏輯,這件事是真的!比方一個頁面裡有好幾個選單,點進去又有看不懂意思的選單,對訪客很沒禮貌。

  4. 不要亂擺選單連結、按鈕等。

    東西最好擺整齊,可參考「格線設計」(grid systems):
    - Taobao.com UED Team » Blog Archive » 网页的栅格系统设计
    - 基礎網頁設計技巧-格線系統 | SDT™ DESIGN Weblog
    或至少自我要求一下,會好很多。

  5. 關於圖檔:
    • 不要做超大圖片,下載很慢。
    • 盡量少用透明 PNG,如果考慮 ie 6 支援這東西很麻煩的話。
    • 我要 RGB 的圖,別再給我 CMYK 了。
    • 同一張圖的尺寸為甚麼會變來變去啊……
  6. 不要做進站 flash 了吧,很少人在做了,專業設計也一樣。

    要做的話,尺寸、解析度和下載速度也要考慮,別再亂做了啦。

  7. 希望表格盡量單純一點。

    用 Word 做的複雜表格(包括樣式、錯綜的欄位等),網頁很難重現,尤其要過無障礙的話會很要命。


幾個網頁給您參考: