使用html+css+js实现3D相册详解编程语言

 使用html+css+js实现3D相册,快来上传的照片吧

  效果图:

使用html+css+js实现3D相册详解编程语言

 

  代码如下,复制即可用:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="UTF-8"> 
<title>Title</title> 
<style> 
html, 
body { 
margin: 0; 
padding: 0; 
background-color: #29454d; 
/*禁止文字被选中*/ 
-moz-user-select: none; 
/*火狐*/ 
-webkit-user-select: none; 
/*webkit浏览器*/ 
-ms-user-select: none; 
/*IE10*/ 
-khtml-user-select: none; 
/*早期浏览器*/ 
user-select: none; 
overflow: hidden; 
} 
.box { 
position: relative; 
height: 500px; 
width: 500px; 
margin: 100px auto; 
transform-style: preserve-3d; 
perspective: 2000px; 
} 
.di { 
position: absolute; 
left: 50%; 
top: 50%; 
height: 200px; 
width: 200px; 
transform: translate(-50%, -50%) rotatex(90deg); 
transform-style: preserve-3d; 
} 
.z { 
position: relative; 
height: 200px; 
width: 200px; 
border-radius: 50%; 
transform-style: preserve-3d; 
/*transform: rotatez(1deg);*/ 
} 
p { 
margin: 0; 
position: absolute; 
top: 0; 
/*为了保证圆心在父盒子中心,父盒子旋转时圆心稳定,所以设置left*/ 
left: 25px; 
height: 200px; 
width: 150px; 
border: 2px solid #fd7068; 
box-sizing: border-box; 
background-color: #ffffff; 
background-size: cover; 
background-position: center; 
background-repeat: no-repeat; 
/*opacity: .7;*/ 
font-size: 10px; 
line-height: 200px; 
text-align: center; 
/*box-shadow: 0 0 100px #16ff8b;*/ 
/*倒影,不兼容*/ 
-webkit-box-reflect: below 10px -webkit-linear-gradient(top, rgba(250, 250, 250, 0), rgba(250, 250, 250, .0) 30%, rgba(250, 250, 250, 0.5)); 
box-reflect: below 10px -webkit-linear-gradient(top, rgba(250, 250, 250, 0), rgba(250, 250, 250, .0) 30%, rgba(250, 250, 250, 0.5)); 
/*backface-visibility: hidden;*/ 
} 
</style> 
</head> 
<body> 
<div class="box"> 
<div class="di"> 
<div class="z"> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
<p>可以拖拽图片文件进来</p> 
</div> 
</div> 
</div> 
<script> 
window.onload = function () { 
setPs(); 
move(); 
drop(); 
} 
//给每个p标签设置位置 
function setPs() { 
var ps = document.getElementsByTagName('p'); 
for (var i = 0; i < ps.length; i++) { 
ps[i].style.transform = 'rotatex(-90deg) rotatey(' + i * 30 + 'deg) translatez(400px)' 
} 
} 
//鼠标拖动旋转 
function move() { 
var zBox = document.querySelector('.z'); 
var xBox = document.querySelector('.di'); 
//声明计算鼠标移动速度用的变量 
var speedTimer = null; 
var speedX = 0; 
var speedY = 0; 
//声明记录旋转角度的两个变量 
var xDegNow = 90; 
var zDegNow = 0; 
//声明变量记录要旋转的角度 
var xDegDistance = 0; 
var zDegDistance = 0; 
//声明变量记录是否发生鼠标移动事件 
var isMove = false; 
window.onmousedown = function (e) { 
//鼠标按下 
//清除过渡属性 
            xBox.style.transition = ''; 
zBox.style.transition = ''; 
//记录按下的坐标以及计算速度的初始坐标 
var xstart = e.clientX; 
var speedX_start = xstart; 
var ystart = e.clientY; 
var speedY_start = ystart; 
//记录用来计算速度的初始时间 
var tstart = new Date().getTime(); 
var tnow = tstart; 
//设置计时器更新计算速度的当时时间 
            speedTimer = setInterval(function () { 
tnow = new Date().getTime(); 
},10) 
window.onmousemove = function (e) { 
//鼠标移动 
                isMove = true; 
//记录当时的坐标计算距离 
var xnow = e.clientX; 
var ynow = e.clientY; 
var xDistance = xnow - xstart; 
var yDistance = ynow - ystart; 
//如果计时超过一定时间(10毫秒),计算速度 
if (tnow - tstart >= 10) { 
//速度=(现在的坐标-初始坐标)/(现在时间-初始时间) 
                    speedX = (xnow - speedX_start) / (tnow - tstart); 
speedY = (ynow - speedY_start) / (tnow - tstart); 
//让初始时间和坐标等于现在的时间和坐标 
                    tstart = tnow; 
speedX_start = xnow; 
speedY_start = ynow; 
} 
//把鼠标移动距离计算成角度后设置到页面上 
                zDegDistance = zDegNow - (xDistance / 10); 
zBox.style.transform = 'rotatez(' + zDegDistance + 'deg)'; 
xDegDistance = xDegNow - (yDistance / 10); 
xDegDistance = xDegDistance > 179 ? 179 : xDegDistance < 1 ? 1 : xDegDistance; 
xBox.style.transform = 'translate(-50%,-50%) rotatex(' + xDegDistance + 'deg)'; 
}; 
}; 
window.onmouseup = function (e) { 
//鼠标松开 
//清除计时器 清除鼠标移动事件 
            clearTimeout(speedTimer); 
window.onmousemove = null; 
//判断如果发生移动 
if (isMove) { 
//添加过渡属性 
                xBox.style.transition = 'all 0.5s ease-out'; 
zBox.style.transition = 'all 0.5s ease-out'; 
//根据速度计算目标角度,设置到页面上 
                zDegDistance = zDegDistance - (speedX * 10); 
zBox.style.transform = 'rotatez(' + zDegDistance + 'deg)'; 
xDegDistance = xDegDistance - (speedY * 10); 
xDegDistance = xDegDistance > 179 ? 179 : xDegDistance < 1 ? 1 : xDegDistance; 
xBox.style.transform = 'translate(-50%,-50%) rotatex(' + xDegDistance + 'deg)'; 
//记录当前角度的值更新 
                xDegNow = xDegDistance; 
zDegNow = zDegDistance; 
//用到的变量重置 
                isMove = false; 
speedX = 0; 
speedY = 0; 
xDegDistance = 0; 
zDegDistance = 0; 
} 
}; 
} 
//鼠标拖拽文件 
function drop() { 
//取消鼠标拖拽文件进入窗口的默认行为 
        window.ondragover = function (e) { 
e.preventDefault(); 
} 
window.ondrop = function (e) { 
e.preventDefault(); 
} 
//添加拖拽到p标签的事件 
var ps = document.getElementsByTagName('p'); 
for (var i = 0; i < ps.length; i++) { 
ps[i].index = i; 
ps[i].ondrop = function (e) { 
var w = new FileReader(); 
w.index = this.index; 
w.readAsDataURL(e.dataTransfer.files[0]); 
w.onload = function () { 
ps[this.index].style.backgroundImage = 'url(' + w.result + ')'; 
ps[this.index].innerHTML = ''; 
} 
} 
} 
} 
</script> 
</body> 
</html>

 如有错误,请联系我改正,非常感谢!!!

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12323.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论