vue2 3d 切换器

空闲时写了一个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>
时间: 2024-07-29 03:50:47

vue2 3d 切换器的相关文章

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

今天给大家分享一款基于jQuery带标题的图片3D切换焦点图.这款焦点图适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 在线预览   源码下载 实现的代码. html代码: <div id="wowslider-container"> <div class="ws_images"> <ul> <li><a href="#"> &

KVM(多电脑切换器)

KVM:Keyboard Video Mouse的缩写.KVM 交换机通过直接连接键盘.视频和鼠标 (KVM) 端口,让您能够访问和控制计算机.KVM 技术无需目标服务器修改软件.这就意味着可以在 Windows 的 BIOS 环境下,随时访问目标计算机.KVM 提供真正的主板级别访问,并支持多平台服务器和串行设备.KVM 技术已经从最初的基础SOHO办公型,发展成为企业 IT 基础机房设施管理系统.可以从kvm 客户端管理软件轻松的直接访问位于多个远程位置的服务器和设备.KVM over IP

android学习之--网格视图(GridView)和图像切换器(ImageSwitcher)

         GridView用于在界面上按行.列分布显示多个组件.GridView和ListView有共同父类:AbsListView.GridView与ListView的区别在于:ListView只在一个方向上分布,GridView在两个方向上分布.所以使用GridView时一般都指定numColumns大于1,否则该属性默认值为1,就意味着改GridView只有一列,那就变成了ListView GridView的xml属性 android:strtchMode 的值为:      Im

为什么选择迈拓维矩为VGA矩阵切换器生产厂家

VGA矩阵切换器属于模拟视频矩阵,其主要适用于小型的视频系统,如多媒体会议室.教育培训室等.VGA矩阵切换器与计算机用VGA线缆进行连接,用于传输高解析度计算机视频信号. 为什么选择VGA矩阵切换器生产厂家 当前,在北京.上海.广东等地区生产VGA矩阵切换器的厂家很多,但是各厂家的型号.标准.外形都不相同,在质量上也存在着差异.而广大VGA矩阵切换器客户会被企业的广告所迷惑,无法下手选择设备.此外,购买VGA矩阵切换器应主要产品的适用性,避免产品在工程上使用性能不符等问题. 为什么选择迈拓维矩

Windows Phone模拟器皮肤切换器

想体验一下诺基亚Lumia 710或者Lumia 800?没问题,只需要安装Windows Phone7模拟器,再下载安装这个Windows Phone7模拟器皮肤切换器就可以了.俗话说换个颜色换个心情,或许这个小玩意儿可以帮你提高工作效率. 用这款工具只需要点击鼠标一下就可以将Windows Phone7模拟器的皮肤更换为诺基亚Lumia 710或Lumia 800,还有多种颜色可选,如下: 默认皮肤 微软诺基亚Lumia 710 黑蓝诺基亚Lumia 710 黑黄色诺基亚Lumia 710

矩阵切换器分类大集合

什么是矩阵切换器?  首先来了解一些小概念,在一般习惯中,将形成M×N的结构称为矩阵切换器,而将M×1的结构称为切换器或选择器,1×N的结构称为分配器. 矩阵的原理是利用芯片内部电路的导通与关闭进行接通与关断,并可通过电平进行控制完成信号的选择.www.gzyueda.com 矩阵切换器用于多个音频/视频终端发送多重视频/音频信息.矩阵切换器从计算机.摄影机.DVD机等接收音频/视频信号输入,并将其输出发送至不同终端,如投影机.监控器和多媒体数字信号编译码器. 正确选择适用于特定环境的矩阵切换器

ImageSwitcher (图像切换器,显示图片)

ImageSwitcher继承了ViewSwitcher,主要在切换图片时加入动画效果 使用方法: 1.为ImageSwitcher提供一个ViewFactory,该ViewFactory生成的View组件必须是ImageView 2.切换图片时,用到的3个方法:imageSwitcher.setImageDrawable(Drawable drawable);  imageSwitcher.setImageResource(int resid);  imageSwitcher.setImage

Geeben推出S系列kvm切换器新品

品质升级,Geeben推出S系列新品,高清真彩画质.高兼容性<?xml:namespace prefix="o" ns="urn:schemas-microsoft-com:office:office"> ?xml:namespace> 型号:GBS-2404/GBS-2408/GBS-2416 Geeben该系列产品依据标准19寸机柜尺寸设计,可直接固定于标准机柜,1U高度设计节省空间.为4端口.8端口.16端口企业级高性价比KVM切换器产品,U

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

网格试图(GridView)用于在界面上按行,列分布的方式来显示多个组件. GridView和ListView有共同的父类:AbsListView,因此GridView和ListView具有一定的相似性.GridView和ListView的主要区别在于:ListView只是一个方向上的分布:而GridView则会在两个方向上分布. 与ListView相似的是,GridView也需要通过Adapter来提供显示数据:可以通过SimpleAdapter来为GridView提供数据,也可以通过开发Ba