jquery+CSS3实现3D拖拽相册效果


Posted in Javascript onJuly 18, 2016

很久之前练习过的一个实践,复习完渐变、圆角、3D变形、拖拽等等来看源码,估计还不会太凌乱(◎?◎)哈哈哈

效果图:

jquery+CSS3实现3D拖拽相册效果

HTML:

<!doctype html>
<html onselectstart="return false;" lang="en"><!-- !important -->
<head>
  <meta charset="UTF-8">
  <title>3D拖拽相册</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
 <!-- html上阻止默认行为onselectstart -->
  <div class="pic">
    <img src="images/1.jpg" />
    <img src="images/2.jpg"/>
    <img src="images/3.jpg" />
    <img src="images/4.jpg" />
    <img src="images/5.jpg" />
    <img src="images/6.jpg" />
    <img src="images/7.jpg" />
    <img src="images/8.jpg" />
    <img src="images/9.jpg" />
    <img src="images/10.jpg" />
    <img src="images/11.jpg" />

    <p></p>
  </div>
  <script type="text/javascript" src="js/jquery.js"></script>
  <script type="text/javascript" src="js/index.js"></script>
</body>
</html>

CSS:

*{margin:0;padding:0;}
body,html{background:#000;}
.pic{
  width:120px;height:180px;
  margin:150px auto 0;
  border:1px solid red;
  position:relative;
  transform-style:preserve-3d;/*设置3D环境*/
  /*perspective:800px;不用这个*/
  transform:perspective(800px) rotateX(-10deg) rotateY(0deg);
}
.pic img{
  position:absolute;
  height:100%;width:100%;
  border-radius:5px;
  box-shadow:0 0 10px #fff;
  /*背景渐变效果!important*/
  -webkit-box-reflect:below 10px
  -webkit-linear-gradient(top,rgba(0,0,0,0) 80%,rgba(0,0,0,1) 100%);
}
.pic p{
  width:1200px;height:1200px;
  /*放射性背景渐变*/
  background:
  -webkit-radial-gradient(center center,400px 400px,rgba(255,255,255,0.2),rgba(0,0,0,0));
  position:absolute;
  left:50%;top:100%;
  /*往回移动位置*/
  margin-left:-600px;
  margin-top:-600px;
  transform:rotateX(90deg);
  border-radius:600px;
}

 JQ:

$(function(){
  var imgL=$("div.pic img").size();//获取到图片总数
  // alert(imgL);
  var deg=360/imgL;//每张图片需要旋转的角度
  var roY=0,roX=0;//定义父盒子旋转初始值
  var xN,yN;//定义当前点击处的坐标和前一坐标的距离差
  var play;//定义定时器
  $("div.pic img").each(function(i){
    //设置每张图片 的3D位置
    $(this).css({"transform":"rotateY("+i*deg+"deg) translateZ(350px)"});
    $(this).attr("ondragstart","return false");//每张图片都禁止拖拽
  });
  $(document).mousedown(function(ev){
    //每次都先清除定时器,防止混乱
    clearInterval(play);
    //获取当前点击处的坐标
    var x_=ev.clientX;
    var y_=ev.clientY;
    $(this).bind("mousemove",function(ev){
      //获取移动后的坐标
      var x=ev.clientX;
      var y=ev.clientY;
      //获取移动后,当前坐标和前一坐标的距离差
      xN=x-x_;
      yN=y-y_;
      //将距离差转变为容器旋转的数值
      roY+=xN*0.2;
      roX-=yN*0.1;
      /*$("body").append("<div style='background:red;width:5px;height:5px;position:absolute;top:"+y+"px;left:"+x+"px;'></div>");
此处为方便看到效果*/
      $("div.pic").css({
        "transform":"perspective(800px) rotateY("+roY+"deg) rotateX("+roX+"deg)"
      });
      //将移动后的点设为前一点存放到x_,y_变量中
      x_=ev.clientX;
      y_=ev.clientY;
    })
  }).mouseup(function(){
    //鼠标抬起时,解绑鼠标移动事件
    $(this).unbind("mousemove");
    //鼠标抬起时候,实现惯性缓冲效果
    play=setInterval(function(){
      //将距离插值慢慢变小,实现惯性缓冲
      xN*=0.95;
      yN*=0.95;
      //向左拖动的时候,当前点与前一点的距离差是负值的,要取绝对值
      //停止惯性
      if(Math.abs(xN)<1&&Math.abs(yN)<1){
        clearInterval(play);
      }
      //将距离差转为旋转角度
      roY+=xN*0.2;
      roX-=yN*0.1;
      $("div.pic").css({
        "transform":"perspective(800px) rotateY("+roY+"deg) rotateX("+roX+"deg)"
      });
    },30);
  })
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
iframe子父页面调用js函数示例
Nov 07 Javascript
js设置function参数默认值(适合没有传参情况)
Feb 24 Javascript
jQuery中end()方法用法实例
Jan 08 Javascript
Javascript中setTimeOut和setInterval的定时器用法
Jun 12 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
Dec 03 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
Jan 12 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
Aug 15 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
Jan 26 Javascript
利用原生的JavaScript实现简单拼图游戏
Nov 18 Javascript
通过实践编写优雅的JavaScript代码
May 30 Javascript
vue基本使用--refs获取组件或元素的实例
Nov 07 Javascript
Js和VUE实现跑马灯效果
May 25 Javascript
完美实现八种js焦点轮播图(下篇)
Apr 20 #Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 #Javascript
jQuery实现根据滚动条位置加载相应内容功能
Jul 18 #Javascript
JS HTML5拖拽上传图片预览
Jul 18 #Javascript
jQuery 操作input中radio的技巧
Jul 18 #Javascript
JS HTML5实现拖拽移动列表效果
Aug 27 #Javascript
浅谈$('div a') 与$('div&gt;a')的区别
Jul 18 #Javascript
You might like
一个域名查询的程序
2006/10/09 PHP
php 使用post,get的一种简洁方式
2010/04/25 PHP
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
Javascript之深入浅出prototype
2017/02/06 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
ES6新增的数组知识实例小结
2020/05/23 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
django将数组传递给前台模板的方法
2019/08/06 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
软件毕业生个人鉴定
2014/03/03 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
校园开放日新闻稿
2015/07/17 职场文书
患者身份识别制度
2015/08/06 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript