骚气的input

看到这个标题,想必大家都有兴趣的,今天给大家分享一个不正经的输入框。废话少说,先上效果

代码奉上:

骚气的input

* {

margin: 0;

padding: 0;

}

body {

font-size: 30px;

}

canvas {

position: absolute;

top: 20px;

}

div {

width: 350px;

margin: 100px auto;

position: relative;

}

input {

width: 100%;

height: 30px;

position: absolute;

background: transparent;

border: none;

border-bottom: 2px solid #a0a0a0;

outline: none;

font-size: 30px;

}

.placeholder {

display: inline-block;

position: absolute;

top: -10px;

transition: .4s;

color: #ddd;

}

请输入内容...

var input = document.querySelector('input');

var span = document.querySelector('.placeholder');

input.addEventListener('focus', function () {

if (input.value.length <= 0) {

span.style.transform = 'scale(.8) translate(-20px,-30px)';

animate(false);

}

});

input.addEventListener('blur', function () {

if (input.value.length <= 0) {

span.style.transform = 'none';

animate(true);

}

});

function animate(isBack) {

var canvas = document.getElementById("canvas");

var context = canvas.getContext("2d");

if (!this.border) {

this.border = 1;

input.style.borderBottom = 'none';

}

var width = canvas.width,

height = canvas.height;

var m = Math;

var scale = 50;

var ang = 0,

value = height * .6;

var deg = m.ceil(width / m.PI * 4),

k = isBack ? -12 : 12;

input.style.borderBottom = 'none';

var t = setInterval(function () {

ang += k;

context.clearRect(0, 0, width, height);

context.beginPath();

for (var i = 0; i < deg; i++) {

context.lineTo(m.PI * i / 180 * scale, .3 * m.sin(m.PI * (i - ang) / 180) * scale / 2 + value);

}

context.stroke();

if (m.abs(ang) > width) {//动画完成。重新绘制线条。

context.clearRect(0, 0, canvas.width, canvas.height);

context.beginPath();

context.moveTo(0, value);

context.lineTo(width, value);

context.strokeStyle = '#000';

context.stroke();

clearInterval(t);

}

}, 20);

}

不得不说,html5 canvas太棒了,给了前端充分的想像,结合数学,给我们意想不到的惊喜。 运用canvas最基础的API,简单的三角函数,可视化数学之美。

下面进行技术总结:

1、通过正弦曲线生成N个点,然后通过context.lintTo把所有的点连接起来,形成一个正弦曲线,我们都知道,正弦曲线表达式为:y = sin(x); 主的取值为[-1,1],如果我们在sin前面*一个系数,比如:y=4*sin(x);则表示增大波峰。即上下摆动的幅度增加了4倍。

2、canavs动画的基本原理:画了擦,擦了再画。

3、不要给canvas设置width,height的样式,要用JS 动态设置,用CSS设置的在绘制一些基本图形的时候可能会变形,大家不妨可以试试。

你可能感兴趣的:(骚气的input)