空闲时写了一个3d切换器,灵感来自于转行前画3d工程图,效果如图:

  功能:按住鼠标中间,变为3d模式,点击6个页面中的某一个页面,页面旋转放大,恢复到2d图形,3d图消失。再次点击鼠标中间,恢复为3d(含动画效果),按住中键不放,可以左右或者上下拖动,3d图片做720°旋转。

  效果可在:此处查看 请使用chrome打开

  转动原理:由于正方体只有6个面,所以ul+6个li标签,先做出正方体布局。li标签布局出正方向后,都是相对于ul标签的位置,所以转动ul标签,正方形并不会散架。鼠标水平移动X为ul transform:rotateX(x),鼠标竖直移动Y为ul的transform:rotateY(-Y) 实现转动。-Y是为了一开始竖直方向不要反方向转动。

关于坐标轴正方向:x轴:从左到右,y轴:从上到下,z轴:从屏幕到眼睛。坐标系是会转动的,这点非常恶心。

  转动正方向:眼睛在坐标原点观察,逆时针为正方向。比如rotateX(30deg),指绕x轴正方向转30°。看到的那一面是下面往上跑的。

  动画布局:ul li 为百分比布局,外层套一层div,实际切换动画由放大缩小div的大小来实现。动画时保存3d图形位置,当然只需要保存ul的转动数据,当按下中键后,恢复ul转动数据,恢复div大小,就可以了。

  动画层:1、div tansition all 1s 这个动画是渐变放大与缩小,让ul与li都同时放大缩小。 2、ul transition all 1s 这儿需要动态加入属性,转动时不需要,切换时才需要,效果为切换时转动放大和缩小 3、transiton-group 包裹li标签,这儿动画是为了其中5个标签渐变消失,只留一个标签。

  有了上面的理论,基本可以写出来了,这儿贴出代码。

