最近在讀高效前端:web高效編程與優化實踐,藉此本書的感覺總結下前端代碼與性能優化,純屬本身看法,若有錯誤,歡迎指出。css
鼠標懸浮在菜單上時,顯示子菜單。html
實現思路:剛開始隱藏掉子菜單,信息框做爲hover目標的子元素或者相鄰元素,才方便使用CSS控制。前端
.menu{ display:none; }
當導航hover時結合相鄰選擇器,把子菜單顯示出來;web
.find:hover + .menu{ display:list-item; }
//保證menu自己在hover的時候也要顯示,
.menu:hover{
display:list-item;
}
.menu菜單的位置可使用絕對定位顯示在你想要顯示的位置。編程
在咱們使用原生的單選或者複選框時,不能知足咱們的需求時,須要本身定製其樣式。移動web開發
兩種方法:(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選中) */ label input[type=radio]{ display: none; } label input[type="radio"] + .radiobox{ box-sizing: border-box; display: inline-block; width: 16px; height: 16px; border: #ccc 1px solid; border-radius: 50%; position: relative; top: 2px; } input[type=radio]:checked + .radiobox{ border: #307bb5 1px solid; background-color: #307bb5; } input[type=radio]:checked + .radiobox::after{ content: ''; width: 6px; height: 6px; background-color: #fff; border-radius: 50%; position: absolute; top: 4px; left: 4px; color: #fff; }
上述作法必需要保證label綁定對應input的值,不然不會生效;性能優化
效果以下圖:app
(2)直接使用input的僞類實現ide
<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裏用到的對號是搜狗輸入法的特殊符號)
表單提交存在兩種方式,一個AJAX,另外一種是表單提交。以下:若是點擊搜索按鈕後要跳轉到列表頁,咱們就可使用表單提交
<form action="/search" id="search-form"> <input type="search" name="keyword"> <input type="email"> </form>
把全部的字段的名字寫在input的name裏面,而後form的action做爲搜索頁的連接,這樣就能夠實習那不用一行js實現搜索跳轉。
若是須要表單驗證的話,那就監聽submit事件作驗證,驗證經過後調用原生表單元素的submit函數就能夠實現表單提交,不須要手動獲取form的值。
CSS3的僞類提供了狀態切換特性,除了以上實現的單選複選樣式的:checked以外,還有focus,invalid等等。以下:
input獲取焦點後,width發生改變。
實現:
.search{ width:100px; }
//input獲取焦點後樣式 input[type=search]:foucs + .search{ width:200px; }
還有一些輸入框輸入不合法時,例如提交按鈕置灰,下一步按鈕置灰等等操做,可使用input的type和pattern等屬性約束合法性,而後觸發:invalid,實現以上操做。
當要實現一個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之間選擇適合的開發形式,儘量的簡化開發,提高本身。
另外,這樣的場景還有不少,像自動監聽回車事件用於提交,導航懸浮,多列等高等等,這裏就再也不贅述。
HTML5提供了許多語義化標籤,每一個標籤都有相應的做用,瀏覽器會根據不一樣語義做出相應的反應。
就像input標籤,在移動web開發的是,不一樣type值,會調用不一樣的鍵盤,以下:
不一樣的標籤表明有着不一樣的做用:
div: 做爲一個普通的容器使用;
section:做爲一個普通的章節使用;
article:適用於獨立性比較強的內容,如網頁的主題就可使用article標籤;
nav:適用於導航內容;
aside:用做和頁面主題相關的容器,像側邊欄,評論等輔助的元素