species-in-pieces网站动效的JS实现

news/2024/4/28 7:41:39/文章来源:https://blog.csdn.net/weixin_33852020/article/details/88839163
难度系数:普通

关键词:GSAP SVG

前言

看到species网站做的很炫,想要借鉴,发现主要是用css3的clip-path实现的,兼容不好,因此想着用js实现下。下面作简单介绍,需要详细代码见github库。

基础知识

  1. SVG基本知识,重点viewBox,polygon;
  2. GSAP动画平台,重点TimelineMax,TweenMax;
  3. parcel构建工具的基本使用,parcel。

实现思路

根据参考网站的代码,动物图案是用clip-path: polygon()实现的,第一时间想到了SVG的polygon;另外对于转场动画,过渡动画,找个自己熟悉的动画库实现就行了。需要特别说明的是:

  1. css的clip-path用的用的百分比数值,svg的polygon的points值不能用百分比数值,知道viewBox概念的应该清楚,其实points的值也不是一般认为的绝对像素值,因此写了个工具函数parsePolygonStr
  2. 因为图案是分动物和场景(树枝,石头等)两部分,并且希望先绘制动物再绘制场景,因此HTML部分用g标签分成extraanis

主要的代码如下:

入口文件HTML

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>species</title>
</head><body><div id="wrap"><svg class="stage" viewBox="0 0 1000 700" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="extra"><polygon points="793.50,476.88,949.50,500.88,805.50,518.88" fill="hsla(0, 0%, 100%, 0)"></polygon><polygon points="793.50,476.88,949.50,500.88,805.50,518.88" fill="hsla(0, 0%, 100%, 0)"></polygon><polygon points="793.50,476.88,949.50,500.88,805.50,518.88" fill="hsla(0, 0%, 100%, 0)"></polygon></g><g id="anis"></g></svg><button id="go_btn">GO!</button><h1 class="name"></h1><h2 class="desc"></h2></div><script src="./index.js"></script>
</body></html>

主要js脚本

