1. 程式人生 > 實用技巧 >CSS :placeholder-shown偽類實現Material Design佔位符互動效果

CSS :placeholder-shown偽類實現Material Design佔位符互動效果

一、Material Design規範中佔位符互動效果

Material Design風格佔位符互動效果官方示意見此demo頁面。
現在這種設計在移動端很常見,相信不少人設計專案中有實現過這種互動,而且,大部分是利用js實現的。(ps:weex 不支援這個樣式)

實際上,我們可以藉助css:placeholder-shown偽類,純css,無任何js,實現這樣的佔位符互動效果。

:placeholder-shown表示,當輸入框的placeholder內容顯示的時候,輸入框幹嘛幹嘛。

:placeholder-shown偽類目前相容性如下:相容性連結

相容性還是很不錯的,在移動端我們可以放心使用。因為就算一些老手機不支援,也不過是傳統的placeholder佔位符效果,並沒有什麼損失

二、placeholder-shown 優點

純CSS實現,要比JS實現好一千倍,程式碼少,效能高,樣式調整方便,上手簡單容易,可謂是前端必備技能了。

三、實現原理

拿一個輸入框舉例,html結構如下:

<div class="input-fill-box">
    <input class="input-fill" placeholder="郵箱">
    <label class="input-label">郵箱</label>
</div>

首先,讓瀏覽器預設的placeholder效果不可見,我們可以讓顏色透明即可,如下CSS:

/預設placeholder顏色透明不可見/

.input-fill:placeholder-shown::placeholder {
    color: transparent;
}
.input-fill{
  margin: 0;
  font-size: 16px;
  line-height: 1.5;
  outline: none;
  padding: 20px 16px 6px;
  border: 1px solid transparent;
   background: #f5f5fa;
  border-radius:10px;
  transition: border-color .25s;
}
然後,後面的.input-label這個label元素代替成為我們肉眼看到的佔位符。我們可以採用絕對定位:
.input-fill-box {
    position: relative;
}
.input-label {
    position: absolute;
    left: 16px; top: 14px;
    pointer-events: none;
  color:#BEC1D9;
   padding: 0 2px;
    transform-origin: 0 0;
}

最後,對這個label元素在輸入框focus時候,以及非placeholder顯示的時候進行重定位(縮小並位移到上方):

.input-fill:not(:placeholder-shown) ~ .input-label,
.input-fill:focus ~ .input-label {
    transform: scale(0.75) translate(0, -14px);
}
.input-fill:focus
{
    border-color: #283282;
}

廣州VI設計公司https://www.houdianzi.com

四、清除按鈕

1.html部分
input上 required是必要屬性,配合CSS偽類實現我們的效果。

<code>
 <a href="JavaScript:" class="clear">close</a>
 </code>

2.CSS部分
使用的是:valid偽類。這是CSS3中新增偽類,IE10+以及其他現代瀏覽器支援,表示表單合法。由於HTML中的<input>有HTML5表單驗證屬性required. 於是,如果文字框沒有內容,則不合法;有內容,則合法,就會觸發這裡的:valid偽類選擇器。而這裡:valid偽類控制後面的清除按鈕顯示,於是就實現了我們想要的效果。
啊,對了。IE11瀏覽器下不是所有的文字框都有黑色的叉叉嗎,會跟這裡的自定義清除按鈕重疊,::-ms-clear { display: none; }這段程式碼可以去之~~

 .clear{
  position:absolute;
  top:10px;
  right:-20px;
   display: none;
    transition: all .25s;
}
.input-fill::-ms-clear { display: none; }
.input-fill:valid + .clear { display: inline; }
.input-fill:not(:focus) + .clear { display: none; }

3.實現的優點
此方法相比傳統JS實現的好處在於,更簡單了。JS的話還要偵聽輸入事件(input)等,比較折騰。CSS的話完全瀏覽器自身事件特性,顯然,高效簡單的多。

4.實現的不足
不足在於,相容性。IE9-以下的瀏覽器只能點蠟燭了。

不過,寫寫原型啊,demo;或者漸進增強使用;或者移動端開發等,都可以試試這個新技能。