基于JS实现动态跟随特效的示例代码

目录
  • 演示
  • 技术栈
  • 源码
    • css部分
    • js部分

演示

技术栈

这次用到了关于css的一些功能,和jQuery。

CSS3中添加的新属性animation是用来为元素实现动画效果的,但是animation无法单独担当起实现动画的效果。承载动画的另一个属性——@keyframes。使用的时候为了兼容可加上-webkit-、-o-、-ms-、-moz-、-khtml-等前缀以适应不同的浏览器。

创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式。

通过 @keyframes 规则,您能够创建动画。

@keyframes定义一个动画,并定义具体的动画效果,比如是放大还是位移等等。

@keyframes 它定义的动画并不直接执行,需要借助animation来运转。

在动画过程中,您能够多次改变这套 CSS 样式。

以百分比来规定改变发生的时间,或者通过关键词 “from” 和 “to”,等价于 0% 和 100%。

源码

css部分

.container{
	text-align:center;
	perspective:500px;
	-webkit-perspective:500px;
	border: 1px solid;
}
.example{
	display:table-cell;
	vertical-align:middle;
	color: #fff;
	width: 150px;
	height: 150px;
	background:url(../images/01.jpg) no-repeat;
}

@-webkit-keyframes topenter {
    from {
        -webkit-transform-origin:top;
        -webkit-transform:rotateX(-90deg);
    }
    to {
        -webkit-transform-origin:top;
        -webkit-transform:rotateX(0deg);
    }
}
@keyframes topenter {
    from {
        transform-origin:top;
        transform:rotateX(-90deg);
    }
    to {
        transform-origin:top;
        transform:rotateX(0deg);
    }
}
@-webkit-keyframes topleave {
    from {
        -webkit-transform-origin:top;
        -webkit-transform:rotateX(0deg);
    }
    to {
        -webkit-transform-origin:top;
        -webkit-transform:rotateX(-90deg);
    }
}
@keyframes topleave {
    from {
        transform-origin:top;
        transform:rotateX(0deg);
    }
    to {
        transform-origin:top;
        transform:rotateX(-90deg);
    }
}
@-webkit-keyframes bottomenter {
    from {
        -webkit-transform-origin:bottom;
        -webkit-transform:rotateX(90deg);
    }
    to {
        -webkit-transform-origin:bottom;
        -webkit-transform:rotateX(0deg);
    }
}
@keyframes bottomenter {
    from {
        transform-origin:bottom;
        transform:rotateX(90deg);
    }
    to {
        transform-origin:bottom;
        transform:rotateX(0deg);
    }
}
@-webkit-keyframes bottomleave {
    from {
        -webkit-transform-origin:bottom;
        -webkit-transform:rotateX(0deg);
    }
    to {
        -webkit-transform-origin:bottom;
        -webkit-transform:rotateX(90deg);
    }
}
@keyframes bottomleave {
    from {
        transform-origin:bottom;
        transform:rotateX(0deg);
    }
    to {
        transform-origin:bottom;
        transform:rotateX(90deg);
    }
}
@-webkit-keyframes leftenter {
    from {
        -webkit-transform-origin:left;
        -webkit-transform:rotateY(90deg);
    }
    to {
        -webkit-transform-origin:left;
        -webkit-transform:rotateY(0deg);
    }
}
@keyframes leftenter {
    from {
        transform-origin:left;
        transform:rotateY(90deg);
    }
    to {
        transform-origin:left;
        transform:rotateY(0deg);
    }
}
@-webkit-keyframes leftleave {
    from {
        -webkit-transform-origin:left;
        -webkit-transform:rotateY(0deg);
    }
    to {
        -webkit-transform-origin:left;
        -webkit-transform:rotateY(90deg);
    }
}
@keyframes leftleave {
    from {
        transform-origin:left;
        transform:rotateY(0deg);
    }
    to {
        transform-origin:left;
        transform:rotateY(90deg);
    }
}
@-webkit-keyframes rightenter {
    from {
        -webkit-transform-origin:right;
        -webkit-transform:rotateY(-90deg);
    }
    to {
        -webkit-transform-origin:right;
        -webkit-transform:rotateY(0deg);
    }
}
@keyframes rightenter {
    from {
        transform-origin:right;
        transform:rotateY(-90deg);
    }
    to {
        transform-origin:right;
        transform:rotateY(0deg);
    }
}
@-webkit-keyframes rightleave {
    from {
        -webkit-transform-origin:right;
        -webkit-transform:rotateY(0deg);
    }
    to {
        -webkit-transform-origin:right;
        -webkit-transform:rotateY(-90deg);
    }
}
@keyframes rightleave {
    from {
        transform-origin:right;
        transform:rotateY(0deg);
    }
    to {
        transform-origin:right;
        transform:rotateY(-90deg);
    }
}

