从零打造在线版H5页面生成器

想必你一定使用过易企秀或其它微场景生成工具制作过炫酷的h5页面,除了感叹其神奇之处有没有想过其实现方式呢?
从设计者的角度来看待问题,会有不一样的收获,本文将从零开始,使用node技术来设计实现一款精简版的易企秀

Github: 传送门
演示地址:传送门

目录

  1. 实例实现
  2. 实例模板化与渲染
  3. 前端可视化操作
  4. 总结

一、实例实现

自动化/可视化工具的实现,无不是大量重复实例的一种模板化,微场景生成工具也不例外,所以首先需要探讨具体的一个微场景是怎么实现的

来看下面这个实例:

要实现这样的场景,我们首先得把任务分解下:

1) 布局:整个场景可以分为很多屏(页),每一屏上有动画元素(文字/图片)

    <!-- --------------html---------- --><div class="page-box" id="page1"><div class="item page1-item1">...</div><div class="item page1-item2">...</div><div class="pre-item">...</div></div><div class="page-box" id="page2"><div class="item page2-item1" data-cls="bounceIn1000" data-ts="0">...</div><div class="item page2-item2" data-cls="bounceIn1000" data-ts="1000">...</div><div class="pre-item">...</div></div><!-- --------------css---------- -->// 每一屏(page-box)都是absolute布局,便于为每屏增加入场出场动画(减少重绘重排)// 每一屏宽高皆为100%,默认隐藏,入场增加入场动画,并设置为可见.page-box {position: absolute;top: 0;z-index: 1;width: 100%;height: 100%;visibility: hidden;background: no-repeat center center #FFFFFF;background-size: 100% 100%;}.page-box.show {visibility: visible;}// 屏内动画项目,也都采用abasolute布局,just因为,是动画元素.item {position: absolute;background-repeat: no-repeat;opacity: 0;text-align: center;}

2) 屏间切换:事件触发,过渡动画

    /***  下滑手势,页面上翻*  上一屏(prev)增加入场动画slideZoom_tInt,本屏增加离场动画slideZoom_tOut*/pre: function() {var $el = $(".page-box.show");var $prev = $el.prev(".page-box")[0] ? $el.prev() : $(".page-box").last();$prev.addClass("show").show().css({"-webkit-animation":"slideZoom_tInt 0.5s linear","animation":"slideZoom_tInt 0.5s linear"    });$el.css({"-webkit-animation":"slideZoom_tOut 0.5s linear","animation":"slideZoom_tOut 0.5s linear"});setTimeout(function(){$el.removeClass("show");...},500);}/***  滑动事件监听*///控制滑动//不禁止默认事件 他丫的不能滑document.addEventListener('touchmove', function(event) {event.preventDefault();}, false);$(document).on('swipeUp', function() {slider.next();}).on('swipeDown', function() {//手势下滑,向上翻页slider.pre();});

3) 屏内项目控制(文字和图片):引入动画库animate.css来设置屏内项目的动画效果(所以说是精简版易企秀)

    /***  动画效果控制,动画效果播放、时间间隔*///动画一个个播放,递归调用var i = 0;function startShow(callback) {if(i === itemLength){callback && callback();return ;}var item = items.eq(i);var cls = item.attr('data-cls');//动画类var ts = item.attr('data-ts');//下一个动画开始间隔时间item.addClass(cls);i  ;setTimeout(function() {startShow(callback);},ts);};//播放某一屏的动画function showItem(id, callback) {var self = this;i = 0;items =  $('#'   id   " .item");itemLength = items.length;if(!callback) {callback = function() {self.showPreItem(id);}}startShow(callback);},

4) 页面加载进度控制:阻塞页面加载进度的无非图片,枚举页面使用到的所有图片(可以使用程序遍历目录),判断Image对象的complete状态或者监听onload事件来判断图片是否加载完成,篇幅原因,代码就不贴出来了

二、实例模板化与渲染

所谓模板化,无非是在重复实例中提取共性的东西定义数据模型,并且使用模板标签来描述,渲染的过程中用数据填充模板占位符
在此选用了nunjucks作为模板引擎

我们先来分析下,微场景页面的组成部分:

  1. 屏/页(page-box):背景色、背景图片、入场动画和出场动画
  2. 屏内项目:位置、宽高、透明度、动画类、动画持续时间、下一个动画的间隔时间、图片路径/文字以及文字效果

于是数据模型可以定义为:

    //页面数据pages: [{burl: String, //背景图片inAnimate: String,outAnimate: String,bgColor: String,items: [ //页面项目{px: String, //位置x 必选py: String, //位置y 必选width: String, //宽度 必选height: String, //高度 必选transparent: String,//透明度  可选animateClass: String,//动画 可选animateDuration: String, //动画持续时间,默认2000nextAnimateTime: String, //下一个item动画开始的时间间隔zIndex: String, //可选imgUrl: String,// 图片路径 //可选text: String, //文本textStyle: {'color': String,'font-size': String}}...]},{...}...]

