我不是這個世界上最有才的程序員。是的,我知道這是真的。所以我嘗試盡可能少寫代碼。我寫得越少,破壞越少,調整和維護的工作量也就越少。
我也很懶,所以覺得一切過得去就行了。
然而,事實證明讓 Web 變得高效的唯一行之有效的方法也只是少寫代碼。精簡代碼?壓縮代碼?緩存?好吧,聽起來好高級。從源頭上竭盡全力拒絕增加代碼或者引入別人寫的代碼?現在你說到點子上了。解決一個問題又會帶來另一堆別的問題,你的任務可能讓你無比蛋疼。
而這還沒完。不同于為了可見的性能收益的優化目標 —— 如果確實有可見的優化點,你還是需要多寫一些代碼,不過你得想好了 —— 少寫代碼可以讓你的 Web 應用使用成本降低。我接收的數據內容不在乎你用小塊還是大塊數據發送,反正它們拼起來之后都一樣(意思是性能優化不明顯的話沒必要過度合并請求 —— 譯者注)。
我最喜歡的關于少寫代碼更好的觀點是:你應該只完成你真正需要的東西 —— 即你的用戶真正需要的東西。在按鈕上加一道光?別說道光,加康熙也不干。為了加社交按鈕引入一堆第三方代碼,同時破壞掉你的頁面設計?將它們一腳踹開。用 JavaScript 定制用戶的鼠標右鍵來顯示一個自定義的模態對話菜單?代表月亮消滅它們。
這不僅僅是關于你引入代碼來破壞 UX 設計的問題,你自己寫的代碼也必須要盡量減少。這里我提供一些觀點會有幫助。我曾經寫過一些不用寫的代碼,用在無障礙和響應式設計方面。結果卻讓我明白一個道理,靈活的、無障礙的 Web 正需要我們盡可能少去人為控制。只有不寫的代碼才永遠都不需要重寫。
WAI-ARIA
首先,WAI-ARIA(Web Accessibility Initiative - Accessible Rich Internet Applications) 不等于 Web 無障礙。它只是一個工具,在需要的時候通過某些輔助技術來提高兼容性,比如支持讀屏軟件。因此,ARIA 使用的第一原則 是如果你不是必須要用的時候不要使用 WAI-ARIA。
為了德瑪西亞!別這樣寫:(原文這里是 LOL,no:,LOL 應該是 Laugh Out Loud,不過我故意翻譯成那個的 )
<div role="heading"aria-level="2">Subheading</div>
應該這樣寫:
<h2>Subheading</h2>
使用原生元素的好處是你通常也不需要為你的元素行為添加腳本。看下面的 checkbox 實現,這么寫不僅代碼很冗長,而且還需要依賴一段 JavaScript 來控制狀態變化從而 模擬(follyfill) 出本來就是瀏覽器標準化的 name 屬性和 HTTP GET 的基本行為。明顯這么寫需要更多代碼,而且不那么健壯。搞笑吧?
<div role="checkbox" aria-checked="false" tabindex="0" id="checkbox1" aria-labelledby="label-for-checkbox1"></div> <div class="label" id="label-for-checkbox1">My checkbox label</div>
上面那么寫是為了要考慮樣式?沒關系,如果你真的需要自定義樣式,可以這么做。
<input type="checkbox" id="checkbox" name="checkbox1"> <label for="checkbox1">My checkbox label</label>
Grids
你記得曾經享受使用/閱讀一個超過三欄布局的網頁嗎?我不覺得那是一種享受。太多的內容堆在一起,干擾了我的注意力。“我想知道那些看起來像是導航欄的東西它真的是我想要的導航欄嗎?” 這樣的網站套路太深,我要做的任務被打斷了,于是我離開了這個網站。
有時候我們確實想要內容堆在一起。比如搜索結果或者其他什么。但是為什么要引入一整個笨重的柵格框架模板只為了實現這個功能?Flexbox 用三兩個聲明塊就能做到。
.grid { display: flex; flex-flow: row wrap; } .grid > * { flex-basis: 10em; flex-grow: 1; }
現在一切都“扭曲”為大約 10em 寬。一行有多少列取決于 viewport 可以放下大約多少個 10em 寬的單元格。搞定,繼續。
然后,當我們來到這里,下面這個是什么鬼:
width: 57.98363527356473782736464546373337373737%;
你知道精確的測量是根據一個神秘的比例計算的嗎?一個令人敬畏的神奇比例?不,我不覺得,也不感興趣。我只想要讓播放動作片的按鈕足夠大以便我能找到它。
Margins
我們做到了這個。使用通用選擇器讓元素共享 margin 定義。只在需要改變的地方重寫它,不需要更復雜。
body * + * { margin-top: 1.5rem; }
不,通用選擇器不會破壞你頁面的性能,別被磚家坑了。
Views
你不需要一整個 Angular 或者 Meteor 或者別的什么來分離一個簡單的網頁到“視圖”。視圖只是分別控制你所能看見的網頁部分和你看不見的部分,CSS 也可以做到:
.view { display: none; } .view:target { display: block; }
“但是單頁應用需要在它們加載視圖的時候執行代碼!”我知道你要說這個。這個用 onhashchange 事件就好了。不需要其他庫,你只需要使用標準的,可收藏到書簽的鏈接方式就可以了。這很棒。關于這個技術,這里有更多介紹,如果你感興趣可以看一下。
Font sizes
調整字體大小真的可以讓你的 @media 塊膨脹。這也是為什么你需要小心照顧好你的 CSS。其實用一行代碼可以解決:
font-size: calc(1em + 1vw);
嗯,這樣就行了。你甚至有了字體的最小大小,所以在手機上字體也不會變得太小。多虧了Vasilis 教會了我這個。
本文轉載自:[眾成翻譯](http://www.zcfy.cc)
譯者:[十年蹤跡](http://www.zcfy.cc/@akira)
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.wangchenghua.com/post/5338/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料