Effective前端1---chapter 1 HTML/CSS優化
最近在讀高效前端:web高效程式設計與優化實踐,藉此本書的感受總結下前端程式碼與效能優化,純屬自己見解,如有錯誤,歡迎指出。
1.能用HTML/CSS解決的問題就不要用js
場景1:滑鼠懸浮時顯示
滑鼠懸浮在選單上時,顯示子選單。
實現思路:剛開始隱藏掉子選單,資訊框作為hover目標的子元素或者相鄰元素,才方便使用CSS控制。
.menu{ display:none; }
當導航hover時結合相鄰選擇器,把子選單顯示出來;
.find:hover + .menu{ display:list-item; }//保證menu本身在hover的時候也要顯示,.menu:hover{ display:list-item;}
.menu選單的位置可以使用絕對定位顯示在你想要顯示的位置。
場景2:自定義radio/checkbox的樣式
在我們使用原生的單選或者複選框時,不能滿足我們的需求時,需要自己定製其樣式。
兩種方法:(1)使用label元素的繫結選中,修改其樣式
<label for="checkbox_1"> <input type="checkbox" id="checkbox_1"> <span class="checkbox"></span> HELLO WORLD </label>
/** 複選樣式(使用label選中) */ label{ cursor: pointer; display: block; } //隱藏input label input[type=checkbox]{ display: none; } //使用span的樣式代替原生input樣式 label input[type="checkbox"] + .checkbox{ box-sizing: border-box; display: inline-block; width: 16px; height: 16px; border: #ccc 1px solid; border-radius: 3px; position: relative; top: 2px; } input[type=checkbox]:checked + .checkbox{ border: #307bb5 1px solid; background-color: #307bb5; } input[type=checkbox]:checked + .checkbox::after{ content: '✔'; position: absolute; top: -3px; left: 1px; color: #fff; transition: all 0.3s linear; font-size: 14px; }
上述做法必須要保證label繫結對應input的值,否則不會生效;
效果如下圖:
(2)直接使用input的偽類實現
<input type="checkbox" id="">
//隱藏原生複選框樣式 input[type=checkbox]{ appearance: none; -webkit-appearance: none; outline: none; margin: 0; /* 將 */ position: relative; top: 2px;}//顯示的複選框樣式 input[type=checkbox]:after { box-sizing: border-box; display: block; content: ""; width: 16px; height: 16px; background: #fff; border-radius: 3px; border: 1px solid #aaa; }//選中後複選框樣式 input[type=checkbox]:checked:after{ box-sizing: border-box; border: #307bb5 1px solid; background-color: #307bb5; text-align: center; content: '✔'; color: #fff; transition: all 0.3s linear; font-size: 12px; position: relative; top: -2px;}
效果如下:
此種方法的好處就是不需要多餘的標籤,可以實現改變原生樣式。但是也存在一個小問題,感興趣的小夥伴可以去試一下。(以上content裡用到的對號是搜狗輸入法的特殊符號)
場景3:使用表單提交
表單提交存在兩種方式,一個AJAX,另一種是表單提交。如下:如果點選搜尋按鈕後要跳轉到列表頁,我們就可以使用表單提交
<form action="/search" id="search-form"> <input type="search" name="keyword"> <input type="email"> </form>
把所有的欄位的名字寫在input的name裡面,然後form的action作為搜尋頁的連結,這樣就可以實習那不用一行js實現搜尋跳轉。
如果需要表單驗證的話,那就監聽submit事件做驗證,驗證通過後呼叫原生表單元素的submit函式就可以實現表單提交,不需要手動獲取form的值。
場景4:巧用CSS3偽類元素
CSS3的偽類提供了狀態切換特性,除了以上實現的單選複選樣式的:checked之外,還有focus,invalid等等。如下:
input獲取焦點後,width發生改變。
實現:
.search{ width:100px; }//input獲取焦點後樣式 input[type=search]:foucs + .search{ width:200px; }
還有一些輸入框輸入不合法時,例如提交按鈕置灰,下一步按鈕置灰等等操作,可以使用input的type和pattern等屬性約束合法性,然後觸發:invalid,實現以上操作。
場景5:用CSS3的attr屬性實現簡單的tooltip效果
當要實現一個hover的時候顯示提示資訊,如果使用title屬性覺得效果不好看,又不想使用JS寫,這時可以使用CSS3的attr屬性實現。
<p> hello, <span data-title='Effective Frontend Development'>EFED</span> </p>
span[data-title]{ position: relative; }//定義顯示框的樣式 span[data-title]:hover::before{ content: attr(data-title); position: absolute; top: 150%; left: 50%; transform: translateX(-50%); white-space: nowrap; border: 1px solid #ccc; padding: 5px 10px; border-radius: 5px; }
效果如下圖:另外,你也可以使用after畫一個三角形,指向要顯示的元素位置。
JS是萬能的,幾乎可以做任何事情,但有時候會顯得笨拙,我們要學會在JS/HTML/CSS之間選擇適合的開發形式,儘可能的簡化開發,提升自己。
另外,這樣的場景還有很多,像自動監聽回車事件用於提交,導航懸浮,多列等高等等,這裡就不再贅述。
2.HTML語義化(優化HTML標籤)
HTML5提供了許多語義化標籤,每個標籤都有相應的作用,瀏覽器會根據不同語義作出相應的反應。
就像input標籤,在移動web開發的是,不同type值,會呼叫不同的鍵盤,如下:
不同的標籤代表有著不同的作用:
div: 作為一個普通的容器使用;
section:作為一個普通的章節使用;
article:適用於獨立性比較強的內容,如網頁的主題就可以使用article標籤;
nav:適用於導航內容;
aside:用作和頁面主題相關的容器,像側邊欄,評論等輔助的元素