根据数据模型来编写模板

    <!-- ---------html模板片段--------- -->//遍历pages生成每一屏的div//遍历page的items生成动画项目div{% set i = 0 %}{% for page in pages %}{% set i = i 1 %}{% set j = 0 %}<div class="page-box" id="page{{i}}">{% for item in page.items %}{% set j = j 1 %}<div class="item page{{i}}-item{{j}}" data-cls="{{ item.animateClass }}{{item.animateDuration}}" {% if item.nextAnimateTime %} data-ts="{{ item.nextAnimateTime }}" {% else %} data-ts="500" {% endif %}  >{% if item.text %}{{ item.text }}{% endif %}{% if item.imgUrl %}![]({{ item.imgUrl }}){% endif %}</div>{% endfor %}<div class="pre-item"><div class="pre-wrap"><div class="pre-box1"><div class="pre1"></div></div><div class="pre-box2"><div class="pre2"></div></div></div></div></div>  {% endfor %}<!-- ---------css模板片段--------- -->/************* item style ***********************/{% set i = 0 %}{% for page in pages %}{% set i = i 1 %}{% set j = 0 %}#page{{i}} {{% if page.burl %}background-image: url({{page.burl}});{% endif %}background-color: {{page.bgColor}};}{% for item in page.items %}{% set j = j 1 %}.page{{i}}-item{{j}} {width: rem({{item.width}});height: rem({{item.height}});left: rem({{item.px}});top: rem({{item.py}});{% for key, value in item.textStyle %}{{key}}: {{value}};{% endfor %}}{% endfor %}{% endfor %}//这里要重点说明的,数据模型中的所有item对应的,动画类和持续时长作为key值//去重之后,构造animateClasses对象,遍历该对象,生成相应的动画类//例如动画类bounceIn1000:就表示动画库中的bounceIn,并且持续时长1000毫秒/**************** animate class **************************/{% for cname, cvalue in animateClasses %}.{{cname}} {-webkit-animation: {{cvalue.ac}} {{cvalue.ad}}s ease 1 both;-webkit-animation-play-state: initial;  animation: {{cvalue.ac}} {{cvalue.ad}}s ease 1 both;animation-play-state: initial;opacity: {% if cvalue.isOut %}0 {% else %} 1 {% endif %};}{% endfor %}

渲染过程:
1) 复制用到的图片
2) rem预处理
3) 根据数据渲染模板

    /**************build代码片段*************************///解析viewvar content = htmlTemplate.render('view.html', config);utils.createFile(target   '/view.html', beautify_html(content, {'max_preserve_newlines': 0 // 去掉过多的空行}));//解析样式var styleContent = htmlTemplate.render('css/style.css', config);utils.createFile(target   '/css/style.css', beautify_css(px2rem(styleContent), {'max_preserve_newlines': 1 // 去掉过多的空行}));//解析main.jsvar mainJsContent = htmlTemplate.render('js/main.js', {list: images});utils.createFile(target   '/js/main.js', beautify_js(mainJsContent, {'max_preserve_newlines': 1 // 去掉过多的空行}));

三、前端可视化操作

在上一步模板化之后,我们已经可以根据数据和模板生成场景实例,那么前端可视化操作要做什么就比较清晰了,前端可视化操作的目的在于根据数据模型构造数据实例,前端的可视化操作应该包括设置每一屏的背景色/背景图片,并且可以增加或删除一页,在每一屏中可以增加文本或者图片项目,并且设置对应的属性

编辑屏

编辑动画项目

在此采用了以上两图的设计风格:

  1. 顶部文本和图片按钮可以为当前page增加文本和图片
  2. 左侧控制屏/页的增删,以及切换当前编辑屏/页
  3. 中部为编辑舞台,显示当前屏/页的背景以及项目
  4. 右侧为属性设置面板,当屏/页获得焦点,编辑的是屏/页属性(背景和入场出场动画),当动画项目(文本或者图片),编辑的是动画项目的属性

同样的,我们要将任务分解:

  1. 控制page增删与切换,属性设置的Page.js
  2. 控制文本项目增删,属性设置的textItem.js
  3. 控制图片项目增删,属性设置的imageItem.js
  4. 右侧属性设置面板控制rTab.js
  5. 拖拽控制ZResize.js
  6. 图片上传ZUpload.js

    这些个步骤每一步要写的话,篇幅都可以长到独立成文,例如,另一篇文章:div拖拽缩放jquery插件编写——带8个控制点已经详细说过,本文就不再拓展,如果有需要,可以私信我,有必要再整理

