封装一个带动画的输入框
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
body {
background: #f5f5fe;
}
.container {
width: 400px;
margin: 150px auto;
background: #fff;
padding: 30px 20px;
box-sizing: border-box;
}
.input-box {
position: relative;
margin: 20px;
box-sizing: border-box;
}
.input-box label {
position: absolute;
top: 10px;
left: 10px;
transition: .5s;
pointer-events: none;
text-decoration: none;
}
.input-box i {
position: absolute;
bottom: 0px;
left: 50%;
transform: translateX(-50%);
width: 0px;
height: 2px;
background: blue;
transition: .5s;
}
input:focus~i {
width: 100%;
}
input:focus~label,
input:valid~label {
top: -10px;
left: 0;
color: blue;
font-size: 12px;
}
input {
border: none;
border-bottom: 1px solid #aaa;
font-size: 16px;
padding: 10px 5px;
box-sizing: border-box;
outline: none;
display: block;
width: 100%;
}
.button {
position: relative;
display: block;
padding: 10px 20px;
color: #03e9f4;
font-size: 16px;
text-decoration: none;
text-transform: uppercase;
overflow: hidden;
transition: .5s;
width: calc(100% - 40px);
margin: 30px auto;
letter-spacing: 4px;
box-sizing: border-box;
text-align: center;
background: #eaffff;
user-select: none;
cursor: pointer;
}
.button:hover {
background: #03e9f4;
color: #fff;
border-radius: 5px;
box-shadow: 0 0 5px #03e9f4,
0 0 25px #03e9f4,
0 0 50px #03e9f4,
0 0 100px #03e9f4;
}
.button i {
position: absolute;
display: block;
}
.button i:nth-child(1) {
top: 0;
left: -100%;
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent, #03e9f4);
animation: btn-anim1 1s linear infinite;
}
@keyframes btn-anim1 {
0% {
left: -100%;
}
50%,
100% {
left: 100%;
}
}
.button i:nth-child(2) {
top: -100%;
right: 0;
width: 2px;
height: 100%;
background: linear-gradient(180deg, transparent, #03e9f4);
animation: btn-anim2 1s linear infinite;
animation-delay: .25s
}
@keyframes btn-anim2 {
0% {
top: -100%;
}
50%,
100% {
top: 100%;
}
}
.button i:nth-child(3) {
bottom: 0;
right: -100%;
width: 100%;
height: 2px;
background: linear-gradient(270deg, transparent, #03e9f4);
animation: btn-anim3 1s linear infinite;
animation-delay: .5s
}
@keyframes btn-anim3 {
0% {
right: -100%;
}
50%,
100% {
right: 100%;
}
}
.button i:nth-child(4) {
bottom: -100%;
left: 0;
width: 2px;
height: 100%;
background: linear-gradient(360deg, transparent, #03e9f4);
animation: btn-anim4 1s linear infinite;
animation-delay: .75s
}
@keyframes btn-anim4 {
0% {
bottom: -100%;
}
50%,
100% {
bottom: 100%;
}
}
</style>
</head>
<body>
<div class="container">
<div class="input-box">
<input required="" id="ipt" />
<label>请输入手机号</label>
<i></i>
</div>
<div class="input-box">
<input required="" />
<label>请输入验证码</label>
<i></i>
</div>
<div class="button">
<i></i>
<i></i>
<i></i>
<i></i>
登录
</div>
</div>
<hr>
<div id="text"></div>
<script>
const ipt = document.querySelector('#ipt')
const text = document.querySelector('#text')
ipt.oninput = (e) => {
const v = (e.target.value + '').replace(/\D/g, '')
console.log('filter', (v + '').replace(/\D/g, ''))
const r = v.replace(/^(\d{3})/, '$1 ').replace(/(\d{4})/, '$1 ').replace(/-$/, '')
text.innerText = r.substr(0, 13)
ipt.value = r.substr(0, 13)
}
</script>
</body>
</html>
文章仅代表个人观点,如有任何疑问或疏漏之处,欢迎随时评论留言。