js实现眼睛会动的卡通人物+canvas绘制的背景图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

js实现眼睛会动的卡通⼈物+canvas绘制的背景图成品图:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
}
.peo{
height: 500px;
width: 160px;
position: absolute;
bottom: 0;
left: 50px;
}
.head{
position: ;
width: 260px;
height: 260px;
background-color: yellow;
position: absolute;
left: -50px;
border-radius: 50%;
box-shadow: 0 0 10px rgb(0,0,0,.5);
}
.boy{
height: 240px;
background: linear-gradient(rgb(138, 43, 226),transparent);
border-top-left-radius: 35%;
border-top-right-radius: 35%;
box-shadow: 0 0 10px rgb(0,0,0,.8);
}
.yob{
height: 260px;
}
.eye{
position: absolute;
height: 100px;
width: 100px;
background-color: white;
border-radius: 50%;
top: 20%;
left: 20px;
}
.eye:nth-of-type(2){
left: 140px;
}
.rad{
height: 15px;
width: 15px;
background-color: #000;
border-radius: 50%;
top: 45px;
left: 45px;
position: absolute;
}
.mou{
position: absolute;
width: 80px;
height: 35px;
background-color: orangered;
top: 70%;
top: 70%;
left:70px;
border-bottom-left-radius: 60px;
border-bottom-right-radius: 60px;
overflow: hidden;
}
.mou_rad{
height: 20px;
width: 15px;
background-color: white;
position: absolute;
left: 50%;
border-bottom-left-radius: 7.5px;
border-bottom-right-radius: 7.5px;
}
body {
width: 100%;
height: 100vh;
background-color: #000;
background-image: radial-gradient(circle at top right, rgba(121, 68, 154, 0.13), transparent), radial-gradient(circle at 20% 80%, rgba(41, 196, 255, 0.13), transparent);overflow: hidden
}
canvas {
position: fixed;
width: 100%;
height: 100%;
}
a {
position: absolute;
bottom: 2vmin;
right: 2vmin;
color: rgba(255,255,255,0.2);
text-decoration: none;
}
a:hover {
color: #fff;
}
</style>
<script src="https:///jquery/1.10.2/jquery.min.js"></script>
<script>
$(function(){
var rado = $(".rad:eq(0)");
var radt = $(".rad:eq(1)");
var a1 = $(".eye:eq(0)").offset().left + $(".eye:eq(0)").innerWidth()/2;
var b1 = $(".eye:eq(0)").offset().top + $(".eye:eq(0)").innerHeight()/2;
var a2 = $(".eye:eq(1)").offset().left + $(".eye:eq(1)").innerWidth()/2;
var b2 = $(".eye:eq(0)").offset().top + $(".eye:eq(0)").innerHeight()/2;;
var k1,k2;
$(document).mousemove(function(e){
var x = e.pageX;
var y = e.pageY;
var r1 = 40 < Math.sqrt((x-a1)*(x-a1)+(y-b1)*(y-b1))? 40:Math.sqrt((x-a1)*(x-a1)+(y-b1)*(y-b1)); var r2 = 40 < Math.sqrt((x-a2)*(x-a2)+(y-b2)*(y-b2))? 40:Math.sqrt((x-a2)*(x-a2)+(y-b2)*(y-b2)); k1 = Math.atan2(x-a1,y-b1);
k2 = Math.atan2(x-a2,y-b2);
rado[0].style.left = r1*Math.sin(k1)+45+"px";
rado[0].style.top = r1*Math.cos(k1)+45+"px";
radt[0].style.left = r2*Math.sin(k2)+45+"px";
radt[0].style.top = r2*Math.cos(k2)+45+"px";
radt[0].style.top = r2*Math.cos(k2)+45+"px";
})
$(".head").hover(function(){
$(".mou").css("overflow","visible");
$(".mou").stop().animate({
height:"5px",
width:"120px"
});
$(".mou_rad").stop().animate({
left:'65%',
borderBottomRightRadius:'20px',
borderBottomLeftRadius:'20px',
});
},function(){
$(".mou").stop().animate({
width:"80px",
height:"35px"
});
$(".mou_rad").stop().animate({
height: '20px',
width: '15px',
left: '50%'
});
})
})
</script>
</head>
<body>
<div class="peo">
<div class="head">
<div class="eye">
<div class="rad"></div>
</div>
<div class="eye">
<div class="rad"></div>
</div>
<div class="mou">
<div class="mou_rad"></div>
</div>
</div>
<div class="yob"></div>
<div class="boy"></div>
</div>
<canvas width="1300px" height="800px" ></canvas>
<script>
const STAR_COUNT = ( window.innerWidth + window.innerHeight ) / 8, STAR_SIZE = 3,
STAR_MIN_SCALE = 0.2,
OVERFLOW_THRESHOLD = 50;
const canvas = document.querySelector( 'canvas' ),
context = canvas.getContext( '2d' );
let scale = 1,
width,
height;
let stars = [];
let pointerX,
pointerY;
let velocity = { x: 0, y: 0, tx: 0, ty: 0, z: 0.0005 };
let touchInput = false;
generate();
resize();
step();
window.onresize = resize;
canvas.onmousemove = onMouseMove;
canvas.ontouchmove = onTouchMove;
canvas.ontouchend = onMouseLeave;
document.onmouseleave = onMouseLeave;
function generate() {
for( let i = 0; i < STAR_COUNT; i++ ) {
stars.push({
x: 0,
y: 0,
z: STAR_MIN_SCALE + Math.random() * ( 1 - STAR_MIN_SCALE )
});
}
}
function placeStar( star ) {
star.x = Math.random() * width;
star.y = Math.random() * height;
}
function recycleStar( star ) {
let direction = 'z';
let vx = Math.abs( velocity.x ),
vy = Math.abs( velocity.y );
if( vx > 1 || vy > 1 ) {
let axis;
if( vx > vy ) {
axis = Math.random() < vx / ( vx + vy ) ? 'h' : 'v';
}
else {
axis = Math.random() < vy / ( vx + vy ) ? 'v' : 'h';
}
if( axis === 'h' ) {
direction = velocity.x > 0 ? 'l' : 'r';
}
else {
direction = velocity.y > 0 ? 't' : 'b';
}
}
star.z = STAR_MIN_SCALE + Math.random() * ( 1 - STAR_MIN_SCALE );
if( direction === 'z' ) {
star.z = 0.1;
star.x = Math.random() * width;
star.y = Math.random() * height;
}
else if( direction === 'l' ) {
star.x = -OVERFLOW_THRESHOLD;
star.y = height * Math.random();
}
else if( direction === 'r' ) {
star.x = width + OVERFLOW_THRESHOLD;
star.x = width + OVERFLOW_THRESHOLD;
star.y = height * Math.random();
}
else if( direction === 't' ) {
star.x = width * Math.random();
star.y = -OVERFLOW_THRESHOLD;
}
else if( direction === 'b' ) {
star.x = width * Math.random();
star.y = height + OVERFLOW_THRESHOLD;
}
}
function resize() {
scale = window.devicePixelRatio || 1;
width = window.innerWidth * scale;
height = window.innerHeight * scale;
canvas.width = width;
canvas.height = height;
stars.forEach( placeStar );
}
function step() {
context.clearRect( 0, 0, width, height );
update();
render();
requestAnimationFrame( step );
}
function update() {
velocity.tx *= 0.96;
velocity.ty *= 0.96;
velocity.x += ( velocity.tx - velocity.x ) * 0.8;
velocity.y += ( velocity.ty - velocity.y ) * 0.8;
stars.forEach( ( star ) => {
star.x += velocity.x * star.z;
star.y += velocity.y * star.z;
star.x += ( star.x - width/2 ) * velocity.z * star.z;
star.y += ( star.y - height/2 ) * velocity.z * star.z;
star.z += velocity.z;
// recycle when out of bounds
if( star.x < -OVERFLOW_THRESHOLD || star.x > width + OVERFLOW_THRESHOLD || star.y < -OVERFLOW_THRESHOLD || star.y > height + OVERFLOW_THRESHOLD ) { recycleStar( star );
}
} );
}
function render() {
stars.forEach( ( star ) => {
stars.forEach( ( star ) => {
context.beginPath();
context.lineCap = 'round';
context.lineWidth = STAR_SIZE * star.z * scale;
context.strokeStyle = 'rgba(255,255,255,'+(0.5 + 0.5*Math.random())+')';
context.beginPath();
context.moveTo( star.x, star.y );
var tailX = velocity.x * 2,
tailY = velocity.y * 2;
// stroke() wont work on an invisible line
if( Math.abs( tailX ) < 0.1 ) tailX = 0.5;
if( Math.abs( tailY ) < 0.1 ) tailY = 0.5;
context.lineTo( star.x + tailX, star.y + tailY );
context.stroke();
} );
}
function movePointer( x, y ) {
if( typeof pointerX === 'number' && typeof pointerY === 'number' ) {
let ox = x - pointerX,
oy = y - pointerY;
velocity.tx = velocity.tx + ( ox / 8*scale ) * ( touchInput ? 1 : -1 );
velocity.ty = velocity.ty + ( oy / 8*scale ) * ( touchInput ? 1 : -1 );
}
pointerX = x;
pointerY = y;
}
function onMouseMove( event ) {
touchInput = false;
movePointer( event.clientX, event.clientY );
}
function onTouchMove( event ) {
touchInput = true;
movePointer( event.touches[0].clientX, event.touches[0].clientY, true ); event.preventDefault();
}
function onMouseLeave() {
pointerX = null;
pointerY = null;
}
</script>
</body> </html>。

相关文档
最新文档