通过前端可视化的操作,构造数据模型实例,传入后台,后台再通过上一步的模板进行渲染,那么整一个核心功能就走通了~~~

其它的入库保存,展示,预览功能,则是需要慢慢丰富的过程

先把核心骨架搭建完毕,再去丰富皮肉,是一个软件从无到有的重要心法

四、总结

本文重在说明设计步骤和实现思路,省去了很多实现细节,并非面面俱到,并且也不方便公布所有源代码,更细致的讨论,可以私信我,定尽力解答。

本文方法论:
1)任务分解
2)实例模板化
3)核心骨架搭建、再丰富皮肉功能

公众号:菲麦前端


更多专业前端知识,请上 【猿2048】www.mk2048.com

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

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

相关文章

使用Struts2,Hibernate和MySQL BLOB开发个人迷你相册应用程序–第1部分

概述&#xff1a; 在本研讨会中&#xff0c;我们将开发一个Web应用程序&#xff0c;可用于创建漂亮的照片库。 您可以将其托管在Web服务器中&#xff0c;也可以在自己的PC中使用以维护和管理照片集。 使用本教程&#xff0c;您将能够了解与Struts2和Hibernate相关的以下重要内容…

基于 Webpack2、Vue2、iView2 的可视化脚手架 iView Cli 发布 2.0 版本

谷歌今天发布了一系列“性感”的软件&#xff0c;我们也发布了一款大家期待已久的开发者工具&#xff0c;同样很性感 &#xff1a;) iView 2.0 已经发布有两个月了&#xff0c;在 2.0 发布后&#xff0c;npm 下载量、issues 数量都提升了很多&#xff08;可以 watch 下项目&…

在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合

请查看我在Karaf的OSGi中构建普通CXF服务&#xff08;不使用Camel&#xff09;的其他文章 。 这是有关如何 创建一个CXF REST服务 使用骆驼多播&#xff08;并并行化&#xff09;传入的请求 来自两个不同服务的源数据 汇总响应并 最后将合并结果作为JSON返回给最终用户。…

cgcs2000大地坐标系地图_为什么要从北京54和西安80统一到CGCS2000?测绘人必知!...

导 读北京54坐标和西安80坐标&#xff0c;使用了很多年&#xff0c;为何要统一成CGCS2000坐标&#xff1f;启用CGCS2000坐标有何重大意义&#xff1f;概述北京54坐标系和西安1980坐标系的建立极大的促进了新中国测绘的发展,然而随着空间大地测量技术的兴起,这两种经典的局部大地…

Amazon Elastic Map Reduce使用Apache Mahout计算建议

Apache Mahout是一个“可扩展的机器学习库”&#xff0c;其中包含各种单节点和分布式推荐算法的实现。 在我的上一篇博客文章中&#xff0c; 我描述了如何在单个节点上实现在线推荐系统来处理数据。 如果数据太大而无法放入内存&#xff08;> 100M首选项数据点&#xff09;怎…

基于element-ui实现table可配置化

写在前面 感谢 饿了么前端团队提供组件化框架elememt-ui&#xff0c;本文基础组件使用element-ui。 大背景 在开发一些系统过程中&#xff0c;使用table作数据展示在所难免。先来看看el-table组件。 非常简单易用的组件&#xff0c;根据提供的data数据&#xff0c;配置table…

麟龙指标通达信指标公式源码_通达信指标公式源码波段极限副图源码

做价值的传播者&#xff0c;一路同行&#xff0c;一起成长问题&#xff1a;怎样才能每天都收到这类文章&#xff01;答案&#xff1a;只需点击上方《通达信公式指标》{买卖公式}AA:(2*CHIGHLOW)/4;BB:AA-REF(C,12);CC:EMA(BB,13);DD:EMA(CC,2);EE:EMA(BB,34);FF:EMA(BB,55);GG:…

计算机系统备份的原则和策略,计算机系统数据备份机制与策略

