项目中前端(angular)开发中需要使用到基于时间线的UI控件,初步调研两种,可以参考下面链接
https://ng.ant.design/components/slider/zh
https://echarts.apache.org/zh/cheat-sheet.html
https://echarts.apache.org/zh/option.html#timeline
本文进行了简化和集成进angular中,需求是基于时间线展示北京、天津、河北、南京四地2000年每个月的经济指标。最终效果图:
首先在html中,声明div
<div id="lineChart" style="width:100%;height:500px"></div>
在ts脚本中
import { Component, OnInit } from '@angular/core';
import { EChartOption } from 'echarts';
import * as echarts from 'echarts';
import { title } from 'process';
@Component({
selector: 'app-echart-time-demo',
templateUrl: './echart-time-demo.component.html',
styleUrls: ['./echart-time-demo.component.css']
})
export class EchartTimeDemoComponent implements OnInit {
initCharts() {
const ec = echarts as any;
let lineChart = ec.init(document.getElementById('lineChart'));
let lineChartOption = {
baseOption: {
timeline: {
axisType: 'category',//time
// realtime: true,
// loop: false,
autoPlay: true,
// currentIndex: 2,
playInterval: 1000,
//时间线刻度值
data: [
'2000-01', '2000-02', '2000-03',
'2000-04', '2000-05', '2000-06',
'2000-07', '2000-08', '2000-09',
'2000-10', '2000-11', '2000-12'
],
label: {
formatter: function (s) {
return s;
}
}
},
title: {
subtext: '数据来自国家统计局'
},
xAxis: [{
type: 'category',
data: ['北京', '天津', '河北', '南京'],
}],
yAxis: [{
type: 'value'
}],
//第一组数据展示形态
series: [{
type: 'bar'
}],
},
options: [
{
title: {
text: '2000年1月四地经济指标'
},
series: [
{ data: [4315, 2150.76, 16018.28, 20000] }
]
}, {
title: {
text: '2000年2月四地经济指标'
},
series: [{
data: [5007.21, 2578.03, 6921.29, 20000]
}]
},
{
title: {
text: '2000年3月四地经济指标'
},
series: [{
data: [6033.21, 3110.97, 8477.63, 20000]
}]
}, {
title: {
text: '2000年4月四地经济指标'
},
series: [{
data: [6033.21, 3110.97, 8477.63, 20000]
}]
}, {
title: {
text: '2000年5月四地经济指标'
},
series: [{
data: [6033.21, 3130.97, 8477.63, 17000]
}]
}, {
title: {
text: '2000年6月四地经济指标'
},
series: [{
data: [6033.21, 3110.97, 8177.63, 25000]
}]
}, {
title: {
text: '2000年7月四地经济指标'
},
series: [{
data: [6433.21, 3110.97, 8477.63, 10000]
}]
}, {
title: {
text: '2000年8月四地经济指标'
},
series: [{
data: [6033.21, 4110.97, 8477.63, 11000]
}]
}, {
title: {
text: '2000年9月四地经济指标'
},
series: [{
data: [6033.21, 5110.97, 8477.63, 20000]
}]
},
]
}
lineChart.setOption(lineChartOption);
}
constructor() { }
ngOnInit() {
this.initCharts();
}
}
从上文的图片中,列表中只展示四个地区的一组数据,未能充分利用,所以考虑再增加一组2000每月四地的消费指标,所以series里增加一个维度
series: [{
type: 'bar'
},{
type: 'bar'
}],
而数据里也要增加一组数据
series: [{
data: [6033.21, 4110.97, 8477.63, 11000]
},
{
data: [6033.21, 4110.97, 8477.63, 11000]
}]
如图,柱状图中各地指标多了一组
使用 axisType: 'time'
上文中使用的 axisType: 'category',这样会将时间线上的坐标等分,简单来说两个刻度间距离相等,但实际使用中可能存在刻度间不是等分的,如1:00到1:10到2:00到3:00,很明显1:00到1:10只过了10分钟,直观上这两个刻度距离要小点。所以在echarts中提供了axisType为time的配置。
let lineChartOption = {
baseOption: {
timeline: {
// axisType: 'category',
axisType: 'time',
....
data: [
'2000-01', '2000-03',
'2000-04', '2000-05', '2000-06',
'2000-07', '2000-08', '2000-09',
'2000-10', '2000-11', '2000-12'
],
label: {
formatter: function (s) {
return (new Date(s).getMonth()+1)+'月';
}
}
上面的刻度数据(注意是时间格式)中是没有2月份的,使用time,要特殊处理如label的formater。最终效果如下,发现由于2不存在,所以1到3自动跨两个刻度。
果图
各位观众老爷大家好
今天给大家带来的是
《企业网站必备jQuery全屏时间轴特效源码》
十分适用于企业网站对于公司历程的介绍模块
废话不多说上源码
@charset "utf-8";
.dsk-not-supported,.dsk-supported {
background:#cebe29;
background:-moz-linear-gradient(-45deg,#cebe29 0,#9b1f50 33%,#2989d8 71%,#89b4ff 91%);
background:-webkit-gradient(linear,left top,right bottom,color-stop(0%,#cebe29),color-stop(33%,#9b1f50),color-stop(71%,#2989d8),color-stop(91%,#89b4ff));
background:-webkit-linear-gradient(-45deg,#cebe29 0,#9b1f50 33%,#2989d8 71%,#89b4ff 91%);
background:-o-linear-gradient(-45deg,#cebe29 0,#9b1f50 33%,#2989d8 71%,#89b4ff 91%);
background:-ms-linear-gradient(-45deg,#cebe29 0,#9b1f50 33%,#2989d8 71%,#89b4ff 91%);
background:linear-gradient(135deg,#cebe29 0,#9b1f50 33%,#2989d8 71%,#89b4ff 91%);
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cebe29',endColorstr='#89b4ff',GradientType=1);
-webkit-background-size:100% 100%;
-moz-background-size:100% 100%;
background-size:100% 100%
}
们前面提到过,转换(transitions) 实际上就是一种特殊的CSS动画(见《前端设计必须掌握:定义CSS样式之间的切换》):
只有两个状态: 起始状态和终止状态
动画不会出现循环
中间状态只能由时变函数(transition-timing-function)来控制
实际动画需求要复杂得多,比如我们可能会需要:
自动播放的动画(不会有交互状态)
控制中间状态
创建循环动画
在同一个HTML元素上应用不同的动画
在动画过程中控制不同的元素属性
给不同的属性应用不同的时变函数
这个时候就需要使用CSS3动画(animation)特性,而且提供了更多的功能。CSS3动画就像一部迷你电影,里面有演员(HTML元素)、剧本(keyframes)以及动作片段(CSS规则)。
和 transition 属性一样,animation 是一组动画属性的速写:
name: 动画名称
duration: 动画持续时间
timing-function: 时变函数,用来计算中间状态
delay: 延时,在一定时候后启动动画
iteration-count: 动画重复的次数
direction: 动画的运行方向,可以是反过来的
fill-mode: 动画填充模式,用来确定动画开始之前和结束之后的样式
例:按钮弹跳动画
CSS代码如下:
效果图如下:
首先我们选定“演员”为一个加载按钮(html元素),然后设定其表演剧本(keyframes)为弹跳,然后添加一些动作指令(CSS规则)来创建一个CSS3动画:
name: bouncing (动画名称必须和keyframes名称一致)
duration: 0.5s (持续0.5秒)
timing-function: cubic-bezier(0.1,0.25,0.1,1)
delay: 0s (没有延迟)
iteration-count: infinite (无限循环)
direction: alternate (交替往返)
fill-mode: both(填充模式同时应用backwards和forwards规则,后面会详细说明)
在“电影开拍”之前,我们得创建“剧本”(@keyframes,即关键帧),用来规定动画中间的每一个表演步骤。@keyframes通过percentages(百分比格式的时间坐标)来定义:
0% 动画的第一帧(可选)。
50% 动画的中间时间节点。
100% 动画的最后一帧。
我们也可以分别使用关键词 from 和 to 来代替 0% 和 100%。
你可以定义任意多的keyframes,比如 33%, 4% 乃至 29.86%。每个 keyframe 都是一个 CSS规则,定义这个时间节点下元素的某个或某些属性。
@keyframes 具体语法定义如下:
@keyframes animationname {keyframes-selector {css-styles;}}
animationname: 必需。定义动画的名称。
keyframes-selector: 必需。百分比格式的时间坐标。合法的值:0-100% | from(与 0% 相同)| to(与 100% 相同)。
css-styles: 必需。一个或多个合法的 CSS规则(样式定义)。
CSS代码:
效果图如下:
上面的例子把起点 0% 和终点 100% 设置成一样的状态,并且是 infinite 播放,这样可以确保动画的两次播放之间的无缝衔接。
另外如果若干时间节点具有相同的样式,可以合并在一起简写,比如:
如果在@keyframes中0%和100%时间点所设置的属性有默认值,那么有些情况下可以忽略不写。
动画名称(animation-name)会至少出现两次:
一次是“编写剧本” @keframes 时。
一次是“演员入戏”时,即设置HTML元素的 animation-name 属性值为“剧本”的名称(或者在 animation 速写中)。
和CSS class名称一样,animation 的名称只能包含:
字母 (a-z)
数字 (0-9)
下划线 underscore (_)
中划线 dash (-)
不能以数字或者两个中划线开始。
和 transition durations 一样,animation durations 可以设置为 秒 1s 或 毫秒 200ms。
默认值为 0s,即不会有动画出现。
和 transition timing functions 一样,animation timing functions 可以使用一些预定义的关键词比如 linear, ease-out, 或者使用cubic bezier函数来自定义。
缺省值是 ease。
我们可以通过设置线性时变函数以及自定义的@keyframes来模拟复杂的贝塞尔曲线。Bounce.js 就是这样一个在线高级动画生成工具,支持导出CSS样式代码。
和 transition delays 一样,animation delays 可以设置为 秒 1s 或 毫秒 200ms。
默认值为 0s,即不会有延迟。
这个属性在触发多个时间交替的动画序列时很有用。
默认情况下,动画只运行一次(即默认值为 1),你可以设置3种类型的数值:
整数 如 2 或 3
小数 如 0.5,意味着只运行动画的一半
关键词 infinite 无限重复
animation-direction 定义浏览器对@keyframes的读取顺序。
normal: 正常方向,从 0% 开始,到 100% 结束,然后再从 0% 开始。
reverse: 相反方向,从 100% 开始,到 0% 结束,然后再从 100% 开始。
alternate: 交替方向,从 0% 开始,到 100% ,再到 0%。
alternate-reverse: 反向交替方向,从 100% 开始,到 0%,再到 100%。
通过下面的循环动画,对比小方块的运动轨迹,可以比较直观的感受这几个方向取值之间的差别:
animation-fill-mode 用来确定动画开始之前和结束之后的状态。这样才是一个完整的动画过程。
通过 keyframes 我们定义了动画不同阶段下的CSS规则,这有可能会和已经定义的样式冲突。
填充模式属性允许我们告诉浏览器是否动画样式在动画之外也生效。
让我们想象这样一个按钮:
默认是红色
在动画开始时被设置为绿色
在动画结束时被设置为蓝色
效果图:
我们可以简单的理解为:forwards就是动画样式作用区间向时间轴正方向(->)延伸,backwards则向负方向(<-)延伸,而both就是双向(<- ->)延伸。从而影响到相邻区间的默认样式。
*请认真填写需求信息,我们会在24小时内与您取得联系。