本文來自「心譚博客」的 《動畫設計·輸入框特效》,更多文章放在了 Github歡迎交流和Starcss
劃線動態:html
動態邊框:git
:before
和 :after
僞元素指定了一個元素文檔樹內容以前和以後的內容。因爲input
標籤不是可插入內容的容器。因此這裏下劃線沒法經過僞元素來實現。須要藉助其餘 dom 節點。github
<div> <input type="text" /> <span></span> </div>
包裹在外的父元素div
應該設置成inline-block
,不然寬度會滿屏。dom
div { position: relative; display: inline-block; }
input
標籤須要禁用默認樣式:字體
input { outline: none; border: none; background: #fafafa; }
span
標籤實現「左進右出」的動態,須要改變transform-origin
方向。爲了不迴流重繪,經過scaleX
來實現寬度變化的視覺效果。動畫
input ~ span { position: absolute; left: 0; right: 0; bottom: 0; height: 1px; background-color: #262626; transform: scaleX(0); transform-origin: right center; transition: transform 0.3s ease-in-out; } input:focus ~ span { transform: scaleX(1); transform-origin: left center; }
如動態圖所示,有 4 條邊框。因此除了input
元素外,還須要準備其餘 4 個 dom。爲了方便定位,嵌套一個父級元素。spa
<div> <input type="text"> <span class="bottom"></span> <span class="right"></span> <span class="top"></span> <span> </div>
和「劃線動態」相似,input 和 div 的樣式基本同樣。爲了好看,改一下 padding 屬性。設計
div { position: relative; display: inline-block; padding: 3px; } input { outline: none; border: none; background: #fafafa; padding: 3px; }
對於其餘 4 個 span 元素,它們的位置屬性,動畫屬性,以及顏色都是相同的:code
.bottom, .top, .left, .right { position: absolute; background-color: #262626; transition: transform 0.1s ease-in-out; }
對於.bottom 和.top,它們的變化方向是水平;對於.left 和.right,它們的變化方向是垂直。
.bottom, .top { left: 0; right: 0; height: 1px; transform: scaleX(0); } .left, .right { top: 0; bottom: 0; width: 1px; transform: scaleY(0); }
下面就是處理延時的特效。動態圖中,動畫按照下、右、上、左的順序依次變化。藉助的是transition-delay
屬性,來實現動畫延遲。
.bottom { bottom: 0; transform-origin: right center; } input:focus ~ .bottom { transform: scaleX(1); transform-origin: left center; } .top { top: 0; transform-origin: left center; transition-delay: 0.2s; } input:focus ~ .top { transform: scaleX(1); transform-origin: right center; } .right { transform-origin: top center; right: 0; transition-delay: 0.1s; } input:focus ~ .right { transform: scaleY(1); transform-origin: bottom center; } .left { left: 0; transform-origin: bottom center; transition-delay: 0.3s; } input:focus ~ .left { transform: scaleY(1); transform-origin: top center; }