js部分

$(function () {
     //initialize
     $('.container').css({
         'perspective-origin': '50% 0%',
         '-webkit-perspective-origin': '50% 0%'
     });
     $('.container .example').css({
         'animation': 'topleave 400ms forwards',
         '-webkit-animation': 'topleave 400ms forwards'
     });

     $('.container').bind('mouseenter mouseleave', function (e) {
         var dir = getDirection($(this), e),
             enter = e.type === 'mouseenter',
             topPerspectiveOrigin = {
                 'perspective-origin': '50% 0%',
                 '-webkit-perspective-origin': '50% 0%'
             },
             rightPerspectiveOrigin = {
                 'perspective-origin': '100% 50%',
                 '-webkit-perspective-origin': '100% 50%'
             },
             bottomPerspectiveOrigin = {
                 'perspective-origin': '50% 100%',
                 '-webkit-perspective-origin': '50% 100%'
             },
             leftPerspectiveOrigin = {
                 'perspective-origin': '0% 50%',
                 '-webkit-perspective-origin': '0% 50%'
             },
             $target = $(this).find('.example');
         switch (dir) {
             case 0:
                 if (enter) {
                     $(this).css(topPerspectiveOrigin);
                     $target.css({
                         'animation': 'topenter 400ms forwards',
                         '-webkit-animation': 'topenter 400ms forwards'
                     });
                 } else {
                     $(this).css(topPerspectiveOrigin);
                     $target.css({
                         'animation': 'topleave 400ms forwards',
                         '-webkit-animation': 'topleave 400ms forwards'
                     });
                 };
                 break;
             case 1:
                 if (enter) {
                     $(this).css(rightPerspectiveOrigin);
                     $target.css({
                         'animation': 'rightenter 400ms forwards',
                         '-webkit-animation': 'rightenter 400ms forwards'
                     });
                 } else {
                     $(this).css(rightPerspectiveOrigin);
                     $target.css({
                         'animation': 'rightleave 400ms forwards',
                         '-webkit-animation': 'rightleave 400ms forwards'
                     });
                 };
                 break;
             case 2:
                 if (enter) {
                     $(this).css(bottomPerspectiveOrigin);
                     $target.css({
                         'animation': 'bottomenter 400ms forwards',
                         '-webkit-animation': 'bottomenter 400ms forwards'
                     });
                 } else {
                     $(this).css(bottomPerspectiveOrigin);
                     $target.css({
                         'animation': 'bottomleave 400ms forwards',
                         '-webkit-animation': 'bottomleave 400ms forwards'
                     });
                 };
                 break;
             case 3:
                 if (enter) {
                     $(this).css(leftPerspectiveOrigin);
                     $target.css({
                         'animation': 'leftenter 400ms forwards',
                         '-webkit-animation': 'leftenter 400ms forwards'
                     });
                 } else {
                     $(this).css(leftPerspectiveOrigin);
                     $target.css({
                         'animation': 'leftleave 400ms forwards',
                         '-webkit-animation': 'leftleave 400ms forwards'
                     });
                 };
                 break;
         }

     });
 })

 function getDirection($element, event) {
     var w = $element.width(),
         h = $element.height(),
         x = (event.pageX - $element.offset().left - (w / 2)) * (w > h ? (h / w) : 1),
         y = (event.pageY - $element.offset().top - (h / 2)) * (h > w ? (w / h) : 1),
         direction = Math.round((((Math.atan2(y, x) * (180 / Math.PI)) + 180) / 90) + 3) % 4;
     return direction;
 }

