<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 我的 Input框 不可能這么可愛

          2019-11-19    seo達人

          作者:陳大魚頭

          github: KRISACHAN

          <input /> 標簽是我們?nèi)粘i_發(fā)中非常常見的替換元素了,但是最近在刷 whattwg 跟 MDN 的時候發(fā)現(xiàn) 跟 <input /> 有很多相關(guān)的屬性,選擇器都沒怎么用過,所以就開篇文章來整理一下一些比較有趣或者實用的知識點。



          本篇文章默認大家已經(jīng)知道 <input /> 標簽的基本用法,不會做過多的基礎(chǔ)說明~







          沒想到,這些選擇器居然跟 input …

          到寫文章為止,根據(jù)的 drafts 指出,一共有3大類,16種跟 input 相關(guān)的選擇。其實都挺有用的,善用它們,會讓我們的用戶體驗更加美好。



          下面我們來分享一下這3大類選擇器的作用:







          第一類:控制系(Input Control States)

          選擇器 作用

          :enabled 選擇可使用狀態(tài)的 <input /> 元素

          :disabled 選擇不可使用狀態(tài)的 <input /> 元素

          :read-only 選擇不可編輯狀態(tài)的元素(不僅僅是 <input /> )

          :read-write 選擇可編輯狀態(tài)的元素(不僅僅是 <input /> )

          :placeholder-shown 選擇 placeholder text 顯示時的元素

          :default 選擇在 <button>,<input type="checkbox" />, <input type="radio" />, 以及 <option> 上的默認狀態(tài)

          第二類:輸出系(Input Value States)

          選擇器 作用

          :checked 選擇處于選中狀態(tài)的 <input type="radio" />

          :indeterminate 選擇狀態(tài)不確定的表單元素與 <progress>

          第三類:偵查系(Input Value-checking)

          選擇器 作用

          :blank 選擇處于空值時的 <input>,暫未被瀏覽器支持

          :valid 選擇驗證通過的表單元素

          :invalid 選擇驗證不通過的表單元素

          :in-range 選擇處于指定范圍內(nèi)的 <input />

          :out-of-range 選擇不處于指定范圍內(nèi)的 <input />

          :required 選擇必填的表單元素

          :optional 選擇選填的表單元素

          :user-invalid 選擇用戶輸入但值非法時的 <input />,暫未被瀏覽器支持

          可怕,除了選擇器,居然還跟這些屬性有關(guān)系

          <input> 除了有很多相關(guān)的選擇器,結(jié)合不同的type還有不同的屬性可以供使用。他們的作用如下:



          屬性 作用

          maxlength 可輸入的最大長度

          minlength 可輸入的最小長度

          size 輸入框的長度

          readonly 輸入框是否只讀

          required 輸入框是否必填

          multiple 輸入框是否可以多選

          pattern 輸入框驗證規(guī)則

          min 可輸入的最小值

          max 可輸入的最大值

          step 輸入框每次的增量

          list 輸入框綁定的可選值數(shù)據(jù)

          placeholder 輸入框預選文字

          實戰(zhàn)

          通過上面的三類說明,我們大致了解了 <input /> 標簽的相關(guān)信息,但是你們以為我是來列l(wèi)ist的嗎?



          當然不是,還有實操啊~







          純CSS實現(xiàn)表單提交功能

          首先我們來看個效果圖







          上面的效果就是一個純CSS實現(xiàn)的表單提交功能,這是怎么實現(xiàn)的呢?下面我們直接看源碼,然后一步一步地來分拆(不想看的可以直接CV下面的源碼自己做測試~)



          <style>

              :root {

                --error-color: red;

              }

              .form > input {

                margin-bottom: 10px;

              }

              .form > .f-tips {

                color: var(--error-color);

                display: none;

              }

              input[type="text"]:invalid ~ input[type="submit"],

              input[type="password"]:invalid ~ input[type="submit"] {

                display: none;

              }

              input[required]:focus:invalid + span {

                display: inline;

              }

              input[required]:empty + span {

                display: none;

              }

              input[required]:invalid:not(:placeholder-shown) + span {

                display: inline;

              }

          </style>

          <form class="form" id="form" method="get" action="/api/form">

              賬號:

              <input data-title="賬號" placeholder="請輸入正確的賬號" pattern="\w{6,10}" name="account" type="text" required />

              <span class="f-tips">請輸入正確的賬號</span>

              <br />

              密碼:

              <input data-title="密碼" placeholder="請輸入正確的密碼" pattern="\w{6,10}" name="password" type="password" required />

              <span class="f-tips">請輸入正確的密碼</span>

              <br />

              <input name="button" type="submit" value="提交" />

          </form>



          第一步:寫好基礎(chǔ)結(jié)構(gòu)

          首先我們來把基礎(chǔ)結(jié)構(gòu)給寫好,代碼如下:



          <style>

              :root {

                --error-color: red;

              }

              .form > input {

                margin-bottom: 10px;

              }

              .form > .f-tips {

                color: var(--error-color);

                display: none;

              }

          </style>

          <form class="form" id="form" method="get" action="/api/form">

              賬號:

              <input data-title="賬號" placeholder="請輸入正確的賬號" pattern="\w{6,10}" name="account" type="text" required />

              <span class="f-tips">請輸入正確的賬號</span>

              <br />

              密碼:

              <input data-title="密碼" placeholder="請輸入正確的密碼" pattern="\w{6,10}" name="password" type="password" required />

              <span class="f-tips">請輸入正確的密碼</span>

              <br />

              <input name="button" type="submit" value="提交" />

          </form>



          掃一眼,嗯,挺簡單的,都是常用的東西。咦,不對,這個 pattern 是什么東西?



          在這里我們重點分享下 pattern 這個屬性,這是一個用來驗證 input[value] 是否合法的屬性,里面的內(nèi)容就是匹配value的,語法便是正則的語法,例子如下:



          <label>

              <!--

          當前pattern的內(nèi)容就是驗證input[name="part"]的value的,其規(guī)則如同里面的正則一樣,匹配input[name="part"]的value是否是一個數(shù)字+3個大寫字母

          -->

              <input pattern="[0-9][A-Z]{3}" name="part" />

          </label>



          當然,不同的 input[type] 也會默認帶有相應的 pattern ,例如 input[type="email"] 就是默認匹配了以下規(guī)則:



          /^[a-zA-Z0-9.!#$%&'+\/=?^_`{|}~-]+@a-zA-Z0-9?(?:.a-zA-Z0-9?)$/

          1

          第二步:重點功能

          input[type="text"]:invalid ~ input[type="submit"],

          input[type="password"]:invalid ~ input[type="submit"] {

              display: none;

          }

          input[required]:focus:invalid + span {

              display: inline;

          }

          input[required]:empty + span {

              display: none;

          }

          input[required]:invalid:not(:placeholder-shown) + span {

              display: inline;

          }



          上面便是核心交互的實現(xiàn)。



          首先第一個class就是保證了在兩個輸入框不通過的時候隱藏,就是當輸入框值為空或者不符合驗證規(guī)則,則隱藏提交按鈕。



          第二個,第三個class則是控制當用戶在輸入框輸入內(nèi)容時,如果不符合驗證規(guī)則,則顯示錯誤信息,否則則隱藏。



          第四個class則是用過 placeholder 是否存在來控制錯誤信息的顯隱,如果 placeholder 不顯示,則證明用戶正在輸入,錯誤信息則根據(jù)用戶輸入的值來判斷是否顯隱,否則則隱藏。



          狀態(tài)切換

          上面我們有提到一個選擇器 :indeterminate ,這個是用于選擇狀態(tài)不確定的表單元素與 <progress> ,玩過掃雷的人都知道,右擊除了可以選擇紅旗,還可以選擇問號,就是選中,但不確定;又跟 promise 的 pending 狀態(tài)類型,介于 resolve 與 reject 之間。



          多了 :indeterminate 會給我們帶來很多很有趣的體驗。



          首先我們來看看它的使用案例。



          基礎(chǔ)使用法

          先看效果







          代碼如下:



          <style>

              body {

                  background: #333;

                  color: #fff;

                  padding: 20px;

                  text-align: center;

              }

              input {

                  margin-right: .25em;

                  width: 30px;

                  height: 30px;

              }

              label {

                  position: relative;

                  top: 1px;

                  font-size: 30px;

              }

          </style>

          <form>

              <input type="checkbox" id="checkbox">

              <label for="option">點擊左邊</label>

          </form>

          <script>

                'use strict';

                checkbox.addEventListener('click', ev => {

                  if (ev.target.readOnly) {

                    ev.target.checked = ev.target.readOnly = false;

                  } else if (!ev.target.checked) {

                    ev.target.readOnly = ev.target.indeterminate = true;

                  };

                });

          </script>



          這里面其實沒有什么復雜的實現(xiàn),只是做了個中間態(tài)的判斷,就非常輕松的實現(xiàn)了radio的三種狀態(tài)切換。



          秀到頭皮發(fā)麻法

          先看效果







          (此天秀效果來自于 Ben Szabo 的 codepen,有興趣的可以仔細研究下,我何時才能有大佬這么優(yōu)秀,嚶嚶嚶~)



          輸入框綁定的可選值

          先看效果







          其實代碼很簡單:



          <input type="text" list="names" multiple />

          <datalist id="names">

              <option value="kris">

              <option value="陳大魚頭">

              <option value="深圳金城武">

          </datalist>



          <input type="email" list="emails" multiple />

          <datalist id="emails">

              <option value="chenjinwen77@foxmail.com" label="kris">

              <option value="chenjinwen77@gmail.com" label="kris">

          </datalist>



          <input type="date" list="dates" />

          <datalist id="dates">

              <option value="2019-09-03">

          </datalist>



          這里原理就是通過 <input list="dates" /> 來綁定需要下拉顯示的數(shù)據(jù)列表 <datalist id="dates"> 。



          那么當我們要實現(xiàn)輸入聯(lián)想的時候,也可以通過修改 <datalist id="dates"> 的子元素來實現(xiàn),而不是再寫一大堆的操作函數(shù)來實現(xiàn)。



          總結(jié)


          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://m.sdgs6788.com

          存檔

          久久露脸国产精品| 7国产欧美日韩综合天堂中文久久久久| 久久99精品久久久久久不卡| 要久久爱在线免费观看| 亚洲国产一成人久久精品| 成人久久综合网| 一本久道久久综合狠狠躁AV| 日韩AV无码久久一区二区| 国产精品视频久久久| 色婷婷久久久SWAG精品| 超级碰碰碰碰97久久久久| 久久精品一区二区国产| 青青草国产97免久久费观看| 国产亚洲精久久久久久无码| 亚洲人成无码网站久久99热国产| 久久精品无码午夜福利理论片 | 精品国产福利久久久| 人妻无码久久精品| 99久久国产免费福利| 久久久久久久人妻无码中文字幕爆 | 亚洲va久久久噜噜噜久久男同| 91亚洲国产成人久久精品| 婷婷五月深深久久精品| 99久久精品免费看国产一区二区三区 | 亚洲国产精品狼友中文久久久| 久久99毛片免费观看不卡| 欧洲成人午夜精品无码区久久 | 久久免费高清视频| 久久丫精品国产亚洲av不卡| 亚洲精品无码久久久久去q| 久久久久久亚洲精品影院| 久久亚洲AV永久无码精品| 久久久久人妻精品一区三寸蜜桃| 办公室久久精品| 久久99久久无码毛片一区二区| 办公室久久精品| 一级做a爰片久久毛片看看| 人人妻久久人人澡人人爽人人精品| 亚洲欧美日韩精品久久亚洲区 | 色综合久久精品中文字幕首页| 国产精品久久永久免费|