进阶HTML教学,先看实例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>可交互3D篮球</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background: #121212;
perspective: 800px; /* 开启3D透视 */
}
.container {
transform-style: preserve-3d;
cursor: grab;
}
.container:active {
cursor: grabbing;
}
.basketball {
width: 200px;
height: 200px;
border-radius: 50%;
background: #e67e22;
position: relative;
box-shadow: inset -25px -25px 50px rgba(0,0,0,0.4);
transform-style: preserve-3d;
}
/* 篮球纹路 */
.basketball::before,
.basketball::after {
content: '';
position: absolute;
background: #000;
}
.basketball::before {
width: 6px;
height: 100%;
left: 50%;
transform: translateX(-50%);
}
.basketball::after {
width: 100%;
height: 6px;
top: 50%;
transform: translateY(-50%);
}
</style>
</head>
<body>
<div class="container" id="wrap">
<div class="basketball" id="ball"></div>
</div>
<script>
const wrap = document.getElementById('wrap');
let startX = 0, startY = 0;
let rotateX = 0, rotateY = 0;
let scale = 1;
let isDrag = false;
// 鼠标按下
wrap.addEventListener('mousedown', e => {
isDrag = true;
startX = e.clientX;
startY = e.clientY;
});
// 鼠标移动
document.addEventListener('mousemove', e => {
if (!isDrag) return;
const dx = e.clientX - startX;
const dy = e.clientY - startY;
rotateY += dx * 0.5;
rotateX -= dy * 0.5;
wrap.style.transform = `rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;
startX = e.clientX;
startY = e.clientY;
});
// 鼠标松开
document.addEventListener('mouseup', () => {
isDrag = false;
});
// 滚轮缩放
wrap.addEventListener('wheel', e => {
e.preventDefault();
scale += e.deltaY > 0 ? -0.05 : 0.05;
// 限制缩放范围
scale = Math.max(0.5, Math.min(scale, 2));
wrap.style.transform = `rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;
});
</script>
</body>
</html>
一个可以交互的3d篮球,运行结果

关注我 看更多精彩实例
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END







暂无评论内容