使用css3和tween.js二种方式实现照片翻转

照片翻转的二种方式

最近在学习使用动画效果,经常去鑫空间翻看大神写得博客,最近看到最新3月份出炉的博客–小tips: 在canvas上实现元素图片镜像翻转动画效果,我就想到自己也有需要展示照片的时候,只实现过一种鼠标mouseover时照片放大,鼠标mouseleave时照片复原的效果,实在是太简陋了!看到这个canvas图片水平镜像翻转动画实例页面后,很想在用css实现这个效果(后话是css实现太简单了)。

1.css展示的2种方式

我想到2种使用css实现照片旋转的方式,其一是hover,其二是点击事件绑定class。其核心代码是:

ul li >section{
    transition: 0.6s;
}
ul li:hover .back{
    transform: rotateY(180deg);
}
ul li .back2{
    transform: rotateY(180deg);
}

大家是不是觉得很low,寥寥几行代码,想哭的心都有了,原来css的实现方式就是这么简单。

2.页面代码

<template>
    <section>
        <h1>照片旋转演示组件</h1>
        <section id="container">
            <ul>
                <li>
                    <section class="back">
                        <img src="~assets/img/people/1.jpg" alt="" >
                    </section>
                    <p>CSS方式一:hover</p>
                </li>
                <li @click="isPositive = !isPositive">
                    <section :class="isPositive ? 'back2' : ''">
                        <img src="~assets/img/people/2.jpg" alt="" >
                    </section>
                    <p>CSS方式二:点击事件绑定class</p>
                </li>
                <li @click="onFlip">
                    <section>
                        <img src="~assets/img/people/3.jpg" alt="" id="img" >
                    </section>
                    <p>JS方式一:使用Tween.js动画算法加载不同旋转角度</p>
                </li>
            </ul>
            <select v-model="picParam.algorithm">
                <option v-for="item in tweenStr.algorithm" v-text="item"></option>
            </select>
            <select v-model="picParam.rapidity">
                <option v-for="item in tweenStr.rapidity" v-text="item"></option>
            </select>
        </section>
    </section>
</template>

3.使用Tween.js运动缓动算法实现照片翻转,更加灵活!

看到了大神张花废篇幅介绍的运动缓动算法Tween.js,就特别想在照片翻转中用到它!这个算法用于实现动画效果的,而且代码量特别少,使用灵活。
Tween.js使用示例如下:

// 使用Tween.js动画库实现图片翻转
 onFlip () {
     let self = this
     if (self.picParam.isMove) {
         return
     }
     self.picParam.isMove = true
     // 水平翻转动画
     let img = document.getElementById('img')
     Math.animation(-180 + self.picParam.deg, 0 + self.picParam.deg, 600, self.picParam.algorithm + '.' + self.picParam.rapidity, function (value, isEnding) {
         img.style.transform = 'rotateY('+value+'deg)'
         if (isEnding) {
             self.picParam.isMove = false
             self.picParam.isflip = !self.picParam.isflip
             self.picParam.deg = self.picParam.isflip ? 0 : 180
         }
     })
 }

实现效果如下:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,three.jstween.js可以一起使用实现复杂的动画效果,包括飞线动画。以下是一个简单的例子,演示了如何使用three.jstween.js创建一条飞线动画: ```javascript // 创建three.js场景 var scene = new THREE.Scene(); // 创建相机 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; // 创建渲染器 var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建飞线路径 var curve = new THREE.CatmullRomCurve3([ new THREE.Vector3(-10, 0, 0), new THREE.Vector3(-5, 5, 0), new THREE.Vector3(0, 0, 0), new THREE.Vector3(5, -5, 0), new THREE.Vector3(10, 0, 0) ]); // 创建飞线材质 var material = new THREE.LineBasicMaterial({ color: 0xffffff }); // 将飞线路径转换为几何体 var geometry = new THREE.Geometry(); geometry.vertices = curve.getPoints(50); // 创建飞线网格 var line = new THREE.Line(geometry, material); scene.add(line); // 创建飞线动画 var tween = new TWEEN.Tween({t:0}) .to({t:1}, 5000) // 5秒钟 .onUpdate(function() { // 根据tween的进度计算飞线的位置 var position = curve.getPoint(this.t); // 更新飞线网格的位置 line.position.copy(position); }) .start(); // 渲染场景 function render() { requestAnimationFrame(render); TWEEN.update(); // 更新tween动画 renderer.render(scene, camera); } render(); ``` 在这段代码中,我们首先创建了一个three.js场景、相机和渲染器。然后,我们创建了一个CatmullRomCurve3曲线,用于定义飞线路径,并将其转换为three.js几何体。接下来,我们创建了一个TWEEN.Tween对象,将其起始值设置为0,结束值设置为1,表示飞线动画的进度。在Tween对象的 onUpdate 回调函数中,我们根据飞线路径计算当前进度对应的位置,并将飞线网格的位置更新为该位置。最后,我们创建了一个渲染函数,用于在每帧更新Tween动画和渲染场景。 希望这个例子可以帮助你了解如何使用three.jstween.js创建飞线动画

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值