<template>
<div class='r' @mousedown='start'>
<div ref='odiv' :style='odiv' class='oDiv'>
<ul :class='ulClass' :style="ulSty" v-show='showUl' >
<transition-group name='tt' enter-active-class='animated fadeIn' leave-active-class='animated fadeOut'> <!--淡入淡出效果-->
<li v-for='n in 6' class='li' v-show='showLi[n-1]' ref='n' :key='n' @mousedown='show(n,$event)'>
<component :is='msg[n-1]' class='com'></component>
</li>
</transition-group>
</ul>
</div>
</transition>
</div>
</template> <script>
import pieChart from './pieChart.vue'
import barChart from './barChart.vue'
import info from './info.vue'
import table1 from './table.vue'
import baidu from './baidu.vue'
import reg from './reg.vue'
export default{
data(){
return{
msg:['info','barChart','reg','table1','baidu','pieChart'],
n:'',
m:true,
showUl:true,
ulClass:'ul1',
flag:true,
odiv:{
width:'300px',
height:'300px',
margin:'50px auto 100px',
transition:'all 1s'
},
showLi:[true,true,true,true,true,true],
ulSty:{
transform:''
}, changeSty:[],
drag:{lastX:0,lastY:0,X:0,Y:0},
}
},
components:{
pieChart,barChart,info,table1,baidu,reg
},
methods:{
show(n,e){//点击鼠标左键,显示该组件。
if(e.button!=0)return
if(!this.flag)return
this.flag=false//show某个组件的时候,不能再次show它。
this.n=nthis.odiv.width='100%'
this.odiv.height='500px'
let b= this.$refs.n[n-1].style
let d=getComputedStyle(this.$refs.n[n-1],null)['background']
b.overflow='visible'
b.opacity='1'
b.background='#fff'
b.transition='all 1s'
this.showLi=[false,false,false,false,false,false]
this.showLi[n-1]=true
this.ulClass='ul1 move'
let c=getComputedStyle(this.$refs.n[n-1],null)['transform']
this.changeSty=[this.ulSty.transform,c,d]
this.ulSty.transform='rotateX(0deg) rotateY(0deg)'
b.transform='rotateX(0deg) rotateY(0deg) translateZ(0px)'
},
init(){//当点击鼠标中键,恢复3d图形之前的位置。初始化li,ul,div的属性。
let b= this.$refs.n[this.n-1].style
b.overflow='hidden'
b.opacity='0.8'
b.background=this.changeSty[2]
b.transform=this.changeSty[1]
this.odiv.width='300px'
this.odiv.height='300px'
this.showLi=[true,true,true,true,true,true]
this.ulClass='ul1'
this.ulSty.transform=this.changeSty[0]
},
start(e){//转动效果
if(e.button!=1)return
if(this.n){
this.init()
}
e.preventDefault();
this.flag=true
let x1=e.clientX,
y1=e.clientY
document.onmousemove=(evt)=>{
let dx=evt.clientX-x1
let dy=evt.clientY-y1
this.drag.X=(this.drag.lastX+dx)%360
this.drag.Y=(this.drag.lastY+dy)%360
this.ulSty.transform='rotateX('+ -this.drag.Y+'deg) rotateY('+this.drag.X+'deg)'
}
document.onmouseup=()=>{
this.drag.lastX=this.drag.X
this.drag.lastY=this.drag.Y
document.onmouseup=null
document.onmousemove=null
}
}
},
} </script> <style lang="stylus" scoped>
.com
position:absolute
width:100% .r
width:100%
wh()
width:100%
height:100% .ul1
position relative
wh()
transform-style: preserve-3d;
.move
transition all 1s
.li
list-style:none
wh()
position:absolute
font-size 40px
background:#fff
z-index:0
transform-origin:center center
overflow:hidden
transition:all 1s
n(x,y,z)
transform:rotateY(y) rotateX(x) translateZ(150px)
background:rgba(z,0.8)
.li:nth-child(1)
n(0,90deg,burlywood)
.li:nth-child(2)
n(0,-90deg,beige)
.li:nth-child(3)
n(90deg,0,lightyellow)
.li:nth-child(4)
n(180deg,0,pink)
.li:nth-child(5)
n(270deg,0,#20A0FF)
.li:nth-child(6)
n(0,0,aquamarine) </style>

vue2 3d 切换器的更多相关文章

  1. C# 方法调用的切换器 Update 2015.02.02

    在编写应用程序时,我们经常要处理这样的一组对象,它们的类型都派生自同一个基类,但又需要为每个不同的子类型应用不同的处理方法. 通常的做法,最简单的就是用很多 if-else 去判断各自的类型,如下面的 ...

  2. KVM切换器

    所谓KVM,就是Keyboard.Video.Mouse的缩写,正式的名称为多计算机切换器.简单的说,就是一组键盘.显示器和鼠标,控制2台.4 台.8台.16台甚至到4096台以上的计算机主机. KV ...

  3. Android 自学之网格试图(GridView)和图片切换器(ImageSwitcher)功能和用法

    网格试图(GridView)用于在界面上按行,列分布的方式来显示多个组件. GridView和ListView有共同的父类:AbsListView,因此GridView和ListView具有一定的相似 ...

  4. Android应用开发学习之图片切换器

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 如果我们要实现类似Windows的照片查看器切换上一张下一张照片的效果,可以使用图片切换器ImageSwitcher ...

  5. 基于jQuery带标题的图片3D切换焦点图

    今天给大家分享一款基于jQuery带标题的图片3D切换焦点图.这款焦点图适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 实现的代码. htm ...

  6. 文本切换器(TextSwitcher)的功能和用法

    TextSwitcher继承了ViewSwitcher,因此它具有与ViewSwitcher相同的特征:可以在切换View组件的同时使用动画效果.与ImageSwitcher相似的是,使用TextSw ...

  7. [jk]服务器远控卡及kvm切换器

    远控卡的需求 经常我们有这么一个需求,那就是某一台器服务器突然宕机,不能启动,而机房却在外地.解决这个问题的方法有两种,一是联系机房人员,二是通过idrac卡远程连接.我们必须根据事情的轻重缓急,来选 ...

  8. 51nod 1293 球与切换器 | DP

    51nod 1293 球与切换器 | DP 题面 有N行M列的正方形盒子.每个盒子有三种状态0, -1, +1.球从盒子上边或左边进入盒子,从下边或右边离开盒子.规则: 如果盒子的模式是-1,则进入它 ...

  9. 轻量i3wm配置使用笔记 -- 主题切换器(j4-make-config)

    快速切换主题 j4-make-config介绍: j4-make-config脚本可以方便地在几组"主题"之间切换,还可以根据当前工作的环境,轻松地从几个不同的配置部分组合一个完整 ...

随机推荐

  1. Linux下RabbitMq安装

    在大多数大公司,像应用服务器软件的安装.部署都是运维的事情,其实自己去尝试部署一下,也是有收获的. 有机会正好尝试了Linux下的rabbitMq安装过程,做了记录,希望有用到的人可以做下参考. 安装 ...

  2. python自带库及第三方库api察看

    今天发现一个很有意思的功能,python自带了所有库的文档查看器,配置如下: 配置pydoc服务,cmd中输入如下代码: python –m pydoc –p 1234 回车后 ,使用过程中,该窗口不 ...

  3. POI tools 参数化生成excel表格

    package com.eccom.neteagle.server.confsave.service.impl; import java.io.File; import java.io.FileNot ...

  4. [Shell]crontab 运行任务调用shell脚本,相对路径无法找到

    问题出现的场景大概就是 1  cron调用一个python脚本 2  python脚本中调用一个shell脚本(对日志分析)获取shell输出然后发送邮件 类似一个监控任务. 直接运行python脚本 ...

  5. 開始:触摸MySQL

    学习MySQL.少不了安装一个MySQL数据库,安装想必非常easy,事实上也是.我下载了一个MySQL5.7.百度了一下安装步骤,就成功安装了.相对于Oracle来说要简单不少. 买了两本书,看了& ...

  6. css怎样让背景充满整个屏幕

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 前端优化之动画为什么要尽量用css3代替js

    导致JavaScript效率低的两大原因:操作DOM和使用页面动画.通常我们会通过频繁的操作 DOM的CSS来实现视觉上的动画效果,导致js效率低的两个因素都包括在内了在频繁的操作DOM和CSS时,浏 ...

  8. Java快速排序算法

    快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...

  9. objective-c 开发最简单的UITableView时数据进不去的问题

    今天在使用UITableView时遇到的问题,我在plist文件配置的数据进不去列表,以下是解决方案 问题原因:plist文件root的type配置错误 如上图所示,博主是使用plist文件作为我的沙 ...

  10. 自学Zabbix3.9.1-模板Templates-创建

    自学Zabbix3.9.1-模板Templates-创建 1. 模板介绍 模板是一组可以方便地应用于多个主机的实体. 实体可能是: 项目 触发器 图 应用程序 屏幕(因为Zabbix 2.0) 低层次 ...