// 导入一个 SCSS module
import '../css/main.scss';import { data, preData } from './data'import { TweenMax, TweenLite, TimelineMax } from 'gsap'// NodeList转换Array
function NodeList2Array(nodelist) {let arr = [];if (nodelist.length) {arr = Array.prototype.slice.call(nodelist, 0);}return arr;
}
// 把'clip-path'值转成svg polygon可用的值
function parsePolygonStr(polygonStr, width, height) {let pointsArr = polygonStr.split(/\s+|,\s/);let newPointArr = pointsArr.map(function(currentVal, index, arr) {if (index % 2 === 0) {return (parseFloat(currentVal) * width / 100).toFixed(2);} else {return (parseFloat(currentVal) * height / 100).toFixed(2);}});return newPointArr;
}let body = document.querySelector('body'),wrap = document.querySelector('#wrap'),name = wrap.querySelector('.name'),desc = wrap.querySelector('.desc'),stage = wrap.querySelector('.stage'),anis = document.querySelector('#anis'),extra = document.querySelector('#extra'),goBtn = document.querySelector('#go_btn'),anisPolygons = null,extraPolygons = null;let currentSpeciesIndex = 0,width = 1000,height = 700;function init() {let initSpecies = preData.preload;name.innerHTML = initSpecies.name;desc.innerHTML = initSpecies.desc;body.style.background = initSpecies.background;let polygonArr = initSpecies.polygon;if (Object.prototype.toString.call(polygonArr) === '[object Array]') {let polygonHtml = '';polygonArr.forEach(function(element, index) {let pointsVal = parsePolygonStr(element[0], width, height);polygonHtml += '<polygon points="' + pointsVal + '" fill="' + element[1] + '"/>';});anis.innerHTML = polygonHtml;}
}
init();
anisPolygons = anis.querySelectorAll('polygon');
extraPolygons = extra.querySelectorAll('polygon');let tl = new TimelineMax({ delay: 0.2 });
// 初始的loading动画
NodeList2Array(anisPolygons).forEach(function(target, index) {let tm = TweenMax.fromTo(target, 0.9, { attr: { fill: 'rgba(0, 0, 0, .7)' } }, { attr: { fill: 'rgba(200, 20, 20, .45)' }, ease: Power0.easeNone, repeat: -1, yoyo: true });tl.add(tm, 0.9 - 0.03 * index);
})// 模拟加载完成
setTimeout(function() {// 清除tltl.clear();// loading完之后的一系列动画// 1,变色,放大,爆炸碎片tl.add([TweenMax.to('#anis polygon', .6, {attr: {fill: function(index) {let fillVal = '#111';if (index % 5 === 0) {fillVal = '#28282a';} else if (index % 5 === 1) {fillVal = '#111';} else if (index % 5 === 2) {fillVal = '#333';} else if (index % 5 === 3) {fillVal = '#222';} else if (index % 5 === 4) {fillVal = '#121212';}return fillVal;}}}),TweenMax.to('#wrap .stage', .6, {scale: 1,ease: Back.easeOut.config(1.7)}),TweenMax.to('#anis polygon', .6, {attr: {points: function(index, target) {let nextSpeciesPolygon = preData.ready.polygon;// debuggerreturn parsePolygonStr(nextSpeciesPolygon[index][0], width, height)},fill: function(index, target) {let nextSpeciesPolygon = preData.ready.polygon;return nextSpeciesPolygon[index][1];},}// ease: Power2.easeInOut,})])// 2,海豚.add(TweenLite.to('#anis polygon', .6, {attr: {points: function(index, target) {let nextSpeciesPolygon = preData.preAni.polygon;return parsePolygonStr(nextSpeciesPolygon[index][0], width, height)},fill: function(index, target) {let nextSpeciesPolygon = preData.preAni.polygon;return nextSpeciesPolygon[index][1];},},// ease: Power2.easeInOut,}))// 3,爆炸碎片.add(TweenMax.to('#anis polygon', .6, {attr: {points: function(index, target) {let nextSpeciesPolygon = preData.ready.polygon;// debuggerreturn parsePolygonStr(nextSpeciesPolygon[index][0], width, height)},fill: function(index, target) {let nextSpeciesPolygon = preData.ready.polygon;return nextSpeciesPolygon[index][1];},}}),'+=0.4')// 4,“piece”logo.add(TweenMax.to('#anis polygon', .6, {attr: {points: function(index, target) {let nextSpeciesPolygon = preData.title.polygon;// debuggerreturn parsePolygonStr(nextSpeciesPolygon[index][0], width, height)},fill: function(index, target) {let nextSpeciesPolygon = preData.title.polygon;return nextSpeciesPolygon[index][1];},}}),'+=0.4');}, 3000);// 动物图案切换
function playHandler() {let nextSpecies = data[currentSpeciesIndex++];if (!nextSpecies) {return false;}name.innerHTML = nextSpecies.name;desc.innerHTML = nextSpecies.desc;body.style.background = nextSpecies.background;let nextSpeciesPolygon = nextSpecies.polygon;let subTl = new TimelineMax({ pause: true });let arr1 = NodeList2Array(anisPolygons);let arr2 = NodeList2Array(extraPolygons);// 之所以没用TweenMax.staggerTo是因为属性对象中没法用获得index,如下实现不了// attr: {//     points: pointVal.join(' '),//     fill: function(index){return nextSpeciesPolygon[index][1];}// }arr1.concat(arr2).forEach(function(target, index) {let pointVal = parsePolygonStr(nextSpeciesPolygon[index][0], width, height),fillVal = nextSpeciesPolygon[index][1];subTl.add(TweenMax.to(target, 0.5, {attr: {points: pointVal.join(' '),fill: fillVal},ease: Back.easeOut.config(1.7)}),'-=0.47')});subTl.play();}goBtn.addEventListener('click', playHandler, false);export default () => {};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_743761.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google禁止从第三方网站安装Chrome扩展程序

2019独角兽企业重金招聘Python工程师标准>>> 谷歌周二宣布&#xff0c;它计划退出Chrome扩展的内嵌安装&#xff0c;使其无法从第三方网站安装。 Google一直试图改进基于Chromium的Google Chrome网络浏览器的扩展安装&#xff0c;如果开发者不想在Chrome网上应用店发…

关于如何取消访问https时的提示:“此网站的安全证书存在问题”的解决方法...

大家是不是也经常遇到访问https网站时&#xff0c;提示&#xff1a;“此网站的安全证书存在问题”&#xff0c;然后让你选择是关闭该网页&#xff0c;还是继续浏览网站&#xff0c;如下图&#xff1a;根据提示&#xff0c;我们也可以得知是证书的问题导致的&#xff0c;由于平时…

Diango网站开发--环境搭建

基础知识回顾1 Linux 环境1.1 Linux版本安装--CentOS1.2 Linux连接--SSH连接1.2.1 windows下cmd命令 SSH连接1.2.2 Putty SSH连接1.2.3 XShell 连接---推荐1.2.4 VS code连接开发1.3 在Linux环境中安装python31.3.1 查看本机是否安装命令1.4 问题--重启Linux后无法连接2 代码开…

微软正式发布Azure Storage上的静态网站

微软正式宣布了Azure Storage上的静态网站&#xff0c;提供了从托管在Azure Storage上的HTML、CSS和JavaScript文件提供内容的能力。静态网站包含内容固定的Web页面&#xff0c;同时仍然允许利用JavaScript等客户端代码来创建丰富的用户体验。 有了这个新功能&#xff0c;继用于…

使用IntelliJ IDEA开发SpringMVC网站

原文地址 阅读目录使用IntelliJ IDEA开发SpringMVC网站回到目录使用IntelliJ IDEA开发SpringMVC网站 最近在做某在线教育平台网站的开发&#xff0c;按师兄的建议要用SpringMVC来搞。之前对SpringMVC的认知度为0&#xff0c;网上查阅各种资料&#xff0c;发现五花八门的配置都有…

论坛网站mysql优化_MySQL优化 之 Discuz论坛优化

作/译者&#xff1a;叶金荣(Email: )&#xff0c;来源&#xff1a;http://imysql.cn 一. 前言 近日由于需要,对discuz论坛(简称dz)进行优化,当然了,只是涉及到数据库的优化. 先说一下服务器及dz的数据量,2 * Intel(R) Xeon(TM) CPU 2.40GHz, 4GB mem, SCISC硬盘. MySQL 版本为 …

wordpress windows安装_从零开始服务器搭建wordpress网站详细建站教程

说起第一次使用Wordpress建站&#xff0c;相信大部分人的印象都是虚拟主机、空间搭网站&#xff0c;因为便宜、省心&#xff0c;自己搭个小站放上去也算足够&#xff0c;但是随着各种技术的迅速发展&#xff0c;原来的很多虚拟主机已经不能再满足Wordpress配置要求&#xff0c;…

seo管理php源码_如何去理解SEO中的动态页面?

动态网页并不是像网页上显示的动画、视频或者滚动的字幕那样视觉上的动态&#xff0c;它可以表现为包含各种动画&#xff0c;同时也可以是纯文本形式的&#xff0c;动态网页的动态是体现在其网页编程技术上的。通过PHP、ASP、JSP以及CGI等动态网页技术和数据库编程技术制作而成…

netty并发量一般多少_网站收录量一般为多少?如何提升收录量?

网站想要在移动互联网中脱颖而出&#xff0c;想要与竞争对手以最快的速度拉开差距&#xff0c;就必须借助有力的武器来实现。而网站优化是最能提升网站知名度的最有效做法&#xff0c;它是利用搜索引擎对内容和链接来识别、抓取网站的。意思就是如果一个网站没有更新内容或者内…

html浏览器获取域账号密码,Firefox/chrome等FTP域内权限限制不严 可通过XSS遍历网站目录并获取源码...

2013-06-01 15:20浏览器在FTP域内的CSRF问题&#xff0c;虽然遵守了同源策略&#xff0c;但不代表解决了所有问题。“可通过XSS遍历网站目录并获取源码”的环境要求有些苛刻&#xff0c;理论意义大于实际意义。详细说明&#xff1a;只在IE9、firefox、chrome上做了测试&#xf…

2021重庆高考成绩查询密码,2021重庆高考成绩查询网站入口,打不开登录不进去解决方法...

2018重庆高考成绩查询网站入口还未公布&#xff0c;以下是小编整理的2017重庆高考成绩查询网站&#xff0c;请参考&#xff01;2017年重庆高考成绩将于6月23日13点公布。届时考生可登录重庆市教育考试院网站(http://www.cqksy.cn)或重庆招考信息网(http://www.cqzk.com.cn)&…

网站选择按钮点击无反应?_收藏|良心网站推荐——趣味篇

上一篇文章分享了十个实用的良心网站&#xff0c;这次分享5个有趣的网站&#xff0c;绝对是消除无聊的神器。满满干货&#xff0c;建议收藏&#xff01;话不多说&#xff0c;上硬货。1、太鼓ウェブ - Taiko Web太鼓达人网页版。这个就是完全模仿了太鼓达人街机版&#xff0c;里…

php 支付宝wap接口,呕心之作:支付宝的手机网站支付接口的应用,呕心之作_PHP教程...

呕心之作&#xff1a;支付宝的手机网站支付接口的应用&#xff0c;呕心之作由于去年做手机Portl接口的工作&#xff0c;需要使用支付宝的支付&#xff0c;于是手机网站支付接口就成了首选。1.首先下载接口包支付宝商家服务中心链接&#xff1a;https://b.alipay.com/login.htm?…

php的网站换服务器地址,网站更换域名完整攻略

很多SEOER都遇到过这样的问题&#xff0c;网站发展了一段时间&#xff0c;关键词排名有了进展&#xff0c;流量增加了许多&#xff0c;网站开始有了收入&#xff0c;这时候便有了更换域名的想法&#xff0c;但是又担心更换域名会影响网站的权重和排名&#xff0c;进入左右为难的…

退出服务器维护,如何查看docker进程退出的原因_网站服务器运行维护

如何通过命令行查看docker服务是否已启动_网站服务器运行维护通过命令行查看docker服务是否已启动的方法是&#xff1a;通过运行命令【systemctl status docker】查看docker服务的运行状态&#xff0c;然后根据输出信息进行判断即可。问题还原&#xff1a;最近的docker容器经常…

网站下面的文件找不到_这5个优质资源网站,花钱你都找不到!

马上就要回家过年了&#xff0c;相信大家都很兴奋吧&#xff0c;平时工作特别忙碌&#xff0c;没有时间玩耍&#xff0c;游乐&#xff0c;有的甚至连看个电影都要安排好久&#xff0c;好不容易有时间看了吧&#xff0c;又为找不到资源发愁&#xff0c;你说烦人不烦人&#xff1…

在线图像识别相似图片_几个有趣的在线建站模板工具评测

现在各种在线辅助工具越来越多&#xff0c;一键式操作的快捷工具似乎总是那么受欢迎&#xff0c;特别是对小白朋友来说&#xff0c;他们希望用最简单的操作来完成自己心仪的作品&#xff0c;比如在线制作网站&#xff0c;在线设计等&#xff0c;今天小编给大家评测了一些在线工…

怎么绕过论坛回复_SEO做博客外链(评论/回复)应该怎么做才有用呢?

博客外链分为自建博客平台和博客评论回复两种外链形式&#xff0c;而本文主要讲述的是针对评论和回复的这种超级省事的博客外链创建技巧。那这种博客外链应该怎么做呢&#xff1f;网站为了提升关键词排名&#xff0c;SEO人员从站外做优化的最重要手段就是发外链&#xff0c;像2…

UML辅助网站规划和设计指南

一、概述 Web网站往往具有复杂与高度动态的特点。为了让Web应用在短时间之内开始运作&#xff0c;开发周期应该尽量地短。许多时候&#xff0c;开发者直接进入编写代码这一阶段&#xff0c;却不去仔细考虑自己想要构造的是什么样的网站以及准备如何构造&#xff1a;服务器端代码…

网站迁移到新服务器的步骤_网站迁移到日本服务器的正确做法

不管是个人站长还是企业站&#xff0c;都会遇到网站迁移的情况&#xff0c;比如说&#xff0c;为了拓展海外客户群体&#xff0c;将网站迁移到日本服务器&#xff0c;但是迁移网站&#xff0c;比如说将网站迁移到日本服务器&#xff0c;不仅仅是将数据上传到日本服务器上&#…