计算机系统数据备份机制与策略20年第5 05期华中电力第 l卷 8计算机系统数据备份机制与策略耿煜(樊学院机械系&#xff0c;北襄樊襄湖 4 15 ) 4 03摘要&#xff1a;针对当今计算环境中不断增长的数据量&#xff0c;系统地分析、论述了完整的数据备份机制&#xff0c;出了相应的策…

[译] 帮助你成为一名成功的 Web 开发工程师的 21 步

前言 随着 Web 开发的蓬勃发展&#xff0c;许多人都在问这样一个问题&#xff1a;我如何才能成为一名 Web 开发者&#xff1f;我认为这个问题不应该这样问&#xff0c;而应该是&#xff1a;我如何才能成为一名成功的 Web 开发者&#xff1f;这样的问题是很有必要的&#xff0c;…

循环卷积和周期卷积的关系_基于单口RAM读写的卷积电路(下)

这是迟到很久的卷积电路verilog设计的下篇。。。你看我还有机会吗。。。上回我们给出系统的层次结构、卷积计算模块以及用于数据缓存的fifo模块&#xff0c;今天我们首先回顾一下上一次的关键内容。系统结构回顾RTL代码文件可以分为结构如下所示 ~|--top_conv_tb.v|--top_conv.…

浅析 PHP 中的 Generator

浅析 PHP 中的 Generator Miss Wang php开发案例 前天 何为 Generator 从 PHP 5.5 开始&#xff0c;PHP 加入了一个新的特性&#xff0c;那就是 Generator&#xff0c;中文译为生成器。生成器可以简单地用来实现对象的迭代&#xff0c;让我们先从官方的一个小例子说起。 xrange…

注意安全!XSS 和 XSRF

[Tips] 本文是从 jianshu 平台重新修改编辑后移植来的&#xff0c;比上一版本做了些修订。 最近在看一些关于网络安全的问题&#xff0c;当然许多是跟前端相关的&#xff0c;包括且不局限于xss和xsrf 了&#xff0c;那么小编就结合最近的学习实践谈一些粗浅的认识。&#xff08…

go分析和kegg分析_干货预警:3分钟搞定GO/KEGG功能富集分析(2)

在 3分钟了解GO/KEGG功能富集分析 一文中给大家讲解了GO和KEGG的基本概念和内涵,并且给大家介绍了DAVID这一神奇网站。今天我们就把GO/KEGG功能富集分析的详细教程按部就班地呈现给大家,有请小猎豹。 多图预警,轻点图片,查看高清大图 1 Step1: 打开DAVID官网:https://dav…

如何在本地开发环境调试微信 JS-SDK

以下篇幅将会描述不同前提下对应的调试策略&#xff0c;当然也有可能不是最优解&#xff0c;望斧正 →_→ 前言 何谓「安全域名限制」&#xff1f; 以微信 JS-SDK 的使用为例&#xff0c;每个公众号被限制最多可设置三个安全域名&#xff0c;且必须能被腾讯服务器所验证&#…

云南省农村信用社计算机岗位待遇如何,云南农村信用社薪资待遇如何?

在云南如果去存钱&#xff0c;相信大多数人都会把自己的小钱钱存在农村信用社而不是XX银行。在这一块风景秀丽&#xff0c;人美山美水美的地方&#xff0c;就金融行业来说云南农村信用社要是说自己差&#xff0c;那基本没有谁敢说自己做的好。所以在云南农信社这家企业里做一名…

小票上为啥指甲能划出印_指甲上出现竖纹,除遗传问题,或是身体在向你拉警报了,别忽视...

生活中常见女生给指甲抹上各种不同的颜色来让它变得美美的&#xff0c;指甲起着修饰人的形象的作用。而指甲的状况也能折射出身体的健康状态如何。每个人的指甲形态不一&#xff0c;有的润滑饱满&#xff0c;光滑平整&#xff0c;有月牙&#xff1b;有的坑坑洼洼&#xff0c;凸…

require.context

带表达式的 require 语句 如果你的 require参数含有表达式(expressions)&#xff0c;会创建一个上下文(context)&#xff0c;因为在编译时(compile time)并不清楚具体是哪一个模块被导入 require("./template/" name ".ejs");webpack 解析 require() 的…

使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表

这次&#xff0c;我想与您分享我最近从JSF 2.2功能中学到的知识。 为此&#xff0c;我决定创建一个简单的ajax&#xff0c;可滚动的延迟加载数据表。 请注意&#xff0c; 绝不这是相当大的库如Primefaces &#xff0c; RichFaces的或ICEFaces的 。 这只是为了告诉您我学到了什…

如何监视ps/查询的性能和使用

可以使用“查询管理”页面监视查询性能和使用情况。您可以获得的一些统计信息包括平均运行时、运行次数和上次运行日期。使用预定义的搜索&#xff0c;还可以选择要检查和报告的查询。查询管理还允许您取消当前在查询管理器和查询查看器中运行的查询&#xff0c;以及启用和禁用…

金融计算机怎么调成链式,FRM金融计算器使用方法

2020FRM考试计算器&#xff1a;想一想FRM一级考试基本上按计算器停不下来&#xff0c;我们就一定要买一个简单易操作的计算器&#xff0c;但是GARP对于FRM考生所使用的计算器是有规定的&#xff1a;所有参加FRM考试的考生必须使用GARP指定的计算器&#xff0c;如果考生在考试期…