到此这篇关于基于JS实现动态跟随特效的示例代码的文章就介绍到这了,更多相关JS动态跟随特效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript canvas实现跟随鼠标移动小球

    本文实例为大家分享了js跟随鼠标移动小球的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> canvas{ border: 1px solid #000; } </style> </head> <body> <canvas

  • js实现鼠标跟随小游戏

    本文实例为大家分享了js实现鼠标跟随小游戏的具体代码,供大家参考,具体内容如下 在创建项目的时候,记得要引入jquery.min.js 的库,也可以引入别的版本的jquery库 在Script里的代码: <script type="text/javascript"> $(document).ready(function() { var canvas = document.getElementById("c"); var ctx = canvas.getC

  • JavaScript实现跟随鼠标移动的盒子

    本文实例为大家分享了JavaScript实现跟随鼠标移动的具体代码,供大家参考,具体内容如下 跟随鼠标移动的盒子(包括检测边界值) 效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, init

  • 原生js canvas实现鼠标跟随效果

    本文实例为大家分享了canvas实现鼠标跟随效果的具体代码,供大家参考,具体内容如下 效果展示: 源码展示: <!doctype html> <html> <head> <meta charset="utf-8"> <title>canvas鼠标跟随效果(原生js实现)</title> <script src="http://libs.baidu.com/jquery/1.11.3/jquery.m

  • JavaScript实现跟随广告的示例代码

    浮动广告是目前网站很常见的一种广告形式,浮动广告能实时跟随用户的浏览,有效的传达产品要表达的意思,达到很好的传播效果.那么浮动广告是怎么实现的呢,其实实现浮动广告并不难,具体如下: * { margin: 0; padding: 0; } img { position: absolute; left: 0; } p { text-align: center; line-height: 40px; } <img src="images/left_ad.png" alt="

  • javascript实现悬浮跟随框缓动效果

    悬浮跟随框是我们在网页中经常见到的效果,我们还是使用上一实例中的运动框架去实现. 1.定义一个运动函数,当触发时调用,并且传递一个目标位置作为参数2.运动函数内部,调用定时函数,在定时函数内部,先求出元素位置与目标位置的距离差,然后除以一个数值作为速度(由于距离差一直在缩小,所以速度值也一直在变小,从而达到缓动效果)3.由于网页上位置设置最小单位是1px,所以在步骤二中的运算可能会出现小数的情况,我们需要对小数进行处理,否则元素到达的位置总是和目标位置有1px的差距. <!DOCTYPE HTM

  • 基于JS实现动态跟随特效的示例代码

    目录 演示 技术栈 源码 css部分 js部分 演示 技术栈 这次用到了关于css的一些功能,和jQuery. CSS3中添加的新属性animation是用来为元素实现动画效果的,但是animation无法单独担当起实现动画的效果.承载动画的另一个属性——@keyframes.使用的时候为了兼容可加上-webkit-.-o-.-ms-.-moz-.-khtml-等前缀以适应不同的浏览器. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 通过 @keyframes 规则,您能够创建动

  • 基于JS实现弹性漂浮广告的示例代码

    目录 效果图 1.功能(鼠标移入移出事件.点击事件.定时器控制移动) 2.div初始样式设置 3.获取div可以移动的页面大小 4.定时器控制移动,鼠标移入事件停止移动,鼠标移出继续移动. 5.点击事件点击让div消失 6.完整代码 效果图 1.功能(鼠标移入移出事件.点击事件.定时器控制移动) div实现在页面上移动,并判断碰到页面边框反弹,鼠标移入div停止移动,鼠标移出div进行移动,点击div让它从页面消失,定时器控制它的移动. 2.div初始样式设置 //div(广告)获取节点 var

  • 基于JS实现Flappy Bird游戏的示例代码

    前言 Flappy Bird 是一款无尽的游戏,玩家可以控制一只鸟.玩家必须保护小鸟免于与管道等障碍物相撞.每次小鸟通过管道时,分数都会增加一.当小鸟与管道碰撞或因重力而坠落时,游戏结束.以下部分描述了构建此游戏必须采取的步骤. 游戏可以通过这个链接进入 完整源码地址 实现代码 HTML 部分:在此部分中,创建和加载游戏的元素.选择背景.鸟类.障碍和得分元素的图像.接下来,我们创建并链接 style.css 和 index.js 文件. <!DOCTYPE html> <html>

  • 基于JS实现蜘蛛侠动作游戏的示例代码

    目录 代码结构 代码展示 HTML JS 项目运行 游戏截图 整个游戏源码是由html.js. css.图片等代码完成的,无后端数据保存功能. 代码结构 js文件夹是游戏事件控制文件 vapp文件夹是游戏图片文件 icon.png 是网页游戏图标 index.html 是游戏主页 代码展示 HTML index.html代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/

  • 基于JS实现飞机大战游戏的示例代码

    目录 演示 技术栈 源码 定义敌方战机 定义我方战机 碰撞检测 演示 技术栈 今天没有什么特别要讲的,要不我们提前介绍下次要做的技术吧.你不说话就是同意了.我们开始了. 下图是正则表达式的一些总结大家可以先看看哦 (function() { /** * 1. JavaScript使用正则式的函数 */ const str = "abchelloasdasdhelloasd"; // 1. 查找 console.log(str.search("h")); // 3 /

  • 基于JavaScript实现动态雨滴特效

    目录 演示 技术栈 源码 设置画布 js部分 演示 技术栈 介绍一下画布吧: HTML5 标签用于绘制图像(通过脚本,通常是 JavaScript). 不过, 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务. getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性 它的方法挺多的大家可以去搜一下我就说几个常用的: 源码 设置画布 <canvas id="canvas" style="position:

  • 用p5.js制作烟花特效的示例代码

    前言 之前看过一篇文章,使用processing制作烟花特效.效果如下 fireworks 网上调查了一圈了,发现processing是一个互动编程软件,java语言发展而来.而且动画效果是跑在processing专门的模拟器上. 不过好在也有对应的web扩展语言,有processing.js和p5.js. processing.js在github上已经好几年没有人维护了,一些processing的特性支持不了.为此踩了不少坑, 本文就集中讲解如何用p5.js写烟花特效. 代码讲解 proces

  • js实现星星海特效的示例

    首先需要获取屏幕大小: var screenWidth = document.documentElement.clientWidth; var screenHeight = document.documentElement.clientHeight; 接着可以定义动画(星星透明度): @keyframes flash { 0%{opacity: 0} 25%{opacity: 0.25} 50%{opacity: 0.5} 75%{opacity: 0.75} 100%{opacity: 1}

  • vue 粒子特效的示例代码

    本文介绍了vue 粒子特效的示例代码,分享给大家,具体如下: 实现效果: 没错,你看到的上图那些类似于星座图的点和线,是由vue-particles生成的,而且能与用户鼠标事件产生互动. 传送门:vue-particles 使用教程 npm install vue-particles --save-dev main.js文件: import Vue from 'vue' import VueParticles from 'vue-particles' Vue.use(VueParticles)

  • 使用electron制作满屏心特效的示例代码

    本文介绍了使用electron制作满屏心特效的示例代码,分享给大家,具体如下: 图片被压缩了 看起来很难看 主进程代码 import {BrowserWindow, app, ipcMain} from 'electron' createWindow(); ipcMain.on('quitApp', () => { app.quit(); }); function createWindow() { const loginURL = process.env.NODE_ENV === 'develo

随机推荐