Flow-UI支持基于模板开发和基于自动化工具开发两种使用方式。基于模板开发与Bootstrap这类UI框架的用法基本相同,相当于使用了Flow-UI提供的默认UI主题和插件库;基于自动化工具开发可以额外获得定制主题、实时预览、组件化开发、构建时压缩等功能。
1. 拷贝flow-ui/
和modules/
到项目中;
2. 启动本地服务,访问 http://localhost/flow-ui/index.html
1. 安装Flow-CLI
npm i front-flow-cli -g
2. 初始化项目
flow init
3. 构建并监听
flow run
4. 构建
flow build
seajs.root |
[string] 模块化js加载起始路径,通常为"" ,例如页面在站点二级目录,需设置此项为目录名称。
|
seajs.set |
[object] 模块设置或自定义功能设置,例如seajs.set = {
base: {
timeout: 1.5e4
}
};
|
seajs.config.base |
[string] 模块化文件存放路径,默认seajs.root + "/modules" ,也可以配置其他位置或远程位置。
|
seajs.config.paths |
[object] 路径短语,默认配置了js 文件夹和lib 文件夹。
|
seajs.config.alias | [object] 模块短命名。 |
seajs.localcache.timeout |
[number] 本地缓存方案加载超时时间,单位ms,默认2e4
|
编译后的文件包括常规Flow-UI项目模板和控制台项目模板,均打包了完整CSS组件和JS插件,可以直接用于项目。
其中控制台模板代码经过压缩,常规项目模板为了便于开发修改所以未压缩。
npm i @tower1229/flow-ui
如果希望定制自己的UI可以从这里获取FLow-UI源码,包括所有CSS组件less文件,及未经合并的JS文件。
只有源码并不能顺利的构建Flow-UI,更好的方式是使用官方自动化开发工具Flow-CLI。
集安装、预览、编译、压缩等一系列自动化功能的开发工具,是开发Flow-UI项目的最佳方式。
npm i front-flow-cli -g
|--_component/ //框架CSS组件
|-- _src/ //源码目录
| |-- css/
| |-- font/
| |-- img/
| |-- include/
| |-- js/
| |-- lib/
| |-- index.html
| |-- seajs.config.js
| `-- favicon.ico
|-- modules/ //框架JS插件
|-- public/ //公共文件
`-- config.json //编译配置
|-- flow-ui/ //项目文件
| |-- css/ //css文件
| |-- font/ //字体文件
| |-- img/ //图片文件
| |-- js/ //js文件
| |-- lib/ //模块库以外的js文件
| |-- index.html //索引页
| |-- seajs.config.js //配置文件
| `-- favicon.ico //网页图标
·-- modules/ //框架模块库(可选)
Flow-UI基于less
实现UI组件化,从全站样式中抽离出配置文件,可实现灵活的风格控制和组件选配,要充分发挥Flow-UI的定制性,需要搭配自动化编译工具 Flow-CLI使用,示例主题配置如下:
//文字
@font-size: 14px;
@font-size-lg: 16px;
@font-size-sm: 12px;
@line-height: 1.7;
@font-family: Arial, 'Hiragino Sans GB', 'WenQuanYi Micro Hei', '\5fae\8f6f\96c5\9ed1', 'SimSun', sans-serif;
//基础色
@black: #000;
@light: #fff;
@gray-darker: lighten(@black, 13.5%); // #222
@gray-dark: lighten(@black, 20%); // #333
@gray: lighten(@black, 33.5%); // #555
@gray-light: lighten(@black, 60%); // #999
@gray-lighter: lighten(@black, 93.5%); // #eee
@text-color: @gray;
@link-color: inherit;
@link-color-hover: @primary;
@selected: #39f;
@placeholder: #aaa;
@border: #e8e9eb;
//情景色
@primary: #1d6fb8;
@primary-dark: darken(@primary, 20%);
@auxiliary: #ff6e0a;
@auxiliary-dark: darken(@auxiliary, 20%);
@info: #4fcbf0;
@info-dark: darken(@info, 20%);
@success: #25ae88;
@success-dark: darken(@success, 20%);
@warning: #fec14c;
@warning-dark: darken(@warning, 20%);
@danger: #fd7b6d;
@danger-dark: darken(@danger, 20%);
//间距
@space: 1.6 * @font-size;
@space-sm: 1 * @font-size;
@space-lg: 2.4 * @font-size;
//版式
@view-width: 1200px;
@radius: 4px;
//响应节点
@Pc: 1024px;
@Pad: 640px;
//grid.less
@gridColumns: 12;
@gridGutter: 2%;
//form.less
@form-base-height: round(@font-size * 2.3);
@form-sm-height: round(@font-size-sm * 2.1);
@form-lg-height: round(@font-size-lg * 2.5);
@form-base-space: round(@line-height / 3 * @font-size);
@form-lg-space: round(@line-height / 2.5 * @font-size);
//iconsprite.less
@sprite-matrix: 5;
@sprite-width: 25px;
//btn.less
@btn-base-height: @form-base-height;
@btn-sm-height: @form-sm-height;
@btn-lg-height: @form-lg-height;
//dl.less
@dl-label-width: 10em;
//table.less
@table-head-height: 40px;
点此进一步了解自动化工具Flow-CLI。
部分样式组件仅供插件调用,如tree.less
,将不在此罗列。
.badge | 定义一个徽标容器 |
.badge-count | 定义徽标数字元素 |
.badge-dot | 定义徽标圆点 |
.badge-count-alone | 叠加在.badge-count上将徽标显示为独立徽标 |
.badge-primary | 叠加在.badge上以显示为主色调(另:"auxiliary", success", "info", "warning", "danger") |
.bread | 定义一个面包屑容器 |
span.bread-sep | 定义面包屑间隔 |
span.bread-link | 定义面包屑当前位置 |
a.bread-link | 定义面包屑链接 |
.btn | 定义一个按钮 |
.btn-default | 普通颜色 |
.btn-primary | 主色调颜色 |
.btn-auxiliary | 辅色调颜色 |
.btn-info | 中性情景颜色 |
.btn-success | 成功情景颜色 |
.btn-warning | 警告情景颜色 |
.btn-danger | 危险情景颜色 |
.btn-sm | 叠加更改为较小尺寸按钮 |
.btn-lg | 叠加更改为较大尺寸按钮 |
.btn-ghost | 叠加更改为幽灵按钮 |
.btn-block | 叠加更改为块级按钮 |
.btn-link | 叠加更改为链接按钮 |
.card | 定义一个卡片 |
.card-shadow | 叠加阴影效果 |
.card-bordered | 叠加边框线 |
.card-head | 定义卡片头部 |
.card-title | 在头部内定义卡片标题 |
.card-extra | 在头部内定义附加物 |
.card-body | 内定卡片内容 |
.card-foot | 定义卡片底部 |
.card-primary | 叠加在容器上使开关显示为主色调(另:"auxiliary", success", "info", "warning", "danger") |
.card-inverse | 反转颜色卡片(card-body将带有背景色) |
.text-muted |
次要内容 |
.text-black |
黑色文本 |
.text-light |
白色文本 |
.text-primary |
主色调文字 |
.text-auxiliary |
辅助色文字 |
.text-success |
成功情景色 |
.text-info |
中性情景色 |
.text-warning |
警告情景色 |
.text-danger |
危险情景色 |
.bg-muted |
次要背景色 |
.bg-black |
黑色背景 |
.bg-light |
白色背景 |
.bg-gray-light |
浅灰色背景 |
.bg-gray-lighter |
更浅灰色背景 |
.bg-primary |
主色调背景色 |
.bg-auxiliary |
辅助色背景色 |
.bg-success |
成功情景背景色 |
.bg-warning |
警告情景背景色 |
.bg-danger |
危险情景背景色 |
.dl |
美化 dl 元素
|
.dl-table | 与.dl叠加提供左侧对齐样式 |
移动端和高级浏览器可用的flex栅格,沿用流式栅格系统的命名风格,解决flex三代规范演变带来的兼容问题。
.flex-col | 定义一个纵向flex容器。 |
.flex-row | 定义一个横向flex容器。 |
.flex-1,
.flex-2, .flex-3, .flex-4 |
定义flex盒子的主轴尺寸占比。
即,在纵向容器中控制高度,在横向容器中控制宽度。 |
.align-stretch | flex盒子在侧轴方向伸展。 |
.align-center | flex盒子在侧轴方向居中对齐。 |
.justify-center | flex盒子在主轴方向居中对齐。 |
.flex-wrap | 允许flex盒子换行显示,默认不换行。 |
.scroll_cont | 带滚动条区域 |
.form |
定义表单元素 |
.form-inline |
定义一个内联表单 |
.form-group |
在表单内定义一行,可以配合栅格系统使用 |
.form-group-sm |
叠加定义一个较小尺寸的行,内部元素自动缩小 |
.form-group-lg |
叠加定义一个较大尺寸的行,内部元素自动放大 |
.input-group |
定义一个带徽标的输入框组合 |
.input-group-sm |
叠加input-group定义一个较小尺寸的输入框组合 |
.input-group-lg |
叠加input-group定义一个较大尺寸的输入框组合 |
.input-group-addon |
在输入框组合内定义一个徽标 |
.noborder | 叠加input-group-addon使徽标无边框 |
.form-control |
定义 |
.form-control-blank |
叠加 |
.radio |
定义一个radio元素组合 |
.radio-inline |
叠加更改radio组合为内联样式 |
.checkbox |
定义一个checkbox元素组合 |
.checkbox-inline |
叠加更改checkbox组合为内联样式 |
.help-block |
定义一条帮助信息 |
.form-control-static |
定义一个与form-control元素登高的行 |
.control-label |
定义一个与form-control元素对齐的提示元素 |
.input-sm |
叠加更改为较小尺寸 |
.input-lg |
叠加更改为较大尺寸 |
.form-mark |
定义一个醒目标记元素 |
.disabled |
叠加到空间使不可用 |
.input-group-btn |
定义一个按钮组 |
<div class="row">
<div class="span-4"></div>
<div class="span-8"></div>
</div>
<div class="row">
<div class="span-4 midd-8 smal-16"></div>
<div class="span-8 midd-8 smal-16"></div>
</div>
<div class="full-row">
<div class="span-4 midd-8 smal-16">无间距模式</div>
<div class="span-8 midd-8 smal-16" style="background:grey;color:#fff;">无间距模式</div>
</div>
.center | 居中,居中的栅格将成为块级元素占据整行,不能多列栅格共存 |
.midd-center | 中屏居中 |
.smal-center | 小屏居中 |
.hide | 大屏隐藏 |
.midd-hide | 中屏隐藏 |
.smal-hide | 小屏隐藏 |
.smal-show | 小屏显示,用于显示中屏隐藏的元素 |
.pull-right | 置右,置右和位移工具的设计使用场景是,在非小屏下调整DOM顺序,以在小屏下全宽显示时有正确的前后(上下)关系 |
.pull-left-1 | 左位移1格, 注:位移在小屏下会自动清除 |
.pull-left-2 | 左位移2格, 注:位移在小屏下会自动清除 |
.pull-left-3 | 左位移3格, 注:位移在小屏下会自动清除 |
... | |
.pull-right-1 | 右位移1格, 注:位移在小屏下会自动清除 |
.pull-right-2 | 右位移2格, 注:位移在小屏下会自动清除 |
.pull-right-3 | 右位移3格, 注:位移在小屏下会自动清除 |
... |
嵌套栅格也需要带.row
或.full-row
层,支持无限嵌套。
<div class="row">
<div class="span-4">
side
</div>
<div class="span-8">
<div class="row">
<div class="span-9">
main
</div>
<div class="span-3">
sub
</div>
</div>
</div>
</div>
字体图标,为Flow-UI创建的图标库项目,提供框架内置图标的检索、获取Unicode、PNG定制下载功能。
详情访问Flow-ICON项目主页。
:<i class="ion"></i>
:<i class="ion"></i>
:<i class="ion"></i>
精灵图,.ico
定义一个25px正方形精灵图标,默认支持5x5矩阵,如:
<i class="ico ico1_1"></i>
<i class="ico ico1_2"></i>
.items | 定义列表容器 |
.bordered | 叠加在.items上显示边框线 |
.item | 定义列表项 |
.item-divider | 叠加在.item上使当前项为分隔栏 |
.item-extra | 定义列表右侧漂浮元素 |
.active | 叠加在.item上使当前项为激活状态 |
.item-info | 叠加.items使列表显示为指定色调,默认主色调(另:"auxiliary", success", "info", "warning", "danger") |
.items-inverse | 叠加.items使用列表呈现颜色反转效果 |
.label | 定义标签元素 |
.label-sm | 叠加.label显示为较小尺寸标签 |
.label-lg | 叠加.label显示为较大尺寸标签 |
.label-auxiliary | 叠加.label显示为辅色调,默认主色调(另:"auxiliary", success", "info", "warning", "danger") |
.label-bordered | 叠加.label显示为边框线风格 |
.label-closable | 叠加.label显示为带关闭按钮标签,需要配合.ion图标 |
类rect-[比例:number]
可以定义一个对应宽高比的矩形,内部._full
子元素将充满该矩形,示例:
内置比例:
.rect-4854 | |
.rect-50 | 2比1 |
.rect-5625 | 16比9 |
.rect-60 | 5比3 |
.rect-618 | 黄金分割 |
.rect-70 | 10比7 |
.rect-75 | 4比3 |
.rect-80 | 5比4 |
.rect-90 | 10比9 |
.rect-100 | 1比1 |
样式重置的目的在于清除浏览器的默认样式,带来一个干净的定制空间,在此基础上还额外做了一些事情:
max-width:none
即可;.m | 四周margin普通距离 |
.m-0 | 四周margin归零 |
.m-l | 左方margin普通距离 |
.m-t | 上方margin普通距离 |
.m-r | 右方margin普通距离 |
.m-b | 下方margin普通距离 |
.m-lr | 左右两侧margin普通距离 |
.m-tb | 上下两侧margin普通距离 |
.m-sm | 四周margin较小距离 |
.m-l-sm | 左方margin较小距离 |
.m-t-sm | 上方margin较小距离 |
.m-r-sm | 右方margin较小距离 |
.m-b-sm | 下方margin较小距离 |
.m-lr-sm | 左右两侧margin较小距离 |
.m-tb-sm | 上下两侧margin较小距离 |
.m-lg | 四周margin较大距离 |
.m-l-lg | 左侧margin较大距离 |
.m-t-lg | 上方margin较大距离 |
.m-r-lg | 右侧margin较大距离 |
.m-b-lg | 下方margin较大距离 |
.m-lr-lg | 左右两侧margin较大距离 |
.m-tb-lg | 上下方向margin较大距离 |
.spin-icon-load | 图标匀速旋转动画 |
.spin-size-sm | 小尺寸等待动画 |
.spin-size-lg | 大尺寸等待动画 |
.switch | 定义一个开关容器 |
.track | 定义开关滑轨 |
.handle | 定义开关波动手柄 |
.switch-on | 叠加在容器上使开关显示开启状态 |
.switch-disabled | 叠加在容器上使开关显示不可用状态 |
.switch-round | 叠加在容器上使开关显示为圆角 |
.switch-sm | 叠加在容器上使开关显示为较小尺寸 |
.switch-lg | 叠加在容器上使开关显示为较大尺寸 |
.switch-primary | 叠加在容器上使开关显示为主色调(另:"auxiliary", success", "info", "warning", "danger") |
美化表格,示例参见该文档中的表格,具有三种叠加状态:
table-bordered | 四周带边框线 |
table-condensed | 紧凑型间距 |
table-striped | 斑马线 |
table-hover | 整行悬浮着色 |
table-responsive | 响应式 |
注意:移动端需要使用tools-mobile.less
,以支持移动端屏幕适配。
.wrap | 定义主体内容区域,默认宽度自适应,最大宽度1000px,在移动端左右两边各有2%的间距,宽度支持自定义。 |
.fix | 清除浮动(撑起浮动) |
.oh | 超出隐藏,同时有清浮动的作用 |
.l / .r | 左 / 右浮动 |
.dib | 使元素呈现为inline-block |
.pr / .pa | 相 / 绝对定位 |
.tc / .tr | 居中对齐 / 居右对齐 |
.el | 文字单行显示超出显示为省略号 |
.hide | 隐藏元素 |
.hidetext | 隐藏元素内的文字 |
.arr | border绘图的基础类,实现了一个宽高为0的inline-block元素 |
.justify | 单行文字两端对齐,需设置高度 |
.scrollbar | 应用到容器元素,美化滚动条样式 |
.scrollbar-dark | 叠加到.scrollbar呈现黑色调滚动条样式 |
.menu-ui | 定义菜单元素 |
.menu-horizontal/.menu-vertical | 叠加在菜单元素上,定义菜单方向类型 |
.menu-light/.menu-dark/.menu-primary | 叠加在菜单元素上,定义菜单主题 |
.menu-item | 定义菜单项目 |
.menu-item-active | 叠加在菜单项目上,定义激活状态 |
.menu-sub-ion | 在菜单项目内定义菜单子项目状态图标 |
.menu-submenu | 定义包含子菜单的项 |
.menu-opened | 叠加在menu-submenu上指示子菜单为打开状态 |
.pagination | 定义分页 |
.pagination > li > a.unable | 不可用的分页链接 |
.pagination > li.active | 当前页 |
.progress | 定义进度条元素 |
.progress-inner | 进度条轨道 |
.progress-bg | 已完成进度条 |
.progress-text | 进度条信息容器 |
.progress-active | 叠加在.progress上呈现活动状态 |
.progress-show-info | 叠加在.progress上以显示进度条信息 |
progress-primary | 叠加在.progress上以显示为主色调(另:"auxiliary", success", "info", "warning", "danger") |
框架基于Seajs 实现js模块化开发,模块化很重要价值是前后端分离,引用js不再是页面底部的一堆script标签,js的增删改都不需要编辑、发布前台模板,使js代码可以向css一样容易维护,更多资料可以参考:前端模块化开发的价值。
基于模块化加载方式,网站脚本拆分为两部分:业务代码
和组件
业务代码
是具体业务脚本,每个页面模板都有一个对应的js文件放在项目内js/
文件夹中,js/
里还有一个common.js
用于管理公用代码,这个文件夹组成了站点的业务层。
组件
是对特定功能的封装,如jquery、轮显效果、视频播放器,日期选择器,表单验证等,用于被业务层调用,实现特定功能。模块封装相关文档见 CMD模块定义规范。
seajs.use()
方法可以启动并执行一个模块化的js文件,如首页底部的:seajs.use('js/index');
,将启动并执行"js/index.js",首页里的js效果都要在这里实现。
要使用某功能模块,就要先引用模块,语法是require("模块路径")
,或者用异步加载的方式require.async("模块路径","回调方法")
。
以index.js为例:
/*
* index.js
*/
define(function(require, exports, module) {
var $ = require('jquery');
var base=require('base');
var com = require('./common');
//...
})
index.js里分别引用了jquery,base和common,并将他们的返回值分别赋值。
并不是所有的模块都有返回值,例如common模块多数时候只是存放网站通用代码,导航栏、返回顶部、分享代码之类,很少对外提供方法,如果确定一个模块不需要任何返回值也可以只引用不赋值,例如 require('./common')
,大多数jquery插件模块也都没有返回值,因为jquery插件方法都扩展在jquery对象上,可以直接通过$.METHODNAME
的方式使用。
异步加载的模块不会提前就位,而是当前代码执行到该行时才开始请求模块文件,对于jquery和common这种被其他代码强依赖的模块我们希望尽快加载生效,因此使用同步加载,对于大多数效果类模块则应适度使用异步加载,以提高页面性能,但首屏效果应使用同步加载,以提高首屏响应速度。
require.async
得到的模块对象无法通过赋值保存,只能在回调函数中接收为参数,以百度分享模块为例:
require.async('bdshare',function(bdshare){
//接收百度分享对象:bdshare
bdshare({
bdSize : 16
});
});
common.js
用于管理整站公用代码,默认被所有业务层js引用。
跨平台音频播放器,详见官网
无
<!--html-->
<audio preload="auto" >
<source src="http://static.refined-x.com/static/sample.mp3" />
</audio>
//js
require('audio');
audiojs.events.ready(function() {
var as = audiojs.createAll();
});
利用flash技术实现复制文字到剪贴板,详细参数见官网
<div id="d_clip_button">复制</div>
require('copy');
$('#d_clip_button').zclip({
copy: "测试" + Math.random(),
afterCopy:function(){
console.log('复制成功');
}
});
集成vcastr3.0视频播放器,传入视频地址,返回播放器html,支持格式:.swf/.flv
src | 视频地址 |
---|---|
width | 宽,默认480 |
height | 高,默认320 |
auto | 默认false,自动播放 |
ctrl | 默认true,是否有播放控件 |
loop | 默认false,是否循环播放 |
logo | Logo处显示的文字 |
id | 给embed标签添加id,默认无 |
<!-- html -->
<div class="playarea2"></div>
<div class="playarea3"></div>
//js
var player=require('flv');
var player_2 = player({
src: 'http://static.refined-x.com/static/sample.flv',
loop:true
});
var player_3 = player({
src:'http://player.youku.com/player.php/sid/XOTIwMDA5Nzk2/v.swf'
});
//将播放器插入页面
$('.playarea2').html(player_2);
$('.playarea3').html(player_3);
封装1.x、2.x和3.x版本的jquery,seajs.config.js中已配置别名,默认使用1.x
var $ = require('jquery');
console.log($);
评分插件,来自https://github.com/wbotelhos/raty
cancel: | 默认false,创建一个取消按钮; |
---|---|
cancelPlace: | 默认'left',取消按钮的位置 |
click: | 默认undefind,点击回调 |
half: | 默认false,允许半星 |
hints: | 默认 ['bad', 'poor', 'regular', 'good', 'gorgeous'],每颗星星对应的提示 |
mouseout: | 默认undefind,mouseout回调 |
mouseover: | 默认undefind,mouseover回调 |
number: | 默认5,评分的总星数 |
precision: | 默认false,允许选择一个更精确的分数 |
readOnly: | 默认false,让评分不可更改 |
score: | 默认undefind,初始分数 |
scoreName: | 默认'score',评分插件会创建一个隐藏域存储分数,该项定义隐藏域的name |
single: | 默认false,评分时只有当前那颗星被点亮 |
space: | 默认true,星星之间是否有间距 |
target: | 默认undefind,jquery选择器格式或原生DOM元素,评分将被显示在该元素中 |
targetFormat: | 默认'{score}',输出到target的格式模板 |
targetKeep: | 默认false,当鼠标离开星星时target中的分数是否保留 |
targetScore: | 默认undefind,jquery选择器格式或原生DOM元素,用来存储分数的input选择器,插件将不再生成默认隐藏域 |
targetText: | 默认'',目标input的默认显示文字 |
targetType: | 默认'hint',目标input显示的类型,可选'score' |
<div class="demo"></div>
require('raty');
$('.demo').raty({
click:function(val){
console.log('打了'+val+'颗星');
}
});
上传插件,支持html5或ifram方式,改自aralejs/upload,集成localResizeIMG插件实现前端图片压缩,集成html5-make-thumb实现选择图片返回缩略图。
trigger | 唤出文件选择器,可以是:选择器、element、jQuery Object |
---|---|
name | 上传文件时对应的 name |
action | 表单提交的地址。 |
headers | 表单提交请求headers,默认{} 。 |
data | 随表单一起要提交的数据,支持object格式或同步返回数据的function。 |
accept | 支持的文件类型,比如 image/\* 为只上传图片类的文件。可选项。 |
change | 选择文件回调,回调参数为当前所选文件对象。若不设置,选择文件将自动上传,默认null |
progress | 上传的进度回调,不支持 IE9-。回调的参数分别为 ajaxEvent, 当前上传字节,总字节,进度百分比和当前文件列表。 |
error | 上传失败的回调函数。 |
multiple | 是否支持多文件上传。默认为 false。 |
compress | 图片是否上传前压缩。默认为 false。 |
compressOption | 上传压缩参数。默认 {},可配置width和height。 |
thumb | 接收缩略图的回调,回调参数为缩略图base64和文件对象。仅支持IE10及以上浏览器。 |
thumbOption | 生成缩略图的配置,默认
|
success | 上传成功的回调函数。 |
submit() | 提交上传 |
---|---|
change(callback) | 设置实例的change回调 |
success(callback) | 设置实例的成功回调 |
error(callback) | 设置实例的失败回调 |
enable() | 恢复实例禁用状态 |
disable() | 禁用实例 |
<div class="wrap">
<div class="row">
<div class="span-6">
<form class="form m" id="myform">
<p class="form-group">key1:<input type="text" class="form-control" name="key1" value="value1"></p>
<p class="form-group">key2:<input type="text" class="form-control" name="key2" value="value2"></p>
<p class="form-group">文件名称:<input type="text" class="form-control" readonly id="filename"></p>
<div class="from-group">
<button type="button" id="selectFile" class="btn btn-primary">选择</button>
<button type="button" id="doupload" class="btn btn-warning">上传</button>
</div>
</form>
<div class="m" id="uploaded"></div>
</div>
</div>
</div>
require.async('upload', function(Uploader) {
var uploader = new Uploader({
trigger: '#selectFile',
name: 'file',
data: function() {
var serializeArray = $('#myform').serializeArray(),
formData = {};
$.each(serializeArray, function(i, e) {
formData[e.name] = e.value;
});
return formData;
},
action: "http://host.refined-x.com/test/fileupload.php",
change: function(file) {
$('#filename').val(file[0].name);
},
progress: function(event, position, total, percent) {
console.log('已上传 ' + position + '/' + total + ' ' + percent + '%');
},
success: function(response) {
$('#uploaded').html('<img src="' + response.path + '" alt="" />');
}
});
$('#doupload').on('click', function() {
uploader.submit();
});
});
validform表单验证,整合密码强度验证插件。
*: | 检测是否有输入,可以输入任何字符,不留空即可通过验证; |
---|---|
*4-16: | 检测是否为4到16位任意字符; |
n: | 数字类型; |
n4-16: | 4到16位数字; |
f: | 浮点数类型; |
s: | 字符串类型; |
s4-16: | 4到16位字符串; |
p: | 验证邮政编码; |
m: | 手机号码格式; |
tel: | 座机号码格式; |
phone: | 手机或座机号码格式; |
e: | email格式; |
url: | 验证字符串是否为网址 |
其他验证直接写正则 | 例如验证中文:datatype="/^[\u4e00-\u9fa5]*$/" |
这里只列举新增配置和开发中常见问题,普通使用参考演示demo,使用细节访问官方文档。
type: |
默认post ,请求方式。(支持jQuery.ajax的所有配置)
|
---|---|
allable: |
默认false ,设置为true将提交属性为disable的元素值
|
tiptype: |
默认1 ,验证结果显示方式,1:弹出提示,2:输入框后插入
|
tipSweep: |
默认true ,是否只在提交前集中验证,每个输入框blur都会出发验证
|
dataType: |
默认"json" ,ajax提交方式的返回数据格式
|
postonce: |
默认false ,是否只允许提交一次
|
ajaxPost: |
默认true ,是否ajax方式提交
|
ajaxData: | 默认无,ajax提交方式的扩展数据,json || function(reutrn json) |
ajaxurl |
ajaxurl(实时验证)的处理页需要返回的数据格式:
|
beforeCheck |
表单验证前的操作,需要返回 |
beforeSubmit |
验证后、提交前的操作,需要返回 |
完整方法见Validform对象
submitForm(flag,url) |
以初始化时传入参数的设置方式提交表单,flag为 |
---|---|
check(bool,selector) |
bool为 对指定对象进行验证(默认验证当前整个表单),通过返回 |
<style>
.demo {
width: 50em;
margin:auto;
}
</style>
<form class="demo form" id="reg_form">
<div class="form-group">
<label class="control-label">用户名:</label>
<input type="text" class="form-control" name="username" datatype="/^[A-Za-z0-9\u9fa5@\u9fa5.]{2,20}$/" sucmsg="用户名验证通过!" nullmsg="请输入用户名!" errormsg="用户名非法!">
</div>
<div class="form-group">
<label class="control-label">密 码:</label>
<input type="password" class="form-control" name="userpassword" datatype="*6-15" errormsg="密码范围在6~15位之间!" plugin="passwordStrength">
<span class="passwordStrength r"><span>弱</span><span>中</span><span class="last">强</span></span>
</div>
<div class="form-group">
<label class="control-label">确认密码:</label>
<input type="password" class="form-control" name="userpassword2" datatype="*" recheck="userpassword" errormsg="您两次输入的密码不一致!">
</div>
<div class="form-group">
<label class="control-label">邮箱:</label>
<input type="text" class="form-control" name="email" datatype="e" errormsg="请输入正确的邮箱!" ignore="ignore">
</div>
<div class="form-group">
<label class="control-label">验证码:</label>
<div class="row">
<div class="span-6">
<input type="text" class="form-control" name="validnum" datatype="*" ajaxurl="http://host.refined-x.com/test/validRand.php" sucmsg="验证码正确!" nullmsg="请输入验证码!" errormsg="验证码错误!">
</div>
<div class="span-6">
<img src="http://temp.im/80x30/?text=8888" style="vertical-align: middle;"> 看不清?<a href="###">换一张</a>
</div>
</div>
</div>
<div class="help-block">
<label class="checkbox"> 同意用户协议<input type="checkbox" name="agree" datatype="*" nullmsg="请阅读并同意用户协议"></label>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">注册</button>
</div>
</form>
//js
require('validform');
var loginForm = $('#reg_form').Validform({
ajaxPost:true,
url: 'http://host.refined-x.com/test/ajax.php',
usePlugin:{ //密码强度插件,不需要就删掉
passwordstrength:{
minLen:6, //设置密码长度最小值,默认为0;
maxLen:16, //设置密码长度最大值,默认为30;
trigger:function(obj,error){
if(error){
obj.parent().find(".Validform_checktip").show();
obj.parent().find(".passwordStrength").hide();
}else{
obj.parent().find(".Validform_checktip").hide();
obj.parent().find(".passwordStrength").show();
}
}
}
},
callback:function(res){
}
});
集成video-js实现的跨平台视频播放插件,支持HTML5视频的跨平台播放,详见项目主页
controls | 是否有控件 |
---|---|
autoplay | 是否自动播放 |
preload | 预加载,可选'auto','metadata','no',分别是自动,仅加载视频信息数据,不加载 |
poster | 封面图片 |
loop | 默认false,是否循环播放 |
width | 播放器宽度 |
height | 播放器高度 |
其他 | 见官方文档 |
<video id="really-cool-video" class="video-js vjs-default-skin">
<source src="http://static.refined-x.com/static/sample.mp4" type='video/mp4'>
<p class="vjs-no-js">不支持js的浏览器会看到这个</p>
</video>
require('video');
var player = videojs('really-cool-video', {
width: 640,
height: 264,
poster: seajs.root + '/web/img/apple-touch-icon.png',
controls:true,
autoplay:true,
preload:'auto'
});
为jQuery.ajax()扩展两种缓存方式,定时缓存和快照缓存,依赖jQuery。
定时缓存即在特定时长内缓存数据,开启定时缓存的请求,在第一次成功返回数据后将不再重复发起请求,而是直接使用缓存数据,缓存过期后将自动清除,再次请求成功后将再次缓存,开启新的缓存周期,原理类似于函数防抖。
开启定时缓存需要为ajax配置localCache: Number
,数字为缓存时长,单位ms。
快照缓存即把每一次成功返回的ajax结果保存为快照,下次发起相同请求(判断依据是url和参数相同)时第一时间将快照取出返回给回调函数,待真实数据返回后校验与快照是否相同(需要数据为json格式),若相同则缓存命中,会为对象格式的快照数据添加一个'snapshootEqual'属性值为'true',不同则再次调用回调函数并传入真实数据,为了使业务中能够区分出快照数据,会为对象格式的快照数据添加一个'snapshoot'属性值为'true'。
开启快照缓存需要为ajax配置localCache: 'snapshoot'
选项。
使用ajax缓存时必须用'success'配置Ajax的回调函数。
<button id="test" type="button">send ajax</button>
<div id="log"></div>
//js
require('ajax-cache');
var $log = document.getElementById('log');
$('#test').on('click', function() {
$.ajax({
url: "http://rapapi.org/mockjsdata/9195/common/getRandom",
dataType:'json',
localCache: 'snapshoot',
success: function(res) {
if (res.snapshoot) {
$log.innerText = ('快照数据:' + res.data);
} else if (res.snapshootEqual) {
$log.innerText = ('快照命中');
} else {
setTimeout(function() {
$log.innerText = $log.innerText + ('\n最新数据:' + res.data);
}, 0);
}
}
});
});
相册插件,依赖幻灯片模块(slide.js)。返回Album
方法,语法:Album(config)
,或者使用jquery插件语法:$el.album(config)
blankclose | 默认false,点空白关闭 |
---|---|
title | 默认null,匹配的元素文字将作为标题显示 |
cell | 默认'li',相册展示的元素 |
trigger | 默认等于cell,触发相册的元素,可传入cell的子元素选择器 |
hook | 默认空字符串,用于附加自定义样式 |
effect | 切换效果,可选 slide | fade | toggle |
animate | 动画曲线,默认“swing” |
duration | 效果时长,单位ms,默认480 |
prevHtml | 左箭头html |
nextHtml | 右箭头html |
lazyload | 默认true ,图片是否应用懒加载,基于DOM创建需手动给图片增加slide-src 属性存储图片地址,基于数据创建将自动处理 |
onSlide | 回调,参数同slide.js |
onReady | 扩展,参数同slide.js |
<style>
.demo{overflow: hidden;padding:1em;}
.demo li{float: left;width: 240px;height: 150px;overflow: hidden;margin:0 .5em;}
</style>
<div class="demo">
<ul>
<li class="show">
<img src="http://temp.im/640x320/?1" >
<div class="_title">1这行字会成为标题</div>
</li>
<li class="show">
<img src="http://temp.im/640x320/?1" >
<div class="_title">2这行字会成为标题</div>
</li>
<li class="show">
<img src="http://temp.im/640x320/?3" >
<div class="_title">3这行字会成为标题</div>
</li>
<li class="show">
<img src="http://temp.im/640x320/?4" >
<div class="_title">4这行字会成为标题</div>
</li>
<li>
<img src="http://temp.im/640x320/?5" >
<div class="_title">这个li不会在相册中显示</div>
</li>
</ul>
</div>
require.async('album',function(){
$('.demo').album({
title: '._title',
cell: '.show'
})
})
自动补全插件,移植自jquery.autocomplete
serviceUrl | 远程请求地址,返回数据格式:
|
---|---|
suggestionsKey | 远程数据字段名称,默认'suggestions' |
lookup | 本地查找数据,数据格式见示例。 |
onSelect | 选中匹配项回调方法,接收选中的数据对象为参数。 |
完整API见官方文档
<!-- html -->
<form>
<input type="text" name="country" id="autocomplete-ajax" />
<button type="submit">search</button>
</form>
// js
var countriesArray = [{"value":"Andorra","data":"AD"},{"value":"United Arab Emirates","data":"AE"},{"value":"Afghanistan","data":"AF"},{"value":"Antigua and Barbuda","data":"AG"},{"value":"Anguilla","data":"AI"},{"value":"Albania","data":"AL"},{"value":"Armenia","data":"AM"},{"value":"Netherlands Antilles","data":"AN"},{"value":"Angola","data":"AO"},{"value":"Antarctica","data":"AQ"},{"value":"Argentina","data":"AR"},{"value":"American Samoa","data":"AS"},{"value":"Austria","data":"AT"},{"value":"Australia","data":"AU"},{"value":"Aruba","data":"AW"},{"value":"Åland Islands","data":"AX"},{"value":"Azerbaijan","data":"AZ"},{"value":"Bosnia and Herzegovina","data":"BA"},{"value":"Barbados","data":"BB"},{"value":"Bangladesh","data":"BD"},{"value":"Belgium","data":"BE"},{"value":"Burkina Faso","data":"BF"},{"value":"Bulgaria","data":"BG"},{"value":"Bahrain","data":"BH"},{"value":"Burundi","data":"BI"},{"value":"Benin","data":"BJ"},{"value":"Saint Barthélemy","data":"BL"},{"value":"Bermuda","data":"BM"},{"value":"Brunei","data":"BN"},{"value":"Bolivia","data":"BO"},{"value":"British Antarctic Territory","data":"BQ"},{"value":"Brazil","data":"BR"},{"value":"Bahamas","data":"BS"},{"value":"Bhutan","data":"BT"},{"value":"Bouvet Island","data":"BV"},{"value":"Botswana","data":"BW"},{"value":"Belarus","data":"BY"},{"value":"Belize","data":"BZ"},{"value":"Canada","data":"CA"},{"value":"Cocos [Keeling] Islands","data":"CC"},{"value":"Congo - Kinshasa","data":"CD"},{"value":"Central African Republic","data":"CF"},{"value":"Congo - Brazzaville","data":"CG"},{"value":"Switzerland","data":"CH"},{"value":"Côte d’Ivoire","data":"CI"},{"value":"Cook Islands","data":"CK"},{"value":"Chile","data":"CL"},{"value":"Cameroon","data":"CM"},{"value":"China","data":"CN"},{"value":"Colombia","data":"CO"},{"value":"Costa Rica","data":"CR"},{"value":"Serbia and Montenegro","data":"CS"},{"value":"Canton and Enderbury Islands","data":"CT"},{"value":"Cuba","data":"CU"},{"value":"Cape Verde","data":"CV"},{"value":"Christmas Island","data":"CX"},{"value":"Cyprus","data":"CY"},{"value":"Czech Republic","data":"CZ"},{"value":"East Germany","data":"DD"},{"value":"Germany","data":"DE"},{"value":"Djibouti","data":"DJ"},{"value":"Denmark","data":"DK"},{"value":"Dominica","data":"DM"},{"value":"Dominican Republic","data":"DO"},{"value":"Algeria","data":"DZ"},{"value":"Ecuador","data":"EC"},{"value":"Estonia","data":"EE"},{"value":"Egypt","data":"EG"},{"value":"Western Sahara","data":"EH"},{"value":"Eritrea","data":"ER"},{"value":"Spain","data":"ES"},{"value":"Ethiopia","data":"ET"}];
require('autocomplete')
$('#autocomplete-ajax').autocomplete({
lookup: countriesArray, //本地查找数据
onSelect: function(data){
console.log(data);
}
});
主要用于通知未读数的角标,提醒用户点击。返回 Badge
方法,语法: Badge(config)
,或使用jquery插件语法: $el.badge(config)
el |
默认 |
---|---|
count |
默认 |
slot |
默认 |
color |
默认 |
max |
默认 |
dot |
默认 |
count([value]) |
设置/获取当前实例的徽标数 |
---|
<div class="wrap">
<div class="m">
<a href="###" class="btn btn-default demo">Button</a>
<div class="btn btn-primary setmax m-l">设置为100</div>
<div class="btn btn-primary add m-l">+</div>
<div class="btn btn-primary min m-l">-</div>
<div class="btn btn-primary setmin m-l">设置为0</div>
</div>
<div class="p">独立显示:<span class="demo2 m-l"></span>
<div class="btn btn-primary setmax2 m-l">设置为100</div>
<div class="btn btn-primary add2 m-l">+</div>
<div class="btn btn-primary min2 m-l">-</div>
<div class="btn btn-primary setmin2 m-l">设置为0</div>
</div>
</div>
require('badge');
var badge1 = $('.demo').badge({
count: 1
});
$('.setmax').on('click', function() {
badge1.count(100);
});
$('.setmin').on('click', function() {
badge1.count(0);
});
$('.add').on('click', function() {
badge1.count(badge1.count() + 1);
});
$('.min').on('click', function() {
badge1.count(badge1.count() - 1);
});
var badge2 = $('.demo2').badge({
slot: false,
count: 9,
color: 'success'
});
$('.setmax2').on('click', function() {
badge2.count(100);
});
$('.setmin2').on('click', function() {
badge2.count(0);
});
$('.add2').on('click', function() {
badge2.count(badge2.count() + 1);
});
$('.min2').on('click', function() {
badge2.count(badge2.count() - 1);
});
封装常用工具
getUID() | 返回一个递增数字 | ||||||||||
getUUID([length]) | 返回一个随机数字字母组合,接收长度参数,不传默认6位 | ||||||||||
deepcopy(source) | 多维数组/对象数组深拷贝 | ||||||||||
getStyle(ele,attr) | 获取元素的属性值,ele:元素;attr:要获取的属性,返回属性值 | ||||||||||
$.cookie(name,value) | 操作cookie,name:键名;value:设置为的值,一个参数取值,返回value,两个参数赋值,无返回值 | ||||||||||
browser |
获取浏览器信息:
|
||||||||||
url |
url操作方法
|
||||||||||
storage |
localStorage操作模块。
|
||||||||||
throttle(fn, [delay], [duration]) |
函数节流,用于过滤resize,mousemove,scroll这类频连续繁触发事件
|
||||||||||
getScript(file, [callabck], [option]) |
加载未模块化的普通js文件,可控制jquery依赖、指定css依赖、添加回调,支持批量加载及批量线性依赖加载。
|
||||||||||
ajaxCombo(config) |
扩展jQuery.ajax方法,使支持请求合并,设置
|
封装百度分享,扩展分享按钮html自定义能力,接收通用设置和share设置,都是标准的百度分享参数格式,获取HTML代码请点这里。
commonConfig | 通用设置,可选,提供onBeforeClick接口用于点击分享按钮时动态更改配置,详见通用设置。 |
---|---|
shareConfig | share设置,可选,允许对多组分享通过data-tag标记做不同的配置,当只有一组分享时可以直接传入json格式,不传参将使用百度默认值,详见分享按钮设置。 |
<!-- 如果页面内有多组分享 -->
<div class="bdsharebuttonbox" data-tag="share_1" data-sharetitle="自定义分享标题">
<a class="bds_mshare" data-cmd="mshare"></a>
<a class="bds_qzone" data-cmd="qzone" href="#"></a>
<a class="bds_tsina" data-cmd="tsina"></a>
<a class="bds_baidu" data-cmd="baidu"></a>
<a class="bds_renren" data-cmd="renren"></a>
<a class="bds_tqq" data-cmd="tqq"></a>
<a class="bds_more" data-cmd="more">更多</a>
<a class="bds_count" data-cmd="count"></a>
</div>
<div class="bdsharebuttonbox" data-tag="share_2">
<a class="bds_mshare" data-cmd="mshare"></a>
<a class="bds_qzone" data-cmd="qzone" href="#"></a>
<a class="bds_tsina" data-cmd="tsina"></a>
<a class="bds_baidu" data-cmd="baidu"></a>
<a class="bds_renren" data-cmd="renren"></a>
<a class="bds_tqq" data-cmd="tqq"></a>
<a class="bds_more" data-cmd="more">更多</a>
<a class="bds_count" data-cmd="count"></a>
</div>
//多组分享js
require.async('bdshare',function(bdshare){
bdshare({
//如果不需要从页面获取分享内容不要加onBeforeClick这一段
onBeforeClick: function(cmd, config) {
var e = (arguments.callee.caller.arguments[0] || window.event).event;
config.bdText = $(e.target).parents('.bdsharebuttonbox').data('sharetitle');
//更改标题,所取的值若为undefined将默认使用页面title
config.bdDesc = 'shareTo ' + cmd;
//cmd是分享目标id,例如人人的id是"renren",可以用来识别具体分享到哪里
config.bdPic = 'http://temp.im/100x100/';
//更改分享信息的缩略图
config.bdUrl = window.location.href + '?shareTo=' + cmd;
//更改分享信息的url
return config; //返回新的config
}
},[{
tag : 'share_1',
bdSize : 16, //图标尺寸, 16|24|32
bdStyle : '1' //图标类型, 0|1|2
},
{
tag : 'share_2',
bdSize : 32,
bdStyle: 2
}])
});
弹窗插件,具有弹出任意内容、提醒、消息、询问、ajax、图片模式。
返回Box
方法,语法:Box.open(params...)
,或者使用jquery插件语法:$.box(params...)
Box.open(anything, [config]) |
打开弹窗 |
---|---|
Box.hide([boxid]) |
关闭弹窗,接收弹窗id为参数,无参数将关闭页面上所有弹窗 |
Box.setSize(boxid,[config]) |
box尺寸重设,接收弹窗id和尺寸配置为参数,无配置时将重计算指定弹窗的尺寸 |
Box.alert() |
提醒弹窗,弹出短信息,有一个确认按钮
|
Box.msg() |
消息弹窗,在屏幕顶部显示一条全局消息,特有一个color配置用来定义消息请景色,可选"info,primary,success,warning,danger"
|
Box.toast() |
消息气泡,在屏幕中部显示一条消息气泡,默认延时2s自动关闭。
|
Box.confirm() |
确认弹窗,弹出一条确认信息,有一个确认按钮和一个取消按钮
|
Box.ajax() |
ajax弹窗,弹出ajax获得的内容
|
Box.ifram() |
弹出一个ifram窗口
|
Box.img() |
弹出一张图片
|
top | 默认无,若有值将固定弹窗据window顶部距离 |
---|---|
title | 默认"对话框" ,对话框标题html |
oktext | 默认"确定" ,确定按钮的文字 |
canceltext | 默认"取消" ,取消按钮的文字 |
shut | 默认"×" ,关闭按钮html,传入false将没有关闭按钮 |
width | 默认"auto" ,弹窗宽度 |
height | 默认"auto" ,弹窗高度 |
layout | 默认true ,是否包含边框 |
setposi | 默认true ,无layout的情况下,是否自动添加定位样式,手动定位需要设为false |
bar | 默认true ,是否显示标题栏 |
bg | 默认true ,是否显示背景层 |
fix | 默认true ,弹窗是否框固定在页面上 |
bgclose | 默认true ,是否点击背景层关闭 |
drag | 默认false ,是否可拖拽 |
protect | 默认false ,若为true,关闭后会将弹出的元素appendTo('body') |
delay | 默认0 ,弹窗自动关闭时间, 0和负值不触发 |
lang | 默认0 ,语言选择,0:中文 1:英文 |
hook | 默认无,自定义样式钩子,用于给弹窗附加class修改样式 |
color | 默认"info",Box.msg方法的情景色,使用的是ui.css提供的几种背景色,可选info,primary,success,warning,danger |
onshow(box) | 默认无,弹窗打开事件,接收弹窗DOM对象为参数 |
onclose() | 默认无,弹窗关闭事件 |
boxid |
每次Box调用都将返回一个boxid,用于Box.hide()的参数时,可关闭本弹窗实例
|
---|
<style>
button{margin:.5em;}
.myextclass .wrap_bar{background:green;}
</style>
<!-- html -->
<form class="demo hide" style="padding:20px;">
<p>
<label>姓名:</label><input type="text">
</p>
<p>
<label>电话:</label><input type="tel">
</p>
<p>
<label>邮箱:</label><input type="mail">
</p>
<p class="tc" style="margin-top:1em">
<button>填好了</button>
</p>
</form>
<div><button class="btn btn-default boxDom">弹出Dom</button></div>
<div><button class="btn btn-default boxMsg">提示</button></div>
<div><button class="btn btn-default boxToast">气泡</button></div>
<div><button class="btn btn-default boxAlert">警告</button></div>
<div><button class="btn btn-default boxConfirm">询问</button></div>
<div><button class="btn btn-default boxAjax">Ajax弹出内容</button></div>
<div><button class="btn btn-default boxIfram">弹出ifram</button></div>
<div><button class="btn btn-default modal">弹出一个模态自定义内容</button>
<div><button class="btn btn-default extclass">添加自定义class</button></div>
<div><button class="btn btn-default boximg">弹出图片</button></div>
//支持全局修改默认配置,全局配置必须在require('module name'),
//例如全局语言改为英文
window.boxGlobal = {lang:1};
//js
var Box = require('box');
$('.boxDom').on('click',function(){
Box.open( $('.demo') );
});
$('.boxAlert').on('click',function(){
Box.alert('hello box!',function(){
alert('alert的回调');
});
});
$('.boxMsg').on('click',function(){
Box.msg('注意,这是一条测试信息!',{
delay:3000
});
});
$('.boxToast').on('click',function(){
Box.toast('这是一条测试信息!');
});
$('.boxConfirm').on('click',function(){
Box.confirm('hello box!', function(){
alert('确定回调');
}, function(){
alert('取消回调');
});
});
$('.boxAjax').on('click',function(){
Box.ajax('http://host.refined-x.com/test/ajax.php', {
param: "param1" //Ajax参数
});
});
$('.boxIfram').on('click',function(){
var myifr = Box.ifram('http://host.refined-x.com/test/iframCloseTest.html',{
name: "closeTestIfram", //ifram name,默认空(不是弹窗标题)
width: 320, //iframe宽,默认640
height: 240 //iframe高,默认480
});
});
$('.modal').on('click',function(){
Box.open('<i class="ion rotation"></i>',{
layout:false,
bgclose:false,
delay:3e3
});
});
$('.extclass').on('click',function(){
Box.open('通过附加自定义class修改了弹窗样式',{
hook: "text-success"
});
});
$('.boximg').on('click',function(){
var imgBox = Box.img('http://static.refined-x.com/static/view0.jpg',{
onshow:function($this){
$this.on('click',function(){
Box.hide(imgBox);
});
}
});
});
基本组件-单/多选框。
返回Checks
方法,语法:Checks(params...)
,或者使用jquery插件语法:$.checks(params...)
el |
默认 |
---|---|
type |
默认 |
name |
默认 |
data |
默认 |
checked |
默认 |
disabled |
默认 |
mode |
默认 |
onChange |
默认 |
onReady |
默认 |
checked([value]) |
获取/设置已选项,"checkbox"模式接收value数组,"radio"模式接收value |
---|---|
disabled([value]) |
获取/设置禁用项,接收value数组 |
<div class="wrap">
<form class="form" id="testform">
<div class="form-group demo1">
使用数据初始化
</div>
<div class="form-group demo2">
使用标签初始化
<input type="radio" value="1" name="radio1" label="香蕉" checked>
<input type="radio" value="2" name="radio1" label="西瓜">
<input type="radio" value="3" name="radio1" label="猕猴桃" disabled>
</div>
<div class="input-group-btn">
<div class="btn btn-default checkall">全选checkbox</div>
<div class="btn btn-default checknone">反选checkbox</div>
<div class="btn btn-default radiocheck">选中radio第二项</div>
</div>
<p class="form-control-static" id="log"></p>
</form>
</div>
var checks = require('checks');
var showLog = function(checked){
if(checked){
console.log(checked);
}
$('#log').text($('#testform').serialize());
};
var mycheck = checks({
el: $('.demo1'),
type: 'checkbox',
name: 'datacheck',
data: [{
value: 'yingtao',
label: '樱桃'
},{
value: 'tianhua',
label: '甜瓜'
},{
value: 'caomei',
label: '草莓'
}],
checked: ['yingtao'],
disabled: ['caomei'],
onChange: showLog,
onReady: showLog
});
var myradio = checks({
el: $('.demo2'),
type: 'radio',
onChange: showLog,
onReady: showLog
});
$('.input-group-btn').on('click', '.btn', function(){
$(this).addClass('active').siblings('.active').removeClass('active');
if($(this).hasClass('checkall')){
mycheck.checked(['yingtao','tianhua','caomei']);
} else if($(this).hasClass('checknone')){
mycheck.checked([]);
} else if($(this).hasClass('radiocheck')){
myradio.checked('2');
}
});
地区选择器插件,返回citySelect
方法,语法citySelect(config)
,或使用jquery插件格式$el.citySelect(config)
。
el |
触发元素,默认无,直接调用方法必填,jquery插件调用时可忽略,默认应用$(this) |
---|---|
textKey |
默认 |
subKeys |
默认 |
data |
省市区数据,支持数组或能返回指定格式的异步请求地址,异步数据必须为json格式且包含
|
readOnly |
默认 |
onSelect |
选择结束回调函数,接收选择结果,格式为所选每一级数据组成的数组 |
val |
获取/设置选择器的当前值 设置值时需要传入textKey所配置属性值,多个值之间逗号隔开 |
---|
<div class="m" style="width:200px">
<input type="text" class="demo form-control" placeholder="选择地区">
</div>
<div class="getval btn btn-default">获取当前值</div>
<div class="setval btn btn-default">赋值</div>
require('city-select');
var myselect = $('.demo').citySelect({
data:[{"name":"北京","id":"001","city":[{"name":"北京","id":"001","area":[{"name":"东城区","id":"001"},{"name":"西城区","id":"002"},{"name":"崇文区","id":"003"},{"name":"宣武区","id":"004"},{"name":"朝阳区","id":"005"}]}]},{"name":"河北","id":"002","city":[{"name":"石家庄","id":"002","area":[{"id":"002","name":"长安区"},{"id":"002","name":"桥东区"},{"id":"002","name":"桥西区"},{"id":"002","name":"新华区"},{"id":"002","name":"郊 区"}]}]},{"name":"台湾","id":"003","city":[{"name":"台湾","id":"003","area":[{"id":"003","name":"台北市"},{"id":"003","name":"高雄市"},{"id":"003","name":"台北县"},{"id":"003","name":"桃园县"}]},{"name":"其他","id":"004","area":[{"name":"其他","id":"004"}]}]}],
onSelect:function(result){
console.log(result);
var address = [];
$.each(result, function(i, e) {
address.push(e.name);
});
$(this).val(address.join(' / '));
}
});
$('.getval').on('click', function(){
console.log(myselect.val());
});
$('.setval').on('click', function(){
myselect.val('北京,北京,西城区');
});
将内容区域折叠/展开,支持基于标签生成和基于数据生成两种模式。返回Collapse
方法,语法Collapse(config)
,或使用jquery插件格式$el.collapse(config)
。
el |
插入/生成折叠面板的元素,默认无,直接调用方法必填,jquery插件调用时可忽略,默认应用$(this) |
---|---|
conts |
默认 该元素的data-card-title属性值将作为选项卡标签标题,另外还支持 |
data |
默认
[{
|
opened |
默认 |
color |
默认 |
single |
默认 |
onChange |
状态变化回调方法,@param(opened) : 当前展开的序号数组 |
open([indexArray]) |
设置/获取展开的折叠面板 |
---|
<div class="wrap">
<div class="row">
<div class="span-6">
<div class="demo m-tb">
<div class="panel" data-card-title="史蒂夫·乔布斯">
史蒂夫·乔布斯(Steve Jobs),1955年2月24日生于美国加利福尼亚州旧金山,美国发明家、企业家、美国苹果公司联合创办人。
</div>
<div class="panel" data-card-title="斯蒂夫·盖瑞·沃兹尼亚克">
斯蒂夫·盖瑞·沃兹尼亚克(Stephen Gary Wozniak),美国电脑工程师,曾与史蒂夫·乔布斯合伙创立苹果电脑(今之苹果公司)。斯蒂夫·盖瑞·沃兹尼亚克曾就读于美国科罗拉多大学,后转学入美国著名高等学府加州大学伯克利分校(UC Berkeley)并获得电机工程及计算机(EECS)本科学位(1987年)。
</div>
<div class="panel" data-card-title="乔纳森·伊夫">
乔纳森·伊夫是一位工业设计师,现任Apple公司设计师兼资深副总裁,英国爵士。他曾参与设计了iPod,iMac,iPhone,iPad等众多苹果产品。除了乔布斯,他是对苹果那些著名的产品最有影响力的人。
</div>
</div>
<div class="btn btn-default open3">打开第3个</div>
<div class="btn btn-default opennone">全部关闭</div>
</div>
</div>
</div>
require('collapse');
var mycol = $('.demo').collapse();
$('.open3').on('click', function(){
mycol.open([2]);
});
$('.opennone').on('click', function(){
mycol.open([]);
});
倒计时插件,通过重写render方法可自定义显示格式。
标准日期对象的月份设置范围是0~11,不是1~12
begin | 开始时间,可选,默认本机时间,标准日期格式,如new Date(2089,01,05,02,25,00) ,或new Date("2089/01/05 02:25:00") ,或new Date("2089-01-05 02:25:00") |
---|---|
date | 结束时间,标准日期格式,默认 new Date(2089,01,05,02,25,00) |
refresh | 刷新率,单位ms,默认1000,即按秒刷新 |
offset | 偏移量,单位ms,用于纠正时区偏差 |
onEnd | 倒计时结束回调函数,默认无 |
render | 渲染函数,接收两个参数分别是当前DOM和日期 |
update(option) |
更新倒计时参数,如果在onEnd回调中调用update方法,注意避免死循环 |
---|---|
stop() |
停止当前倒计时实例 |
<!-- html -->
<div class="demo"></div>
//js
var endData = new Date(),
endMill = endData.getTime()+1000*60*60*24;
endData.setTime(endMill);
require.async('countdown', function() {
$('.demo').Countdown({
date: endData,
render: function($this, date) {
$this.html(date.years + " 年, " +
date.days + " 天, " +
date.hours + " 时, " +
date.min + " 分 " +
date.sec + " 秒"
)
}
})
})
日期选择器插件,基于fengyuanchen/datepicker二次开发
autoShow | 默认false ,初始化后立即显示日历 |
---|---|
autoHide | 默认false ,选择日期后自动关闭日历 |
autoPick | 默认false ,初始化后自动选中当前日期 |
inline | 默认false ,是否以内嵌模式显示日历,需搭配container 使用 |
container | 元素或字符串,默认null ,容纳inline模式日历的元素或元素选择器 |
trigger | 元素或字符串,默认null ,指定显示日历的触发器 |
language | 界面语言,默认'' ,可选'zh-CN' |
format |
字符串,默认 支持的格式元素:
|
date | 日期数据或字符串,默认null ,初始日期,不设置选择当天 |
selected | 日期数组,默认[] ,设置需要高亮显示的日期 |
startDate | 日期数据或字符串,默认null ,设置可选的起始日期 |
endDate | 日期数据或字符串,默认null ,设置可选的终止日期 |
startView | 数值,默认0 ,设置初始化界面,可选0: days;1: months;2: years |
weekStart | 数值,默认0 ,设置每周的起始天,可选0: Sunday;1: Monday;2: Tuesday;3: Wednesday;4: Thursday;5: Friday;6: Saturday |
yearFirst | 布尔值,默认false ,界面上将年显示到月之前 |
yearSuffix | 字符型,默认'' ,年份后缀,例如可以设置为'年' |
days | 数组,默认['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] ,设置一周每天称谓 |
daysShort | 数组,默认['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] ,一周每天称谓短版 |
daysMin | 数组,默认['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] ,一周每天称谓更短 |
months | 数组,默认['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] ,月份名称 |
monthsShort | 数组,默认['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] ,月份短称谓 |
itemTag | 字符串,默认'li' ,标签名 |
mutedClass | 字符串,默认'muted' ,设定class前缀 |
selectedClass | 字符串,默认'selected' ,定义高亮日期class |
pickedClass | 字符串,默认'picked' ,定义选中日期class |
disabledClass | 字符串,默认'disabled' ,定义不可用日期class |
offset | 数值,默认10 ,日期弹出位置距离元素的距离,单位px |
needTime |
默认 注意:默认format不显示时间,需要同时修改format |
zIndex | 数值,默认1 ,日期弹窗的z-index值 |
filter | 函数,默认null ,例如
|
show | 函数,默认null ,日历显示的回调 |
hide | 函数,默认null ,日历隐藏的回调 |
pick | 函数,默认null ,选择日期的回调,函数event中date属性可以获得选中的日期 |
见:官方文档
<p> 普通 </p>
<input class="datepicker">
<p> 自动关闭/值选择年月 </p>
<input class="datepicker2">
<p> 选择时间 </p>
<input class="datepicker3">
require('datepicker');
$('.datepicker').datepicker({
language: 'zh-CN'
});
$('.datepicker2').datepicker({
autoHide: true,
format:'yyyy/mth'
});
$('.datepicker3').datepicker({
needTime: true,
format:'yyyy/mth/dd hh:mm:ss'
});
拖拽面板插件,配合card(卡片)组件和flex(栅格)组件实现可拖拽面板;返回DragPanel
方法,语法:DragPanel(config)
,或使用jquery插件语法:$el.dragPanel(config)
兼容ie10+
el | 默认null ,拖拽面板外边界,直接调用方法必填,jquery插件调用时可忽略,默认应用$(this) |
---|---|
sortkey | 默认"data-key" ,被拖拽元素的排序标识 |
dragable | 默认".dragable" ,被拖拽元素 |
dragwrap | 默认null ,被拖拽元素的包裹元素,设置该项可实现多栏/多行效果 |
dragwrapLimitLength | 默认1 ,每个包裹元素中的被拖拽元素最小数量限制 |
ondrag | 默认无,拖拽结束回调,返回新的排序标识数据 |
showShadow | 默认false ,是否显示一个被拖拽元素的克隆元素 |
dragstart自动为el
元素添加"drag-panel-wrap"
类,为opt.dragable
元素添加"drag-panel-active"
类;
<style>
.drag-panel-active{opacity: .2;}
</style>
<div class="wrap">
<div class="row" id="wrapper">
<div class="span-4 m dragable" data-key="1">
<div class="card card-shadow card-primary">
<div class="card-head">
<div class="card-title"> Hello Card1</div>
</div>
<div class="card-body">
mycard
</div>
</div>
</div>
<div class="span-4 m dragable" data-key="2">
<div class="card card-shadow card-primary">
<div class="card-head">
<div class="card-title"> Hello Card2</div>
</div>
<div class="card-body">
mycard
</div>
</div>
</div>
<div class="span-4 m dragable" data-key="3">
<div class="card card-shadow card-primary">
<div class="card-head">
<div class="card-title"> Hello Card3</div>
</div>
<div class="card-body">
mycard
</div>
</div>
</div>
<div class="span-4 m dragable" data-key="4">
<div class="card card-shadow card-primary">
<div class="card-head">
<div class="card-title"> Hello Card4</div>
</div>
<div class="card-body">
mycard
</div>
</div>
</div>
</div>
</div>
require('drag-panel');
$('#wrapper').dragPanel({
ondrag: function(newSort) {
console.log(newSort);
}
});
拖拽插件,拖拽元素大于拖拽范围或者小于拖拽范围都可以,两种情况都支持边缘检测,返回Drag
方法,语法:Drag(config)
,或者使用jquery插件语法:$el.drag(config);
wrap |
默认 |
---|---|
el |
默认 |
overflow |
默认 |
dragStart |
默认 |
onDrag |
默认 |
onMove |
默认 |
dragEnd |
默认 |
handletouch | 默认true ,是否劫持触屏事件 |
onClick | 默认无,当handletouch为true 时常规click事件将失效,可以通过该配置添加click事件 |
<!--html-->
<div class="drag" style="width:100px;height:100px;background:#434343;"></div>
//js
require('drag');
$('.drag').drag({
dragStart:function($this){
console.log(1)
},
dragEnd:function($this){
console.log(2)
}
});
下拉菜单插件,继承【tip】插件配置和方法,返回Dropdown
方法,语法:Dropdown(config)
,或者使用jquery插件语法:$el.dropdown(config);
el | 默认null ,制定触发元素,直接调用方法必填,jquery插件调用时可忽略,默认应用$(this) |
---|---|
trigger | 默认"hover" ,触发动作 hover | click | custom |
place | 默认"bottom-center" |
items | 默认[] ,下拉数据,必须,每一项必须是包含item 属性的对象,此外可添加自定义属性,对象将在onclick 回调中接收 |
width | 默认无,可设置菜单最小宽度 |
theme | 默认"dropdown-default" ,通过该hook可自定义下拉菜单皮肤 |
onclick | 默认无,点击菜单项回调方法。@param(item, isCurrent) : 对应的items数据项,是否为当前已选项 |
items([data]) | 设置/获取当前实例的数据。 |
---|
<div class="wrap">
<div id="demo1" class="btn btn-success">菜单1</div> <div id="demo2" class="btn btn-warning">菜单2</div>
</div>
var Dropdown = require('dropdown');
Dropdown({
el: '#demo1',
items: [{
item: '个人设置',
data: 'demo1'
}, {
item: '数据统计',
data: 'demo1'
}, {
item: '立即更新',
data: 'demo1'
}],
onclick: function(item){
console.log(item);
}
});
$('#demo2').dropdown({
items: [{
item: '个人设置',
data: 'demo2'
}, {
item: '数据统计',
data: 'demo2'
}, {
item: '立即更新',
data: 'demo2'
}],
onclick: function(item){
console.log(item);
}
});
扩展jquery.animate动画效果,来自jquery.easing.js,被scroll-col
和scroll-row
插件依赖
效果包括:linear, swing, jswing, easeInQuad, easeOutQuad, easeInOutQuad, easeInCubic, easeOutCubic, easeInOutCubic, easeInQuart, easeOutQuart, easeInOutQuart, easeInQuint, easeOutQuint, easeInOutQuint, easeInSine, easeOutSine, easeInOutSine, easeInExpo, easeOutExpo, easeInOutExpo, easeInCirc, easeInOutCirc, easeInElastic, easeOutElastic, easeInOutElastic, easeInBack, easeInOutBack, easeInBounce, easeOutBounce, easeInOutBounce
require('easing');
$(element).slideUp({
duration: 1000,
easing: method,
complete: callback
});
$(element).animate({
height:100
},{
duration: 1000,
easing: method,
complete: callback
});
封装百度Echarts 4.0,包含类型:柱状图、饼状图、折线图、散点图、雷达图、热力图、地图、仪表盘、象形柱图;包含组件:标题、图例、提示框
详细用法见官方文档
IE9+
<div id="main" style="width: 600px;height:400px;"></div>
var echarts = require('echarts');
// 基于准备好的DOM,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data:['销量']
},
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
模板引擎,用于相对大量的视图渲染,文档详见项目主页
对于动态数据渲染场景,推荐基于etpl的渲染器Render
html | 默认过滤器,html转义 |
---|---|
url | url转义 |
raw | 不进行任何转义 |
date | 日期过滤,可选参数outFormat (默认'YYYY-MM-DD'), inFormat (默认'YYYY年MM月DD日') |
dec | 数字过滤,可选参数format (默认'#,###.00') |
<!-- html -->
<div class="demo"></div>
var etpl=require('etpl');
var render = etpl.compile('Hello ${name}!');
var text = render({ name: 'etpl' });
$('.demo').html(text);
对目标区域内图片做加载完成检测
<!--html-->
<div class="demo">
<ul>
<li><img src="http://lorempixel.com/442/548/?582" ></li>
<li><img src="http://lorempixel.com/405/406/?324" ></li>
<li><img src="http://lorempixel.com/374/330/?734" ></li>
</ul>
</div>
//js
require('img-loaded');
$('.demo').imagesLoaded(function(){
alert('加载完成');
})
能在图片下载完成之前检测到图片真实尺寸,返回方法接受三个参数分别是图片地址、检测完成回调,下载完成回调
<!-- html -->
<img id="demo" src="http://lorempixel.com/442/548/?582">
var ready = require('img-ready');
ready($('#demo').attr('src'),
function(width,height){
$('body').append($('<div>预取width:'+width+' height:'+height+'</div>'))
}, function(width,height){
$('body').append($('<div>加载完成!</div>'));
}
)
数字输入框插件,继承【input】插件配置和方法(部分配置无效),支持标签data-options
属性传参
$('.flow-ui-input-number')
元素将自动初始化,并且支持data-config属性
min | 默认0 ,最小值 |
---|---|
val | 默认null ,将沿用input元素初始值 |
countstep | 默认1 ,每次加减数量 |
max | 默认无限大,最大值 |
style | 默认'default' ,可选'inline',计数器样式 |
onChange(val) | 默认无,数值变更回调 |
同【输入框】组件。
<style type="text/css">
.demo{width:200px;margin-bottom: 1em;}
</style>
<input type="text" name="count" class="demo mytest">
<div class="demo flow-ui-input-number" data-options={"name":"countnumber"}></div>
<button type="button" id="act1" class="btn btn-default">切换实例1禁用状态</button>
require('input-number');
var mycount = $('.mytest').inputNumber({
min:2,
max:9,
val: 5,
style: 'inline',
onChange: function(val) {
$('body').append('<p>实例1的值:' + val + '</p>');
}
});
var disable = false;
$('#act1').on('click',function(){
disable = !disable;
mycount.disabled(!disable);
});
输入框插件,可以基于input、textarea标签生成文本框,也可以基于其他标签在其内部插入一个文本框,支持data-options
属性传参
$('.flow-ui-input')
元素将自动初始化,并且支持data-config属性
color | 默认"" ,情景色配置,可选"success" "warning" "danger" |
---|---|
id | 默认自动生成随机id,指定生成input的id |
width | 默认无,组件宽度,默认继承目标元素的class定义的宽度 |
buttons | 默认无,按钮配置,格式如下:
|
type | 指定生成input的type类型,默认使用目标元素的type类型 |
holder | 默认'' ,指定生成input的placeholder文字 |
val | 默认null ,不填将沿用input元素初始值 |
text | 默认'' ,指定生成input的初始显示值 |
icon | 默认'' ,指定icon编码,不传则不显示图标 |
iconPosition | 默认'right' , 图标位置,可选'left' |
size | 默认'' ,生成组件尺寸,可选'sm'/'lg' |
name | 默认'' ,指定input的name值,不传则不会添加或修改原始input的name属性 |
disable | 默认false ,是否禁用 |
readonly | 默认false ,是否只读 |
datatype | 默认'' ,验证类型,不传将继承目标元素的datatype属性,释义同【validform组件】 |
errormsg | 默认'' ,验证错误提示,不传将继承目标元素的errormsg属性,释义同【validform组件】 |
nullmsg | 默认'' ,验证未填提示,不传将继承目标元素的nullmsg属性,释义同【validform组件】 |
render(val) | 默认无,格式化方法,接收原始值,需返回格式化后的值,用于input组件展示 |
onChange(val) | 默认无,监听输入变化回调,接收当前值 |
disabled([flag]) | 禁用input实例,若flag为真值将解禁 |
---|---|
readonly([flag]) | 只读input实例,若flag为真值将恢复可写 |
destroy() | 销毁实例 |
clear() | 清空输入 |
reset() | 恢复实例为初始值 |
text([setValue]) | 读取/设置实例显示值 |
val([setValue]) | 读取/设置实例值 |
<style>
.demo{display:inline-block;width:250px;vertical-align: bottom;}
</style>
<form class="wrap">
<!-- 基于input标签 -->
<input type="text" name="input1" class="demo input1">
<!-- 基于textarea标签 -->
<textarea class="demo flow-ui-input" name="area1"></textarea>
<!-- 基于其他标签 -->
<div class="demo inputdiv flow-ui-input" data-options={"name":"input2"}></div>
<button type="button" class="btn btn-default setreadonly">切换input1只读状态</button>
</form>
require('input');
var myinput = $('.input1').input({
buttons: [
{
text: '确定',
click:function(val, text){
console.log('val:',val);
console.log('text:',text);
}
},
{
text: '清除',
click:function(val, text){
myinput.clear();
}
}
],
val:'100',
holder: '输入金额',
errormsg: '请输入整数!',
datatype:'n',
render:function(val){
return '$'+val;
},
onChange: function(val){
console.log('change to',val);
}
});
var readable = true;
$('.setreadonly').on('click',function(){
readable = !readable;
myinput.readonly(readable);
});
链接预加载插件,详细应用方案查看【链接预加载】,文档参见官方文档
var ic = require('instantclick');
ic.init();
标签插件,可以用于标记和分类。返回 Label
方法,语法:Label(config)
,或使用jquery插件语法:$el.label(config)
el |
默认 |
---|---|
color |
默认 |
data |
默认 |
closable |
默认 |
type |
默认 |
size |
默认 |
onClose |
默认 |
data([Array]) |
设置/获取标签数据 |
---|
<div class="m demo"></div>
<div class="btn btn-default add">add</div>
require('label');
var mytag = $('.demo').label({
data: [{
text: '标签1',
name: 'tag1'
}, {
text: '标签2',
name: 'tag2'
}],
closable: true,
onClose: function(tag) {
console.log('delete:' + tag.text);
}
});
$('.add').on('click', function(){
var otag = mytag.data();
otag.push({
text: '标签' + (otag.length + 1)
});
mytag.data(otag);
});
图片懒加载插件,用于滚动时加载视窗内的图片或元素背景。返回LazyLoad
方法,语法:LazyLoad(config)
,或使用jquery插件语法:$el.lazyload(config)
el |
默认 |
---|---|
attr |
默认 |
everyCount |
默认 |
distance |
默认 |
<style> .demo p{float:left; margin:20px; width:200px; height: 200px; background:#eee;background-position:center;} </style>
<div class="demo"> <p><img data-lazy="http://temp.im/800x600/" ></p> <p><img data-lazy="http://temp.im/801x600/" ></p> <p><img data-lazy="http://temp.im/802x600/" ></p> <p><img data-lazy="http://temp.im/803x600/" ></p> <p><img data-lazy="http://temp.im/804x600/" ></p> <p><img data-lazy="http://temp.im/805x600/" ></p> <p><img data-lazy="http://temp.im/806x600/" ></p> <p><img data-lazy="http://temp.im/807x600/" ></p> <p><img data-lazy="http://temp.im/808x600/" ></p> <p><img data-lazy="http://temp.im/809x600/" ></p> <p><img data-lazy="http://temp.im/810x600/" ></p> <p><img data-lazy="http://temp.im/811x600/" ></p> <p><img data-lazy="http://temp.im/812x600/" ></p> <p><img data-lazy="http://temp.im/813x600/" ></p> <p><img data-lazy="http://temp.im/814x600/" ></p> <p><img data-lazy="http://temp.im/815x600/" ></p> <p><img data-lazy="http://temp.im/816x600/" ></p> <p><img data-lazy="http://temp.im/817x600/" ></p> <p><img data-lazy="http://temp.im/818x600/" ></p> <p><img data-lazy="http://temp.im/819x600/" ></p> <p><img data-lazy="http://temp.im/820x600/" ></p> <p><img data-lazy="http://temp.im/821x600/" ></p> <p><img data-lazy="http://temp.im/822x600/" ></p> <p><img data-lazy="http://temp.im/823x600/" ></p> <p><img data-lazy="http://temp.im/824x600/" ></p> <p><img data-lazy="http://temp.im/825x600/" ></p> <p><img data-lazy="http://temp.im/826x600/" ></p> <p><img data-lazy="http://temp.im/827x600/" ></p> <p><img data-lazy="http://temp.im/828x600/" ></p> <p><img data-lazy="http://temp.im/829x600/" ></p> <p><img data-lazy="http://temp.im/830x600/" ></p> <p><img data-lazy="http://temp.im/831x600/" ></p> <p><img data-lazy="http://temp.im/832x600/" ></p> <p><img data-lazy="http://temp.im/833x600/" ></p> <p><img data-lazy="http://temp.im/834x600/" ></p> <p data-lazy="http://temp.im/835x600/"> element </p> </div>
//js
require('lazyload');
$('.demo').lazyload();
跑马灯插件(横竖方向的匀速循环滚动)
direction | 滚动方向,可选"left/top",默认"top" |
---|---|
duration | 单次滚动时长,单位ms,默认5000 |
pauseOnHover | 悬停暂停,默认true |
<style> .marquee{height:150px;border:1px solid blue;} .marquee2{width:150px;border:1px solid red;} </style>
<div class='marquee'> <p> cont1 </p> <p> cont2 </p> <p> cont3 </p> <p> cont4 </p> <p> cont5 </p> <p> cont6 </p> <p> cont7 </p> <p> cont8 </p> <p> cont9 </p> </div> <div class='marquee2'> 这是一段测试文字这是一段测试文字这是一段测试文字这是一段测试文字!! </div>
require.async('marquee',function(){
$('.marquee').marquee();
$('.marquee2').marquee({
direction:'left'
});
});
瀑布流插件,封装自masonry
<style> /*css*/ .item { width: 200px; margin:10px;} </style>
<!--html--> <ul id="container"> <li class="item"> <img src="http://temp.im/200x100/"> </li> <li class="item"> <img src="http://temp.im/200x400/"> </li> <li class="item"> <img src="http://temp.im/200x300/"> </li> <li class="item"> <img src="http://temp.im/200x600/"> </li> <li class="item"> <img src="http://temp.im/200x100/"> </li> <li class="item"> <img src="http://temp.im/200x400/"> </li> <li class="item"> <img src="http://temp.im/200x300/"> </li> <li class="item"> <img src="http://temp.im/200x600/"> </li> </ul>
require('masonry');
require('img-loaded');
var $container = $('#container'),win=$(window),loaded = true;
//应用瀑布流
$container.imagesLoaded(function(){
$container.masonry({
itemSelector: '.item'
})
});
//滚动加载
win.scroll(function scrollHandler(){
if(loaded){
var t=win.scrollTop(),
h=win.height(),
t1= $container.offset().top,
h1 =$container.outerHeight(true);
if(t+h >= t1+h1){
addItem(3);
}
}
});
//模拟动态加载数据
function addItem(n) {
loaded = false;
var fragment = '<li class="item">\
<img src="http://temp.im/200x100/">\
</li>\
<li class="item">\
<img src="http://temp.im/200x400/">\
</li>\
<li class="item">\
<img src="http://temp.im/200x300/">\
</li>';
for ( var i = 0; i < n; i++ ) {
fragment+=fragment;
};
$container.append($(fragment)).imagesLoaded(function(){
$container.masonry("reload");
loaded = true;
});
};
为页面和功能提供导航的菜单列表,常用于网站顶部和左侧。返回Menu
方法,语法:Menu(config)
,或者使用jquery插件语法:$el.menu(config)
el | 默认null ,制定触发元素,直接调用方法必填,jquery插件调用时可忽略,默认应用$(this) |
---|---|
data | 默认无,菜单数据,必填 |
key | 默认无,菜单项的唯一标识,必填 |
mode | 默认"horizontal" ,菜单类型,可选值为 horizontal | vertical |
theme | 默认"primary" ,主题,可选值为 light、dark、primary |
subicon | 默认"" ,多重菜单标题右侧指示图标 |
actived | 默认无,当前激活的菜单项key 值 |
opened | 默认[] ,当前打开的菜单项key 值组成的数组,horizontal模式只打开第一个 |
toggle | 默认true ,是否显示切换效果,只对vertical模式有效 |
onSelect | 菜单切换时触发回调,@param(object, $item) : 当前数据对象,当前Dom对象 |
onClick | 菜单点击回调,@param(object, $item, isCurrent) : 当前数据对象,当前Dom对象,是否已选中 |
open(key) | 打开指定key 值的项 |
---|---|
active(key) | 激活指定key 值的项 |
<div class="wrap">
<nav id="menu"></nav>
<div class="btn btn-default menu-open">打开子菜单</div>
<div class="btn btn-default menu-active">激活第三项</div>
</div>
var Menu = require('menu');
var mymenu = Menu({
el:'#menu',
//theme: 'dark',
data: [
{
item: '<i class="ion"></i>首页',
id: 1
},{
item: '订单',
id: 2
},{
item: '会员',
id: 3,
sub:[
{
item: '会员统计',
id: 30
},{
item: '会员群发',
id: 31
},{
item: '会员管理',
id: 32
}
]
},{
item: '店铺',
id: 4
},{
item: '系统',
id: 5
}
],
key: 'id',
actived: 1,
toggle: false,
onSelect: function(object, item){
console.log(object, item);
}
});
$('.menu-open').on('click', function(){
mymenu.open(3);
});
$('.menu-active').on('click', function(){
mymenu.active(4);
});
自定义鼠标右键,支持菜单内分组,调用格式为 $target.mousemenu( data, option )
name | 将作为菜单id的后缀,以区别多组菜单,只有一组可省略 |
---|---|
offsetX | 默认2,单位px,菜单左上角距点击位置横向距离 |
offsetY | 默认2,单位px,菜单左上角距点击位置纵向距离 |
textLimit | 默认6,菜单项显示文字个数,超出显示省略号 |
beforeShow | 菜单显示前回调 |
afterShow | 菜单显示后回调 |
broke | 用于点击时做条件判断,返回真值将阻止本次弹出 |
<style> /*css*/ .demo{height: 400px;border:1px solid #ccc;line-height: 400px;text-align: center;} </style>
<!-- html --> <div class="demo">测试区域</div>
require('mousemenu');
$('.demo').mousemenu(
[
[{
text: "组1-1",
func: function() {
alert("组1-1");
}
}, {
text: "组1-2",
func: function() {
alert("组1-2");
}
}],
[{
text: "组2-1",
func: function() {
alert("组2-1");
}
}, {
text: "组2-2",
func: function() {
alert("组2-2");
}
}]
], {
//配置
}
);
按键监听
<!-- html -->
<div class="demo">
<p>单按键:按"a"或"?"或"esc"</p>
<p>功能键:按"ctrl+shift+k"</p>
<p>多组按键绑定同一个事件:按"command k" 或者 "control k"</p>
<p>组合键:试试"up up down down left right left right b a enter"</p>
</div>
//js
require.async('mousetrap',function(){
// 单按键
Mousetrap.bind('a', function() {
alert('a');
});
Mousetrap.bind("?", function() {
alert('show shortcuts!');
});
Mousetrap.bind('esc', function() {
//阻止浏览器默认事件
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
alert('退出?');
}, 'keyup');
// 功能键
Mousetrap.bind('ctrl+shift+k', function() {
alert('command shift k');
});
// 多组按键绑定相同事件
Mousetrap.bind(['command+k', 'ctrl+k'], function() {
alert('command k 或者 control k');
return false; //取消系统默认事件
});
// 组合键
Mousetrap.bind('up up down down left right left right b a enter', function() {
alert("哇咔咔!");
});
});
鼠标滚轮监听,回调函数的event包含三个属性:deltaX,deltaY,deltaFactor;分别代表横向滚动方向,纵向滚动方向,滚动长度(不同浏览器下该值不一致)
<style> /*css*/ .demo,.control{height: 200px;overflow: auto;border:1px solid #ccc;margin:10px;} </style>
<!-- html --> <div class="demo"> 滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br> 滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br> 滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br> 滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br> 滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br> 滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br> 滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br>滚动测试<br> </div> <div class="control"></div>
//js
require('mousewheel');
//开始监听
$('.demo').on('mousewheel', function(event) {
$('.control').append('<p>'+event.deltaX+', '+event.deltaY+', '+event.deltaFactor+'</p>');
});
//停止监听
setTimeout(function(){
$('.demo').unmousewheel();
$('.control').text('监听事件已卸载!');
},5e3)
在界面右上角显示可关闭的全局通知,常用于以下场景:通知内容带有描述信息、系统主动推送。返回Notice方法
title |
默认"" ,通知提醒的标题
|
---|---|
desc |
默认"" ,通知提醒的内容,为空或不填时,自动应用仅标题模式下的样式
|
color |
默认"primary" ,主题色,支持【颜色】组件中所有的颜色
|
delay |
默认0 ,自动关闭的延时,单位毫秒
|
onClose | 默认无,关闭时的回调 |
obj.hide() | 关闭当前notice实例 |
---|
<div class="wrap">
<div class="btn btn-primary open">打开notice</div>
</div>
var Notice = require('notice');
var colors = ['primary', 'success', 'info', 'warning', 'danger'];
var count = 0;
$('.open').on('click',function(){
Notice({
title: '这是标题' + parseInt(Math.random() * 1e6),
desc: '这里是描述',
color: colors[count],
delay: 3000
});
count++;
if(count===colors.length){
count = 0;
}
});
侧边伸缩导航菜单插件,多用于移动端导航,导航必须具有id属性,与导航控制按钮的href属性相同。
{ onClick:{ close:true}}
position | 默认 "left" ,菜单位置,可选 top || right || bottom |
---|---|
zposition | 默认 "front" ,菜单层次,可选 next |
slidingSubmenus | 默认横向(true ),菜单展开方向,true || false |
isMenu | 默认 true ,是否按导航结构初始化,自定义结构和样式需要设为false |
classes | 默认 "mm-black" ,主题class, 可选 mm-light || mm-white |
<nav class="demo hide" id="menu">
<ul>
<li><a href="/1">导航</a> </li>
<li><a href="/2">导航2</a>
<ul>
<li><a href="/#2">二级</a></li>
<li><a href="/#2">二级</a></li>
<li><a href="/#2">二级</a></li>
</ul>
</li>
<li><a href="/3">导航3</a>
<ul>
<li><a href="/#2">二级</a></li>
<li><a href="/#2">二级</a></li>
<li><a href="/#2">二级</a></li>
</ul>
</li>
<li><a href="/4">导航4</a>
<ul>
<li><a href="/#2">二级</a></li>
<li><a href="/#2">二级</a></li>
<li><a href="/#2">二级</a></li>
</ul>
</li>
</ul>
</nav>
<a href="#menu" class="btn btn-default mobile_key">导航控制按钮</a> <!--导航控制按钮-->
//js
require('offcanvas');
$('.demo').offcanvas();
监听指定元素随页面滚动出现在视野中的事件,返回onScroll
方法,语法:onScroll(config)
,或者使用jquery插件语法:$el.onScroll(config);
可用于长页面懒加载;当指定元素为多个时,还可以关联定位(target)元素,实现滚动导航;当target元素向上滚出视野时,将为target元素或指定的targetFix元素添加fixed
类,用于实现固定在页面顶部效果。
el | 默认无,监听元素选择器,直接调用方法必填,jquery插件调用时可忽略,默认应用$(this) |
---|---|
offset | 可选,顶部位置计算偏移量,默认0 |
target | 可选,绑定目标,jquery选择器格式,默认无 |
targetCell | 可选,绑定目标子元素类型,默认'li' |
targetFix | 可选,设置将添加fixed类的元素,通常是target的外层 |
speed | 可选,滚动动画时间,单位ms,默认300 |
onshow | 可选,元素第一次出现在视野的回调,默认无 |
ontop | 可选,当配置了target时,元素第一次与target距离为offset时触发,默认无 |
<!-- html -->
<style>
.target_wrap {
height: 42px;
}
.demo_Target {
width: 980px;
margin: 0 auto;
overflow: hidden;
*zoom: 1;
background: #fff;
border-left: 1px solid #eee;
}
.demo_Target li {
float: left;
height: 40px;
line-height: 40px;
border: 1px solid #eee;
margin-left: -1px;
width: 33%;
text-align: center;
cursor: pointer;
}
.demo_Target.fixed {
position: fixed;
left: 50%;
margin-left: -490px;
top: 0;
z-index: 99;
}
.demo_Target .active {
color: #39f;
background: #eee;
}
.demo_sections {
width: 978px;
border: 1px solid #ccc;
padding: 2em 0;
margin: 2em auto;
height: 800px;
}
.lazyPush {
height: 400px;
}
</style>
<div class="target_wrap">
<ul class="demo_Target">
<li>channel01</li>
<li>channel02</li>
<li>channel03</li>
</ul>
</div>
<div class="demo_sections">
anything...1
<textarea class="hide">
<img src="http://temp.im/500x400/">
</textarea>
</div>
<div class="demo_sections">
anything...2
<textarea class="hide">
<img src="http://temp.im/500x400/">
</textarea>
</div>
<div class="demo_sections">
anything...3
<textarea class="hide">
<img src="http://temp.im/500x400/">
</textarea>
</div>
var responsive = require('responsive');
require('on-scroll');
$('.demo_sections').onScroll({
offset: 42,
target: '.demo_Target',
onshow: function(elem, index) {
responsive.topush(elem, function() {
console.log('元素' + index + '懒加载完成');
});
},
ontop: function(elem, index){
console.log('ele' + index + '就位');
}
});
按指定配置生成分页组件,返回Page
方法,语法:Page(config)
,或者使用jquery插件语法:$el.page(config);
el | 默认无,必填,分页展示容器,jquery选择器格式,直接调用方法必填,jquery插件调用时可忽略,默认应用$(this) |
---|---|
current | 默认1 ,当前页码 |
showNum | 默认5 ,显示页数 |
total | 默认无,必填,总页数 |
holder | 默认'...' ,翻篇占位符 |
hook | 默认无,自定义样式钩子 |
onChange | 默认无,页码改变回调,参数接收点击页码 |
size | 默认'normal' ,内置尺寸,可选'sm / lg' |
auto | 默认true ,是否自动渲染当前状态 |
set(obj) | 更改显示状态,obj只接受三个属性:current,total,pageSize |
---|
<div class="wrap">
<div class="demo"></div>
<div class="btn btn-primary set1">设置页码为1</div>
</div>
var page = require('page');
var pageObj = page({
el: '.demo',
total: 10,
onChange: function(page) {
console.log(page);
}
});
$('.set1').on('click', function() {
console.log(pageObj)
pageObj.set({
current: 1
});
});
自动生成分页参数的请求方法,调用后返回当前分页加载实例,约定异步数据格式为json,必须包含data
和count
字段,分别代表每页数据和数据总条数。
method | 默认"get" ,请求方法 |
---|---|
url | 默认无,必填,分页请求地址 |
size | 默认6 ,每页条数,服务端将接收到此参数的实际key为"page_size" |
data | 默认{} ,请求参数,不得包含"page_index"和"page_size"键 |
success | ajax成功回调 |
nomore | 没有更多回调 |
error | ajax错误回调 |
load([callback]) |
加载新的一页,参数中将包含从 |
---|---|
reload([hold], [data], [callback]) |
将当前实例的页码重置为初始值。若hold为真值只重置不请求,若data为对象格式将合并到当前参数中。 |
destroy() |
销毁当前实例 |
<div class="m">打开控制台查看网络请求</div>
<div class="btn btn-default pagingLoad">分页加载</div>
<div class="btn btn-default reload">分页重新加载</div>
<div class="btn btn-default destroy">销毁分页加载实例</div>
var pagingLoad = require('paging-load');
var myload = pagingLoad({
url: 'http://rap.taobao.org/mockjsdata/1101/core/citylist/',
data: {
"method": "test"
},
success: function(data) {
console.log(data);
}
});
$('.pagingLoad').on('click', function() {
myload.load();
});
$('.reload').on('click', function(){
myload.reload();
});
$('.destroy').on('click', function(){
myload.destroy();
});
展示操作或任务的当前进度,比如上传文件。
el |
默认 |
---|---|
persent |
默认 |
color |
默认 |
active |
默认 |
height |
默认 |
showInfo |
默认 |
infoRender |
进度信息渲染方法,param(persent, entity) : 当前进度值,当前实例方法。 默认:
|
persent([value]) | 设置/获取当前进度 |
---|---|
color([value]) | 设置/获取当前实例色调 |
active([value]) | 设置/获取当前实例激活状态 |
destroy() | 销毁实例 |
<div class="wrap">
<div class="row">
<div class="span-6 m-tb demo"></div>
</div>
<div class="btn btn-default add">+</div>
<div class="btn btn-default min">-</div>
<div class="btn btn-default toggle">切换激活状态</div>
</div>
require('progress');
var myprog = $('.demo').progress({
persent: 50,
infoRender: function(persent, entity){
if(persent===100){
entity.color('success');
return '<i class="ion"></i>成功';
}else{
entity.color('info');
return persent + '%';
}
}
});
$('.add').on('click', function(){
myprog.persent(myprog.persent() + 10);
});
$('.min').on('click', function(){
myprog.persent(myprog.persent() - 10);
});
$('.toggle').on('click', function(){
myprog.active(!myprog.active());
});
生成二维码,封装自davidshimjs/qrcodejs。
<style> #qr_container{position: fixed;right:10px;bottom:10px;text-align: center;} </style>
<div id="qr_container"> 微信扫描查看或分享 </div>
//js
var qr = require('qr');
var qrcode = new qr(document.getElementById("qr_container"), {
text: "http://www.jerei.com", // 生成内容
width: 128, // 宽
height: 128, // 高
colorDark : "#000000", // 颜色
colorLight : "#ffffff", // 背景色
correctLevel : qr.CorrectLevel.H // 容错级别 L|M|Q|H
});
//qrcode.clear(); // clear the code.
//qrcode.makeCode("http://naver.com"); // make another code.
响应式工具包,包含想响应式所需的js功能
getType([callback]) |
获取当前设备类型,回调函数可选,当无回调时返回字符串('Pc','Pad','Mobile'),有回调时回调接受返回字符串为参数:
|
getOrient([callback]) |
获取移动设备屏幕方向,回调函数可选,当无回调时返回字符串('Heng','Shu'),有回调时回调函数将持续监听屏幕方向变化,并接受屏幕方向为参数:
|
resImg(bigSrc, [filter]) |
全局图片响应方法 图片的src将在手机端显示,bigSrc参数指定存放大图的自定义属性,可省,默认"data-src","data-src"图片地址将在pc和pad端显示。 filter参数传入响应图片的范围,可省,默认检索整个页面。
|
topush(DOM,callback) |
加载后的dom会添加 示例:
|
scanpush() |
预置的四个按需渲染类是: 并且这四个类元素下的 示例:
|
创建一个数据->模板
的单项绑定渲染器,返回Render
方法,语法var myRender = Render(confg)
。
依赖etpl模块
el |
默认 |
template |
默认 |
data |
默认 |
reload |
默认 |
etplConfig |
默认 |
callback(targetElement, renderData) |
默认 |
set(config) |
修改渲染器配置,通产用来修改reload模式和callback回调 |
data([setData]) |
为渲染器赋值/取值,使用新数据渲染的结果将同步到容器元素 |
push(node, arrayData) |
向node节点下的数组插入arrayData数据,如果node节点不存在或格式不是数组,将先设置为空数组。使用新数据渲染的结果将同步到容器元素 |
destroy() |
销毁示例移除容器元素 |
<div class="p" id="wrap">
<textarea style="display: none" template>
render result: ${time}
</textarea>
</div>
<div class="p">
<div class="btn btn-default setIntval">暂停/恢复</div>
<div class="btn btn-default setReload">重载/填充</div>
<div class="btn btn-default destroy">销毁</div>
</div>
var render = require('render');
var myRender = render({
el: '#wrap',
reload: reload,
callback: function($el, html) {
console.log(html);
}
});
var reload = true;
var int = setInterval(function() {
myRender.data({
time: new Date()
});
}, 1000);
$('.setIntval').on('click', function() {
if (int) {
int = clearInterval(int);
} else {
int = setInterval(function() {
myRender.data({
time: new Date()
});
}, 1000)
}
});
$('.setReload').on('click', function(){
reload = !reload;
myRender.set({
reload: reload
});
});
$('.destroy').on('click', function(){
myRender.destroy();
});
滚动条美化插件,支持横向和纵向、滚动条自动隐藏、样式自定义。
内容元素不能有可向上传导的margin-top属性,否则会干扰滚动定位。
wrap | 包裹元素,默认不指定,将插入div.scroll_cont |
---|---|
monitor | 否监听内容变化(用于多插件协作),布尔值,默认false |
keyway | 按钮键程,默认30(px) |
width | 滚动条宽度,默认8(px) |
btnLength | 按钮长度,默认0(不显示按钮) |
btnBreadth | 按钮宽度,默认与滚动条同宽 |
sliderWidth | 滑块宽度,默认与滚动条同宽 |
hideBar | 自动隐藏滚动条,鼠标进入显示,默认false |
ontop | 滚动到顶部触发的回调,默认无 |
onend | 滚动到底部触发的回调,默认无 |
<style> /*css*/ .demo{position:relative;overflow:hidden;height:320px;max-width: 480px;margin:10px auto;} .demo .scroll_cont{background: yellow;} .demo .scroll_cont img{max-width: none;} </style>
<!--html--> <div class="demo demo1"> <img src="http://temp.im/480x480/"><br/> content conten ontentcontent1<br/> content7<br/> content conten ontentcontent1<br/> content7<br/> </div> <div class="demo demo2"> <img src="http://temp.im/900x320/"><br/> </div>
//js
require('scroll-bar');
$('.demo1').scrollBar();
$('.demo2').scrollBar({
overflow: "x"
});
横向滚动,支持触屏和半响应; 需指定滚动元素宽度和效果容器高度。
内置hero
模式,用于全屏轮显焦点图,三张居中轮显。通常该模式的样式为.demo不设宽度(即全屏宽度),.demo li普通banner宽度(如980px);
内置unloop
模式,不循环滚动,用于做大事记类的时间轴效果;
direct | 自动播放方向,可选left | right |
---|---|
mode | 模式,默认无,可选 hero(全屏三图滚动) | unloop(不循环) |
num | 滚动个数,默认99,即能显示几个显示几个 |
auto | 默认true,自动播放 |
interval | 默认5000,单位ms,自动播放间隔 |
duration | 默认640,单位ms,单次滚动持续时长 |
animate | 默认‘swing’,滚动效果,来自jquery.easing |
step | 默认1,每次滚动个数 |
wrap | 默认‘ul’,指定滚动包裹元素 |
cell | 默认‘li’,指定滚动元素 |
prev | 指定向左按钮,默认无,将自动插入 '.arrs .arr_prev'元素 |
next | 指定向右按钮,默认无,将自动插入 '.arrs .arr_next'元素 |
handletouch | 默认false,是否劫持触屏事件 |
callback | 回调 @param (nowStep) |
ext | 扩展 @param (this, showNumber, allStep) |
<style> .demo {height: 10em; width:32em; display:none;margin-bottom:2em;} .demo li {width:10em; background:yellow;} .demo .arrs{position: absolute; top:50%; width:2em;height: 2em;background: yellow;margin-top: -1em;} .demo .arr_prev{left:0;} .demo .arr_next{right:0;} .demo .scroll_nav{position:absolute;left:0;top:0;} .demo .scroll_nav .on{color:#39f;} </style>
<h4>普通模式</h4> <div class="demo"> <ul> <li><img src="http://temp.im/300x301/" /></li> <li><img src="http://temp.im/300x302/" /></li> <li><img src="http://temp.im/300x303/" /></li> <li><img src="http://temp.im/300x304/" /></li> <li><img src="http://temp.im/300x305/" /></li> </ul> </div>
<style> .demo-hero { display:none;} .demo-hero li {width:980px; background:yellow;} .demo-hero .arrs{position: absolute; top:50%; width:2em;height: 2em;background: yellow;margin-top: -1em;} .demo-hero .arr_prev{left:0;} .demo-hero .arr_next{right:0;} </style>
<h4>hero模式</h4> <div class="demo-hero"> <ul> <li><img src="http://temp.im/980x301/" /></li> <li><img src="http://temp.im/980x302/" /></li> <li><img src="http://temp.im/980x303/" /></li> <li><img src="http://temp.im/980x304/" /></li> <li><img src="http://temp.im/980x305/" /></li> </ul> </div> <span class="button myback">back</span><span class="button myforward">forward</span>
//js
require('scroll-col');
$('.demo').scrollCol();
$('.demo-hero').scrollCol({
mode: 'hero',
prev: '.myback',
next: '.myforward'
});
监听元素滚动到底部事件,返回scrollLoad
方法,语法scrollLoad(config)
,或使用jQuery语法格式$el.scrollLoad(config)
el | 默认null ,要监听的元素,使用jQuery语法可省略 |
---|---|
distance | 默认70 ,距离底部开始加载的距离,单位px |
callback(scrollStop) | 默认无,滚动到底部回调,参数接收终止加载方法,需手动调用 |
force | 默认false ,当对同一个元素多次调用时,可以卸载并重新绑定滚动监听 |
loadingTemplate | 默认'<div class="scrollLoadSpinning"><span class="_spin"></span></div>' ,加载条html |
重复绑定或不合法配置将返回null
。
destroy | 销毁监听实例 |
---|
<div class="cont" style="width:200px;height: 200px; line-height:2;border:1px solid #ccc;overflow: auto;"></div>
var testdata = '<p>test data</p>',
cont = $('.cont'),
getData = function(length){
var i = 0,
len = length || 10,
r = '';
for(; i<len; i++){
r += testdata;
}
return r;
};
cont.html(getData());
require.async('scroll-load',function(){
cont.scrollLoad({
callback:function(scrollStop){
setTimeout(function(){
cont.append(getData());
scrollStop(); //加载完成后执行scrollStop方法,终止加载状态
},1000);
}
});
});
垂直方向整行滚动。可以处理多列情况,默认添加内部按钮, 如果需要外部按钮可以指定自行添加的按钮。
prev | 指定向上箭头,默认无,将添加 '.arrs .arr_prev' |
---|---|
next | 指定向下箭头,默认无,将添加 '.arrs .arr_next' |
wrap | 默认ul,指定包裹元素 |
cell | 默认li,指定列表元素 |
line | 滚动行数 |
duration | 滚动时长,默认460,单位ms |
animate | 默认'swing',动画曲线,来自jquery.easing |
auto | 默认true,自动滚动 |
pause | 默认true,自动滚动时是否悬浮暂停 |
interval | 自动播放间隔,默认5000,单位ms |
callback | 滚动回调,@param (nowRow) :当前所在页数 |
ext | 扩展方法,@param (totalRow) :总页数 |
<style> .demo { position: relative; width: 320px; height: 22em; overflow: hidden; } .demo li{ height: 10em; overflow: hidden; margin-bottom:1em; background:yellow; } .demo .arrs{position: absolute; right:0; width:1.5em;height: 1.5em;background: grey;} .demo .arr_prev{top:0;} .demo .arr_next{top:2em;} </style>
<div class="demo"> <ul class="row"> <li class="span-4 midd-6 smal-12"><img src="http://temp.im/300x300/" /></li> <li class="span-4 midd-6 smal-12"><img src="http://temp.im/400x400/" /></li> <li class="span-4 midd-6 smal-12"><img src="http://temp.im/500x500/" /></li> <li class="span-4 midd-6 smal-12"><img src="http://temp.im/300x300/" /></li> <li class="span-4 midd-6 smal-12"><img src="http://temp.im/400x400/" /></li> <li class="span-4 midd-6 smal-12"><img src="http://temp.im/500x500/" /></li> <li class="span-4 midd-6 smal-12"><img src="http://temp.im/300x300/" /></li> <li class="span-4 midd-6 smal-12"><img src="http://temp.im/400x400/" /></li> <li class="span-4 midd-6 smal-12"><img src="http://temp.im/500x500/" /></li> </ul> </div> <div class="myprev">prev</div> <div class="mynext">next</div>
//js
require('scroll-row');
$('.demo').scrollRow({
prev:'.myprev',
next:'.mynext'
})
下拉框插件,使用模拟的增强下拉选择器来代替浏览器原生的选择器。 选择器支持单选、多选、搜索,以及键盘快捷操作。
返回Select
方法,语法Select(config)
,或使用jquery插件语法$el.select(config)
data | 默认无,将优先使用数据初始化select元素,数据格式见示例 |
---|---|
posi | 默认"bottom",下拉方向,可选"top"和"auto","auto"会计算下拉框距离屏幕上下两端的尺寸,向空间大的一边展开。 |
hideSelected | 默认false,是否隐藏已经选中的项 |
hideDisabled | 默认true,是否隐藏不可用的项 |
act | 默认"click",下拉触发动作,可选 "mouseenter" |
filterable | 默认false,是否支持搜索 |
domsafe | 默认false,若为true将不更新原始select标签的值 |
hook | 默认'',自定义样式钩子 |
name | 默认'select',当基于非select 标签创建实例时,指定生成的select 标签name |
disabled | 默认false,是否禁用 |
readonly | 默认false,是否只读 |
multi | 默认false,是否可以多选 |
onChange(value,text) | 选中回调,参数接收最新的value和text |
format(textArray) | 级联选择文字显示格式,默认return textArray.join(' / '); |
所返回的操作句柄包含以下方法:
update([data]) | 用于更新实例数据,参数接收数组类型数据,没有参数将从DOM节点中收集数据 |
---|---|
disabled([flag]) | 禁用实例,若flag为真值将解禁 |
readonly([flag]) | 只读实例,若flag为真值将恢复可写 |
destroy() | 销毁实例 |
clear() | 清空输入 |
reset([flag]) | 恢复实例为初始值,若flag为真值将不触发onChange事件 |
text([setValue]) | 读取/设置实例显示值 |
val([setValue]) | 读取/设置实例值,多选情况下赋值支持数组和字符串两种格式,字符串多个值用, 隔开 |
<style>
.demo, button{display: block; width: 200px; margin:10px;}
</style>
<form id="test" >
<!-- 基于select初始化 -->
<select class="demo demo-fromdom" name="select1" >
<option disabled>--请选择--</option>
<option value="1">山东</option>
<option value="2">山西</option>
<option value="3">河南</option>
</select>
<!-- 使用数据初始化 -->
<select class="demo demo-fromdata" name="select2">
<option disabled>--请选择--</option>
</select>
<!-- 基于非select初始化 -->
<div class="demo demo-insert"> </div>
<div class="demo demo-cascader"> </div>
<button class="btn btn-default set1" type="button">切换select1禁用状态</button>
<button class="btn btn-default set2" type="button">更新select2数据</button>
<button class="btn btn-default set4" type="button">设置select4的值</button>
<button class="btn btn-default" type="submit">提交</button>
</form>
var Select = require('select');
var dataAjax = [{
"option": "济南",
"value": "jinan"
}, {
"option": "烟台",
"value": "yantai",
"selected": true
}, {
"option": "青岛",
"value": "qingdao"
}];
var select1 = $('.demo-fromdom').select({
val: [1, 2],
multi: true,
onChange: function(value, text) {
console.log('select1值更新为', value);
}
});
var select2 = $('.demo-fromdata').select({
onChange: function(val, txt) {
console.log('select2选中了' + txt);
}
});
var select3 = $('.demo-insert').select({
filterable: true,
data: dataAjax,
onChange: function(val, txt) {
console.log('select3选中了' + txt);
}
});
var select4 = Select({
el:'.demo-cascader',
data: [{
"option": "山东",
"value": "shandong",
"children": [{
"option": "济南",
"value": "jinan"
}, {
"option": "烟台",
"value": "yantai",
"children": [{
"option": '莱山',
"value": 'laishan'
}, {
"option": '芝罘',
"value": 'zhifu'
}, {
"option": '开发区',
"value": 'kaifaqu'
}, {
"option": '福山',
"value": 'fushan'
}, {
"option": '牟平',
"value": 'muping'
}]
}, {
"option": "青岛",
"value": "qingdao",
"children": [{
"option": '崂山',
"value": 'laoshan'
}, {
"option": '四方',
"value": 'sifang'
}]
}]
},{
"option": "江苏",
"value": "jiangsu",
"children": [{
"option": "浙江",
"value": "zhejiang"
},{
"option": "杭州",
"value": "hangzhou"
},{
"option": "南京",
"value": "nanjing"
}]
}],
onChange: function(value, text) {
console.log(value, text);
}
});
//提交测试
$('#test').on('submit', function(e) {
e.preventDefault();
alert($(this).serialize());
});
//set1
var disabled = false;
$('.set1').on('click', function() {
disabled = !disabled;
select1.disabled(!disabled);
});
//set2
$('.set2').on('click', function() {
select2.update([{
"option": "济南",
"value": "jinan"
}, {
"option": "烟台",
"value": "yantai",
"selected": true
}, {
"option": "青岛",
"value": "qingdao"
}]);
});
$('.set4').on('click', function() {
select4.val('shandong,qingdao,sifang');
});
封装带倒计时的短信验证码功能
mobile | 字符型,要发送的号码,额外支持jquery选择器和函数类型,选择器用于获取input元素,函数用于返回手机号字符串 |
---|---|
url | 验证码请求地址 |
keyName | 手机号在请求参数中的key,默认"mobile" |
data | 请求附加数据,默认{} |
time | 倒计时时间,默认60,单位s |
sendBefore | 发送前回调,参数接收手机号,可用于发送前对手机号做校验,返回真值继续,返回假值进入error回调 |
sendAfter | 发送成功回调 |
error | 错误回调,接收错误信息为参数 |
renderTarget | 默认无,倒计时渲染对象,默认当前元素 |
render | 倒计时渲染方法 |
reSendText | 默认"重发验证码",重发验证码的提示文字 |
<a href="###" class="btn btn-default" id="btn">sendcode</a>
require('sendcode');
$('#btn').sendcode({
mobile: '156555555',
time: 10,
render: function(sec) {
return sec + 's';
},
url: "http://rap.taobao.org/mockjsdata/9195/common/getYes/",
sendBefore: function(mobile) {
alert('sendBefore:mobile is ' + mobile);
return true;
},
sendAfter: function() {
alert('sendAfter callback');
}
});
幻灯片效果,支持触屏操作,支持基于数据创建,支持PC端图片按需加载(不可与响应式图片同时使用)。返回Slide
方法,语法:Slide(config)
,或者使用jquery插件语法:$el.slide(config)
display:none
且不绑定事件,使用时需先在样式中显示;custom
属性:<div class="my_navs" custom> 自己写a标签... </div>
el | 默认null ,容器元素,直接调用方法必填,jquery插件调用时可忽略,默认应用$(this) |
---|---|
data | 默认null ,幻灯片数据,优先级高于从Dom中查找,对象数组格式:
|
wrap | 默认"ul",不传data 时用来指定包裹元素 |
cell | 默认"li",不传data 时用来指定切换元素 |
effect | 切换效果,默认‘slide’,可选slide\fade |
direction | 默认"x",slide效果滚动方向,可选 x \ y |
animate | 默认"ease",css3动画曲线 |
duration | 默认300,切换动画时长(ms) |
start | 起始帧,默认0,即从第一张开始 |
auto | 默认true,自动播放 |
pause | 默认true,控制是否鼠标悬停时暂停播放,还可以传入选择器将作为暂停按钮,点击暂停,按钮将被添加'pause'类 |
interval | 默认5000,自动播放间隔(ms) |
act | 默认‘click’,导航按钮触发事件 mouseenter | click |
prevHtml | 左箭头html |
nextHtml | 右箭头html |
prev | 指定左箭头,不指定将自动插入'.arrs .arr_prev'元素 |
next | 指定右箭头,不指定将自动插入'.arrs .arr_next'元素 |
navs | 指定自定义导航,不指定将自动添加'.slide_nav'元素或使用效果元素内已存在的".slide_nav"元素; |
lazyload | 默认true ,使用启用图片按需加载,基于数据创建将自动处理,基于DOM创建需要手动给图片添加data-src 属性存储图片地址 |
handletouch | 默认false,是否劫持触屏事件 |
onSlide | 幻灯片切换回调,@param (效果元素,切换元素,当前帧序号) |
onReady | 初始化完成回调,@param (效果元素,切换元素,总帧数) |
<style> .demo{max-width:1000px;margin:auto;height:0; overflow:hidden; padding-bottom:40%;} .demo li{background: yellow;} .demo img{width:100%; height:100%;} .demo .slide_nav{display:block; left: 0;bottom:0;} .demo .slide_nav a{float: left;width: 16px;height: 16px;overflow:hidden;background:#ccc;margin:6px;} .demo .slide_nav .on{background:#666;} </style>
<div class="demo"> <ul> <li><img src="http://static.refined-x.com/static/view0.jpg" /></li> <li><img src="http://static.refined-x.com/static/view1.jpg" /></li> <li><img src="http://static.refined-x.com/static/view2.jpg" /></li> <li><img src="http://static.refined-x.com/static/view3.jpg" /></li> <li><img src="http://static.refined-x.com/static/view4.jpg" /></li> </ul> </div>
//js
require('slide');
$('.demo').slide();
滑动输入器,用于在数值区间/自定义区间内进行选择,支持连续或离散值。返回Slider
方法,语法Slider(config)
,或使用jquery插件语法$el.slider(config)
el |
默认 |
---|---|
value |
默认 |
min |
默认 |
max |
默认 |
step |
默认 |
color |
默认 |
disabled |
默认 |
tip |
默认 |
tipRender |
默认 |
onChange |
默认 |
value([value]) |
设置/获取示例当前值 |
---|---|
disabled([flag]) |
禁用实例,若flag为真值将解禁 |
<div class="wrap">
<div class="row">
<div class="span-6 m-tb p demo"></div>
</div>
<div class="btn btn-default set">赋值</div>
<div class="btn btn-default get">取值</div>
<div class="btn btn-default toggle">禁用/解禁</div>
</div>
require('slider');
var myslider = $('.demo').slider({
value: 50,
onChange: function(value){
console.log('change to:' + value);
}
});
$('.set').on('click', function(){
myslider.value(parseInt(Math.random() * 100));
});
$('.get').on('click', function(){
console.log('get:' + myslider.value());
});
var cur = true;
$('.toggle').on('click', function(){
cur = !cur;
myslider.disabled(cur);
});
等待动画插件,返回Spin
方法,语法Spin(config)
,或使用jquery插件语法$el.Spin(config)
el |
默认 |
---|---|
icon |
默认 |
text |
默认 |
color |
默认无,可选【Color】组件中的颜色 |
size |
默认 |
hook |
默认无,可添加自定义样式名 |
iconRoate |
默认 |
timeout |
默认 |
hide |
关闭动画并销毁实例 |
---|
<div class="test m-lg p-lg pr"></div>
<div class="btn btn-default open">打开Spin</div>
<div class="btn btn-default close">关闭Spin</div>
require('spin');
var loading;
$('.open').on('click', function(){
loading = loading || $('.test').spin();
});
$('.close').on('click', function(){
loading && (loading = loading.hide());
});
页面级异步数据存取插件,返回Store
对象
init([config]) |
设置默认ajax参数,默认:
|
---|---|
add(object) |
添加预取数据对象,将继承默认ajax参数,格式:
|
clear([keyArray]) |
传入由key数组,将某(几)项数据从队列和存储中移除,不传keyArray将清空Store中的所有队列和存储 |
ready([keyArray], callback) |
确保某(几)项数据已经获取后执行回调方法,不传keyArray将获取队列所有数据 |
update([keyArray], [callback]) |
更新某(几)项数据,不传keyArray将更新队列所有数据,若传入callback函数,将在完成后执行 |
<div class="wrap">
<button class="btn btn-default add">add</button>
<button class="btn btn-default ready">ready(控制台查看输出)</button>
<button class="btn btn-default clear">clear</button>
<div id="log"></div>
</div>
var store = require('store');
//初始化配置
store.init({
url: 'http://rapapi.org/mockjsdata/9195/tree/getNode'
});
$('.add').on('click', function(){
var randomId = parseInt(Math.random() * 1e6);
store.add({
key: 'api-' + randomId,
data: {
hello: randomId
}
});
$('#log').append('<p>添加 api-' + randomId+'</p>');
});
$('.ready').on('click', function(){
store.ready(function(states) {
console.log('states ready: ', states);
});
});
$('.clear').on('click', function(){
store.clear();
$('#log').empty();
});
开关插件,返回Switcher
方法,语法Switcher(config)
,或使用jquery插件语法$el.switcher(config)
$('.flow-ui-switch')
元素将自动初始化,并且支持data-config属性
el |
默认 |
---|---|
name |
默认 |
value |
默认 |
round |
默认 |
color |
默认 |
disabled |
默认 |
size |
默认 |
onChange |
开关变化时触发回调方法,@param(value) : 当前的实例状态 |
value([value]) |
设置/获取实例当前值 |
---|---|
disabled([flag]) |
禁用实例,若flag为真值将解禁 |
<div class="wrap">
<div class="demo"></div>
<div class="btn btn-default seton">开启</div>
<div class="btn btn-default setoff">关闭</div>
<div class="btn btn-default get">获取当前值</div>
<div class="btn btn-default toggle">禁用/解禁</div>
</div>
require('switch');
var myswitch = $('.demo').switcher({
color:'primary',
onChange: function(value){
console.log('switch is ',value);
}
});
$('.seton').on('click', function(){
myswitch.value(true);
});
$('.setoff').on('click', function(){
myswitch.value(false);
});
$('.get').on('click', function(){
console.log(myswitch.value());
});
var cur = true;
$('.toggle').on('click', function(){
cur = !cur;
myswitch.disabled(cur);
});
选项卡切换组件,常用于平级区域大块内容的的收纳和展现。返回Tab
方法,语法Tab(config)
,或使用jquery插件语法:$el.tab(config)
支持基于标签创建和基于数据创建两种模式。
el |
默认 |
---|---|
conts |
默认 该元素的 |
data |
默认
{
|
active |
默认 |
act |
默认 |
throttle |
默认 |
extra |
默认无,选项卡标题栏右侧内容,支持DOM字符串或返回DOM的函数 |
beforeChange |
切换前事件,默认无。@param (index) : 当前帧序号 |
onChange |
切换回调方法,默认无。 @param (index) : 当前帧序号 |
onReady |
创建Tab实例后扩展方法,默认无。 @param ($this, opts) : 当前对象,配置 |
active([index]) |
设置/获取当前显示标签序号 |
---|---|
disabled(index, [boolean]) |
禁用序号为index的标签,当Boolean值为 |
setCont(index, cont) |
设置序号为index的标签内容 |
<div class="wrap">
<div class="tabs-1">
<div class="tab-cont" data-tab-title="选项卡一">
许多年过去了,人们说陈年旧事可以被埋葬,然而我终于明白这是错的,因为往事会自行爬上来。回首前尘,我意识到在过去二十六年里,自己始终在窥视着那荒芜的小径。
</div>
<div class="tab-cont" actived data-tab-title="选项卡二">
在你心里,最能代表“春天”的是什么呢? 是此刻窗外的猫叫。 是衬衫和短裤。 是“沾衣欲湿杏花雨,吹面不寒杨柳风”。 是家里每年春天,母亲亲手沏的那一壶新茶,温暖又缠绵。 也许是压抑不住的出行拍摄的冲动吧。
</div>
<div class="tab-cont" disabled data-tab-title="选项卡三">
一位真正的作家永远只为内心写作,只有内心才会真实地告诉他,他的自私、他的高尚是多么突出。内心让他真实地了解自己,一旦了解了自己也就了解了世界。
</div>
</div>
<div class="m">
<div class="btn btn-default setactive">激活2</div>
<div class="btn btn-default setdisabled">禁用/解禁3</div>
<div class="btn btn-default getactive">获取当前index</div>
</div>
</div>
require('tab');
var mytabs = $('.tabs-1').tab();
$('.setactive').on('click', function(){
mytabs.active(1);
});
var disabled = true;
$('.setdisabled').on('click', function(){
mytabs.disabled(2, disabled);
disabled = !disabled;
});
$('.getactive').on('click', function(){
console.log('actived: ' + mytabs.active());
});
数据表格,返回Table
方法,语法:Table(config)
,或使用jquery插件语法:$el.table(config)
主要用于展示大量结构化数据。支持排序、筛选、编辑等功能。
el |
默认 |
---|---|
data |
用于展示的结构化数据,数组格式,默认无 |
load |
ajax方式加载数据的配置:
{
|
column |
表格列的配置描述,详见下文 |
striped |
默认 |
bordered |
默认 |
condensed |
默认 |
hover |
默认 |
width | 表格宽度,单位 px,默认无,将自适应容器宽度 |
height | 表格高度,单位 px,设置后,如果表格内容大于此值,会固定表头 |
index |
默认 |
multi |
默认 |
noDataText |
默认 |
noFilterText |
默认 |
highlight |
默认 |
page |
默认 注意改配置不可用于异步数据翻页,异步数据翻页的例子见插件-数据表格 |
onSelect |
默认无,单选/多选结果变化回调方法。 @param(index, row, rowArray, [isSelect]) : 当前行数,当前行数据,所有选中行数据数组,是否选中(仅多选有此参数) |
onReady |
默认无,初始化完成回调方法。当使用异步数据时将接收ajax返回数据:@param(res) |
onLoad |
默认无,异步数据加载回调方法,接收ajax返回数据:@param(res) |
title |
列头显示文字,默认 |
---|---|
key |
对应列内容的字段名 |
render |
自定义列元素渲染方法,@param(value, row, index, entity) : 单元格数据,行数据,行数,行操作句柄。 |
width |
列宽,默认单元格均分,指定数值不得小于50 |
align |
对齐方式,默认 |
hook |
列的样式名称,默认无 |
ellipsis |
默认 |
editable |
默认 也可以传入一个方法,接收编辑结果相关数据 @param(rowIndex, key, value) : 原始数据行序号,列属性,新值 |
sort |
默认
{
|
filters |
默认无,过滤器对象数组。 过滤器对象:
{
|
validateMethod |
验证方法,接受单元格编辑后的值,验证通过需要明确 |
data([newData]) |
获取/设置表格数据 |
||||||||
---|---|---|---|---|---|---|---|---|---|
load(ajaxSet) |
重新ajax获取表格数据,参数:
{
|
||||||||
column([newColumn]) |
获取/设置表格列数据 |
||||||||
getPager |
返回分页实例,可以获得 |
||||||||
size([config]) |
设置/获取当前表格实例的宽和高; config对象接受"width"和"height"属性 |
||||||||
reload |
将表格重置为初始数据或重新加载远程数据 |
||||||||
getRows |
返回当前(分页)的所有行数据 |
||||||||
getSelected([prop]) |
返回当前所选行数据,允许传入过滤属性,不传将返回完整对象数组,@param([prop]) : 过滤属性 |
||||||||
scrollTo(index) |
滚动到当前(分页)第index行,index从0开始计数 |
||||||||
highlightRow(index) |
高亮第index条数据所在行,index从0开始计数 |
||||||||
selectAll |
全选当前(分页)所有行 |
||||||||
unselectAll |
全不选当前(分页)所有行 |
||||||||
selectRow(index) |
选择数据第index行,index从0开始计数 |
||||||||
unselectRow(index) |
取消选择数据第index行,index从0开始计数 |
||||||||
getEntity(index, key) |
获取第index条数据所在行且属性为key的单元格操作实例 实例具有以下方法:
|
||||||||
updateRow(index, row) |
更新数据队列第index行,index从0开始计数 row可以是当前行数据对象的子集,未包含的属性将沿用原数据 |
||||||||
appendRow(row) |
向表格末尾追加数据行 |
||||||||
insertRow(start, row) |
在数据队列第start处插入row,若start超出数据总长度,将追加到最后一行,相当于 |
||||||||
deleteRow(index) |
删除数据队列第index条 |
||||||||
getChanges([type]) |
返回类型为type的数据更改,type值可选"add","update","delete";若不传type,将返回包含所有更改类型的数据 |
||||||||
sort(key, [method]) |
将属性为key的列按照method排序,method为标准排序方法,接受a,b两个参数,若不传method将使用js默认的数据sort()方法排序 |
||||||||
detailFormater(index, render) |
为第index条数据所在行生成附加内容,param(index, render) : 数据所在行, 内容生成方法 |
||||||||
detailClear(index) |
清除第index条数据所在行的附加内容 |
<div class="mytable m pr" style="width:800px;height: 400px"></div>
<div class="mypage m"></div>
<div class="m">
<div class="btn btn-default updateCol">更新列</div>
<div class="btn btn-default updateData">更新数据</div>
<div class="btn btn-default getpager">操作page对象</div>
<div class="btn btn-default resize">更改尺寸</div>
<div class="btn btn-default reload">reload</div>
<div class="btn btn-default getRows">获取当前页rows</div>
<div class="btn btn-default getSelected">获取当前已选rows</div>
<div class="btn btn-default scrollTo">滚到第2行</div>
<div class="btn btn-default highlightRow">高亮第3行</div>
<div class="btn btn-default selectAll">全选</div>
<div class="btn btn-default unselectAll">全不选</div>
<div class="btn btn-default selectRow">选中第4行</div>
<div class="btn btn-default unselectRow">取消选中第4行</div>
<div class="btn btn-default getEntity">单元格实体方法</div>
<div class="btn btn-default updateRow">更新第一行数据</div>
<div class="btn btn-default appendRow">追加数据</div>
<div class="btn btn-default insertRow">再第一行后插入数据</div>
<div class="btn btn-default deleteRow">删除第二行数据</div>
<div class="btn btn-default getChanges">获取差异数据</div>
<div class="btn btn-default sort">按"价格"排序</div>
</div>
var Table = require('table');
//列配置
var myColumn = [{
title:'operation',
render: function(value, rowData, index, entity){
if(rowData.storage > 0){
return $('<div class="btn btn-primary btn-sm">折扣</div>').on('click', function(e){
e.stopPropagation();
entity.toggle('price', Math.round(rowData.price * 0.8));
});
}else{
return $('<div class="btn btn-primary btn-sm disabled">无货</div>');
}
},
width: 100,
fixed: true
},{
title: '图片',
render: function(value, rowData, index){
var smallImg = $('<img src="http://bsdn.org/projects/dorado7/deploy/sample-center/dorado/res/com/bstek/dorado/sample/data/images/'+rowData.product+'-24.png" alt="data.product" style="max-height:28px" />');
smallImg.tip('<img src="http://bsdn.org/projects/dorado7/deploy/sample-center/dorado/res/com/bstek/dorado/sample/data/images/'+rowData.product+'-128.png" style="width:128px;" />',{
type: 'content'
});
return smallImg;
}
},{
title:'产品',
key:'product',
width: 125,
sort: {
mehtod: true,
handle: function(key, type){
datagrid.load({
url: 'https://static.refined-x.com/static/phone.json',
data: {
sort: type,
key: key
},
dataParser: function(res){
return res.data;
}
});
}
},
validateMethod: function(value){
if(value && value.split && value.length < 10){
return true;
}
require.async('notice', function(Notice){
Notice({
title: '请输入长度小于10的字符串!',
color:'warning',
delay: 2000
});
});
},
editable: function(rowIndex, key, value){
console.log(rowIndex, key, value);
}
},{
title:'制造商',
key:'manufacturer',
filters: [
{
label: '全部',
mehtod: function(value){
return true;
}
},
{
label: '三星',
mehtod: function(value){
return value.indexOf('Samsung')===0;
}
},
{
label: '苹果',
mehtod: function(value){
return value.indexOf('Apple')===0;
}
},
{
label: '诺基亚',
mehtod: function(value){
return value.indexOf('Nokia')===0;
}
}
],
editable: function(rowIndex, key, value){
console.log(rowIndex, key, value);
}
},{
title:'价格',
key:'price',
width: 100,
styler: function(value){
if(value>3000){
return "background: rgb(252, 197, 197)";
}
},
editable: function(rowIndex, key, value){
console.log(rowIndex, key, value);
}
},{
title:'库存',
key:'storage',
align: 'center',
sort: true,
styler: function(value){
if(value<100){
return "background: rgb(211, 211, 211); color: red";
}
}
},{
title:'类型',
width: 200,
key: 'type',
render: function(value, rowData, index, entity){
var inputArray = [{
type:"A",
name: '直板'
},{
type:"B",
name: '翻盖'
},{
type:"C",
name: '滑盖'
}];
var inputName = "phonetype"+index;
var typeControl = '<div style="user-select: none;">';
$.each(inputArray, function(i, e){
typeControl += ('<label class="radio radio-inline"><input type="radio" name="'+inputName+'" value="'+e.type+'"'+(e.type===value ? ' checked' : '')+' />'+e.name+'</label>');
});
typeControl += '</div>';
return $(typeControl).on('change', function(){
var newValue = $(this).find('input:checked').val();
entity.set('type', newValue);
});
}
},{
title:'体积(mm)',
width: 200,
render: function(value, rowData, index){
var size = rowData.size;
if(size){
return [size.length, size.width, size.height].join(' x ');
}
}
},{
title:'comment',
key: 'comment',
width: 200,
editable: function(rowIndex, key, value){
console.log(rowIndex, key, value);
}
}];
//其他插件
var Tip = require('tip');
//调用Table
var datagrid = Table({
el:'.mytable',
load: {
url: 'https://static.refined-x.com/static/phone.json',
data: {
id: 123
},
dataParser: function(res){
return res.data;
}
},
column: myColumn,
multi: true,
page: {
el: '.mypage',
pageSize: 5
},
onSelect: function(index, row, collection){
console.log(index, row, collection);
}
});
//测试
$('.updateCol').on('click',function(){
var col = datagrid.column();
col.splice(0,1);
datagrid.column(col);
});
$('.updateData').on('click',function(){
var tableData = datagrid.data();
tableData.reverse();
datagrid.data(tableData);
});
$('.getpager').on('click', function(){
var pager = datagrid.getPager();
pager.set({
current: 3
});
});
$('.resize').on('click', function(){
var thesize = datagrid.size();
var sizeArray = [thesize.width, thesize.height].reverse();
datagrid.size({
width: sizeArray[0],
height: sizeArray[1]
});
});
$('.reload').on('click', function(){
datagrid.reload();
});
$('.getRows').on('click', function(){
console.log('getRows()', datagrid.getRows());
});
$('.getSelected').on('click', function(){
console.log('getSelected()', datagrid.getSelected());
});
$('.scrollTo').on('click', function(){
datagrid.scrollTo(2);
});
$('.highlightRow').on('click', function(){
datagrid.highlightRow(3);
});
$('.selectAll').on('click', function(){
datagrid.selectAll();
});
$('.unselectAll').on('click', function(){
datagrid.unselectAll();
});
$('.selectRow').on('click', function(){
datagrid.selectRow(3);
});
$('.unselectRow').on('click', function(){
datagrid.unselectRow(3);
});
$('.getEntity').on('click', function(){
var entity = datagrid.getEntity(0, 'storage');
entity.edit(function(row, key, value){
console.log('entity.edit() ', row, key, value);
});
});
$('.updateRow').on('click', function(){
datagrid.updateRow(0, {
price: 999,
storage: 8888
});
});
var newRow = {
"product": "I9000",
"manufacturer": "三星",
"type": "A",
size: {
"width": 61.4,
"height": 12.6,
"length": 120.2
},
"os": "Android 6.1",
"cpu": "Samsung 2GHz",
"screen": "5.5",
"touchScreen": true,
"price": 6550,
"storage": 8,
"comment": "弧面屏"
};
$('.appendRow').on('click', function(){
datagrid.appendRow(newRow);
});
$('.insertRow').on('click', function(){
datagrid.insertRow(1, newRow);
});
$('.deleteRow').on('click', function(){
datagrid.deleteRow(1);
});
$('.getChanges').on('click', function(){
console.log(datagrid.getChanges());
});
$('.sort').on('click', function(){
datagrid.sort('price', function(a,b){
return a-b;
});
});
时间选择插件,返回TimePicker
方法,语法:TimePicker(config)
,或使用jquery插件语法:$el.timepicker(config);
el |
默认 |
---|---|
trigger | 默认"click" ,触发动作 hover | click |
value |
默认当前时间,选择器初始值,配置时间必须符合format 所设置的格式
|
format |
默认"hh:mm:ss" ,格式化输出
|
hours |
默认24 ,时制,可选 12
|
place |
默认"bottom-center" ,选择器出现位置,选项同Tip插件
|
checkClass |
默认"text-primary" ,选中时间项附加样式
|
confirm |
默认false ,是否显示底部确认按钮
|
show |
默认false ,是否初始化后立即显示
|
onReady | 默认无,插件初始化完成回调 @param(parsedTime, timeData) : 格式化后的时间字符串,时间对象 |
onChange | 默认无,当confirm为true时的点选回调 @param(parsedTime, timeData) : 格式化后的时间字符串,时间对象 |
onSelect | 默认无,选择时间回调 @param(parsedTime, timeData) : 格式化后的时间字符串,时间对象 |
同Tip插件
<div class="wrap">
<div class="row">
<div class="span-2">
<div class="demo1 btn btn-default">打开时间选择器</div>
</div>
<div class="span-2">
<input type="text" class="demo2 form-control" >
</div>
<div class="span-2">
<div class="btn btn-default toggle2">切换demo2可用状态</div>
</div>
</div>
</div>
var TimePicker = require('timepicker');
TimePicker({
el: '.demo1',
show: true,
onSelect: function(time) {
$('.demo1').text('onchange:' + time);
}
});
var picker2 = $('.demo2').timepicker({
format: 'hh点mm分',
value: '11点30分',
confirm: true,
onSelect: function(time){
alert('onchange:' + time);
}
});
$('.toggle2').on('click',function(){
picker2.disabled($('.demo2').prop('disabled'));
});
提示框插件,返回Tip方法,语法:Tip(TipContent, config)
,或者使用jquery插件语法: $el.tip(TipContent, config);
TipContent
支持文本,html,jQuery元素(将清除默认样式)
el | 默认null ,制定触发元素,直接调用方法必填,jquery插件调用时可忽略,默认应用$(this) |
---|---|
trigger | 默认"hover" ,触发动作 hover | click | custom |
place | 默认"left-center" ,弹出元素相对于$handle的显示位置,规则"第一轴向-第二轴向-[定位模式]",第一轴向可选"left | right | top | bottom",第二轴向除四个方位外还可以选择"center",定位模式非必填,可选"in","in"定位模式表示$target将覆盖$handle |
title | 默认false ,标题文字,不显示标题栏 |
hasarr | 默认true ,提示框有无箭头 |
offset | 默认0 ,提示框与元素间距 |
type | 默认"auto" ,弹出文本内容自带边框,DOM元素不带边框,可选'content',所有元素均自带边框弹出 |
modal |
默认false ,是否带半透明背景
|
opacity |
默认0.5 ,模态背景透明度
|
hook | 默认无,字符型,class钩子,将添加到弹出元素上 |
show |
默认false ,立即显示,显示后只能用返回对象中的hide()方法关闭
|
onshow | 默认无,显示回调,接收当前对象为参数 |
onhide | 默认无,关闭回调 |
obj.hide() | 关闭当前tip实例 |
---|---|
obj.disabled(flag) | 禁用当前tip实例,若flag为真值将解禁 |
obj.destroy() | 销毁当前tip实例 |
<style> /*css*/ .demo a{margin: 60px;} </style>
<!--html--> <div class="wrap demo"> <a href="#1" class="_tip1 btn btn-default">左</a> <a href="#2" class="_tip2 btn btn-default">上</a> <a href="#3" class="_tip3 btn btn-default">右-自动显示并关闭</a> <a href="#4" class="_tip4 btn btn-default">下-自定义触发条件</a> <a href="#4" class="btn btn-primary toggle-tip4">显示最后一个tip</a> </div>
//js
var Tip = require('tip');
$('.demo ._tip1').tip(Math.random, {
place: 'left-center'
});
$('.demo ._tip2').tip(Math.random, {
place: 'top-center'
});
var tip3 = $('.demo ._tip3').tip(Math.random, {
place: 'right-center',
show: true
});
setTimeout(function() {
tip3.hide();
}, 1000);
var tip4 = Tip(Math.random, {
el: $('.demo ._tip4'),
place: 'bottom-center',
trigger: 't4show'
});
$('.toggle-tip4').on('click', function(){
$('.demo ._tip4').trigger('t4show');
setTimeout(function() {
tip4.hide();
}, 2000);
});
图片放大镜,大图尺寸自动获取。
zoomWidth | 大图窗口宽度,默认与目标对象同宽 |
---|---|
zoomHeight | 大图窗口高度,默认与目标对象同高 |
zoomScale | 默认0,大图相对小图放大倍数(大于1有效) |
offset | 大图窗口与小图距离,默认10,单位px |
offsetTarget | 大图定位目标,默认无,将相对目标元素定位 |
position | 大图相对小图方位,默认right |
animate | 默认true,大图是否渐显 |
duration | 默认200,大图渐显动画时长 |
preload | 默认true,预加载大图,小图动态切换的情况只对第一张有效 |
<!--html-->
<style>
.demo{width:400px;height:320px;line-height: 320px; text-align:center;background:#eee;}
.demo img{display: inline-block;vertical-align: middle;}
</style>
<div class="demo">
<img src="http://temp.im/320x240/" zoom="http://temp.im/640x480/" />
</div>
// JS
require('zoom');
$('.demo').zoom()
树形插件,基于zTree优化。使用树控件可以完整展现其中的层级关系,并具有展开收起选择等交互功能。
基于zTree美化皮肤,并自动添加ztree
类,修复没有id无法拖拽的bug,及其他细节微调。
依赖tree.less
样式组件
见官网文档
<div class="wrap"><div class="tree1"></div></div>
require('zTree');
var zNodes = [{
name: "test1",
open: true,
children: [{
name: "test1_1",
checked: true,
chkDisabled: true
}, {
name: "test1_2"
}]
}, {
name: "test2",
open: true,
children: [{
name: "test2_1",
children: [{
name: "test2_1_1"
}, {
name: "test2_2_2"
}]
}, {
name: "test2_2"
}]
}];
$.fn.zTree.init($(".tree1"), {
check: {
enable: true
}
}, zNodes);
内置解决方案示例见flow-ui/。
css/style.css
已经包含对应的媒体查询,默认断点是: {Pc} > 1024 > {Pad} > 640 > {Mobile}
,响应式网站开发除了css媒体查询以外,至少还要具备三项功能:响应式栅格系统、终端识别,响应图片。
对应方法已封装在【responsive】中。
约定设计稿宽度:手机界面640px,pad界面1024px。
基于以上约定,通过vw单位将html字号(rem)设置为100px(假设约定设计稿宽度640px,即html{font-size:15.625vw;}
),因为vw以屏幕宽度为基准,使rem也对屏幕宽度具有适应性,因此使用rem为单位的尺寸都将随屏幕宽度自动缩放,从而实现适配,例如:
<style>
.test{width: 3.2rem;height:3.2rem;background:yellow;}
</style>
<div class="test">
<p>在任何手机上都显示为宽度50%(3.2rem)的正方形</p>
<p style="font-size:.28rem">字号.28rem的文字</p>
</div>
全屏翻页(fullpage)模式的简单实现,见 demo页面。
结合【instantclick】插件,实现链接预加载、无刷新切换(PJAX)、加载进度条等特性,并扩展了页面切换后记住滚动位置的功能。
预加载技术有一定特殊性,普通模块加载方式将失效,需要使用优化后的pjax专用模板,开发中基本保持了原有模块化开发体验,主要存在以下三点细节上的不同:
//页面引用js的写法
seajs.use('js/index_pjax', function(run) {
run();
})
define(function(require) {
var $ = require('jquery');
var base = require('base');
var com = require('./common_pjax'); //注意这里必须引用common_pjax
//模块js的写法
return function(){
//页面代码里执行common_pjax
com.init();
//以下就是你得业务代码啦
require('box');
$.box.msg('hello p1!');
}
})
//common_pjax
module.exports = {
init:function(){
//整站通用代码
...
}
}
页面中所有的资源路径(包括图片)必须是绝对路径,因为相对路径全部是相对于着陆页而言的,当跳转路径跨层级时相对路径会报错。
PJAX切换模式还会导致某些插件表现异常,本质上都是因为页面没有刷新,比如mmenu.js点击后不收回,需要添加如下配置: { onClick:{ close:true}}
这几种情况下的a标签不会触发预加载和pjax切换:
target
或download
或data-no-instant
属性;当href地址中含有scrollfixed
参数时,切换后会记住当前的页面滚动位置:
<a href="/test/test.html?scrollfixed=1">
实现jQuery.ajax请求合并,详见【base.js】中ajaxCombo
相关介绍,示例如下
var base = require('base');
//调用并附加参数:
base.ajaxCombo({
extendData: {
apikey: 'apikey',
token: 'token',
secretKey: 'secretKey'
}
});
//第一批次合并请求
$.ajax({
url: 'http://host.refined-x.com/test/ajax.php',
data: {
test: 'hello1',
sign: 's1'
},
combo: true,
success: function(data) {
console.log('第一批ajax1返回')
}
});
$.ajax({
type: 'post',
url: 'http://host.refined-x.com/test/ajax.php',
data: {
test: 'hello2',
sign: 's2'
},
combo: true,
success: function(data) {
console.log('第一批ajax2返回')
}
});
//第二批次合并请求
setTimeout(function() {
$.ajax({
url: 'http://host.refined-x.com/test/ajax.php',
data: {
test: 'hello3',
sign: 's3'
},
combo: true,
success: function(data) {
console.log('第二批ajax1返回')
}
});
$.ajax({
type: 'post',
url: 'http://host.refined-x.com/test/ajax.php',
data: {
test: 'hello4'
},
combo: true,
success: function(data) {
console.log('第二批ajax2返回')
}
});
}, 300);
//不参与合并的请求
$.ajax({
url: 'http://host.refined-x.com/test/ajax.php',
data: {
test: '普通未合并ajax'
},
success: function(data) {
console.log(data)
}
});
框架默认使用seajs-localcache插件实现模块缓存功能,通过manifest文件控制模块版本,manifest文件中注册的模块在第一次请求成功后会缓存到localStorage中,下次调用会直接从localStorage中读取,版本号变化则重新请求并更新本地缓存。
manifest文件位于开发目录结构下的/public/lib/seajs/manifest.js
,编译后合并至/lib/seajs.js
。manifest文件必须完整记录模块库中的每个js模块路径,同时模块库中的模块必须是具名模块,模块名为文件名。
对于路径带文件夹的模块,需要在seajs.config.alias
中将别名配置为文件名,例如jquery
模块的模块路径是"jquery/1/jquery",但模块名是"jquery",那么需要配置seajs短语如下:
alias: {
"audio" : "audio/audio",
"copy" : "copy/ZeroClipboard",
"flv" : "flv/flv",
"hook" : "hook/hook",
"jquery" : "jquery/1/jquery",
...
此时require('jquery')
将加载"jquery/1/jquery.js"这个文件,manifest文件中则如下记录:
/*
* manifest.js
*/
define('manifest',function(){
var mod = {
'album/album' : 1, //修改版本号更新对应的插件缓存
'hook/hook' : 1,
'jquery/1/jquery' : 1,
'jquery/2/jquery' : 1
//...
}
//...
})
这样一来就可以很方便的使用带有多级路径的模块,而且用这种方式还可以很方便的控制类库版本,例如只要将"jquery"短语路径配置为"jquery/2/jquery",就可以全局切换到jQuery2.x版本了。
通过修改seajs.config.base
可以使用远程模块库,借助云存储平台可以很方便的自建私有模块库,实现JS插件的共享和同步更新,也能节省单个项目的存储空间。
IE8浏览器默认不允许跨域请求数据,所以使用远程模块库会引起IE8报错,报错信息为"拒绝访问",因此需要兼容IE8的项目切勿使用远程模块库。Flow-UI文档和部分示例页面存在这个问题,如果用IE8访问出现报错,请忽略。
手动修改IE8浏览器的安全策略可以解决这个问题,步骤如下:IE工具->internet选项->安全->自定义级别->通过域访问数据源。