xmlplus组件设计系列之按钮(2)


Posted in Javascript onApril 26, 2017

除了图标以外,按钮也许是最简单的组件了,现在来看看如何定义按钮组件。

使用原生按钮组件

在 xmlplus 中,HTML 元素也以组件的方式存在。所以,你可以直接通过使用 button 标签或者 input 标签来使用按钮组件。如下示例所示:

Example: {
  xml: "<div id='example'>\
       <button>Default</button>\
       <input type='submit'>Primary</input>\
     </div>"
}

虽然原生按钮外观不那么吸引人,但原生按钮未经特殊包装,所以渲染起来最快,执行效率最高。

使用 Bootstrap 样式的按钮

如果你的项目在视觉上没有特别要求的话。使用 Bootstrap 样式来定义按钮组件是一个好主意。按传统方式使用 Bootstrap 按扭,你需要像下面这样使用。

<button type="button" class="btn btn-default">Default</button>
<button type="button" class="btn btn-primary">Primary</button>
<button type="button" class="btn btn-success">Success</button>

请认真观察,你是不是觉得它给你的比你要求的要多。你不但发现了好多的 type=button,还发现了好多的 btn。现在下面给出一个组件,它基于 Bootstrap 样式,但它明显地简化了按钮的使用方式。

Button: {
  xml: "<button type='button' class='btn'/>",
  fun: function (sys, items, opts) {
    this.addClass("btn-" + opts.type);
  }
}

此按钮组件封装了原始按钮需要重复书写的内容,在使用时,仅需提供 type 属性即可指明目标按钮,使用起来更为便捷。下面给出的是新按钮组件的使用方式。

<Button type='default'>Default</Button>
<Button type='primary'>Primary</Button>
<Button type='success'>Success</Button>

带有图标的按钮

按钮上除了文字外,还可以附带图标。合适的图标可以使按扭的使用意图更加生动直观。这里以 EasyUI 的图标按钮为例来说明如何封装并使用图标按钮。我们首先来看看,EasyUI 图标按钮的原始使用方式。

<div style="padding:5px 0;">
  <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="easyui-linkbutton" data-options="iconCls:'icon-add'">Add</a>
  <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="easyui-linkbutton" data-options="iconCls:'icon-remove'">Remove</a>
  <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="easyui-linkbutton" data-options="iconCls:'icon-save'">Save</a>
</div>

与上一节对 Bootstrap 按钮的封装类似,通过观察提炼出重复出现的部分,将变化的部分以接口形式展现。上面的按钮仅图标类型名和文本是可变的,所以我们可以做出如下的设计:

Button: {
  xml: "<a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="easyui-linkbutton"/>",
  fun: function (sys, items, opts) {
    this.attr("data-options" + "iconCls:'icon-" + opts.type);
  }
}

下面是新图标的使用方式,它明显比原始的使用方式简洁多了。

<div style="padding:5px 0;">
  <Button type='add'>Add</Button>
  <Button type='remove'>Reomve</Button>
  <Button type='save'>Save</Button>
  <Button type='cut'>Cut</Button>
</div>

自定义你的按钮组件

使用类似 Bootstrap, EasyUI 等开源框架,可以避免重造轮子。然而,当这些开源项目无法满足你的需求时,你就需要自己动手了。

为简单起见,现在假定上述 Bootstrap 框架并不存在,那么如何设计一套上述的按钮?这样的实践是非常有意义的,它有助于你举一反三。

现在让我们重新对上面的按钮组件作观察。你会发现,Bootstrap 设计了一些可以组合的样式类,其中 btn 是每一个按钮都需要的,另外像 btn-default、btn-primary 等等都根据需要与 btn 形成组合样式类。好了,根据这个思路,我们就可以设计出如下的组件框架。

Button: {
  css: "#btn { 这里是按钮基本的样式 }\
     #default { 这里是default样式 }\
     #primary { 这里是primary样式 }",
  xml: "<button type='button'/>",
  fun: function (sys, items, opts) {
    this.addClass("#btn #" + opts.type, this);
  }
}

上述的设计思路与前面直接使用 Bootstrap 样式定义按钮不同点在于,前者已经为你定义好了各个全局的样式类,你只需要直接引用就可以了。而此处你需要在按扭组件内部自行定义相关样式类。从封装的角度看,后者的内聚性要强于前者,因为它并不暴露全局类名。下面是该组件的使用示例。

Example: {
  xml: "<div id='example'>\
       <Button type='default'>Default</Button>\
       <Button type='primary'>Primary</Button>\
       <Button type='success'>Success</Button>\
     </div>"
}

注意,为了简化起见,这里的自定义按钮组件略去了 hover、active 样式,所以与 Bootstrap 按钮有些不一样。

本系列文章基于 xmlplus 框架。如果你对 xmlplus 没有多少了解,可以访问 www.xmlplus.cn。这里有详尽的入门文档可供参考。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
类之Prototype.js学习
Jun 13 Javascript
IE 缓存策略的BUG的解决方法
Jul 21 Javascript
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
Sep 27 Javascript
VBS通过WMI监视注册表变动的代码
Oct 27 Javascript
jQuery学习笔记之jQuery中的$
Jan 19 Javascript
JavaScript对象反射用法实例
Apr 17 Javascript
Bootstrap Table使用方法解析
Oct 19 Javascript
详解angular2实现ng2-router 路由和嵌套路由
Mar 24 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
Jul 13 jQuery
vue 双向数据绑定的实现学习之监听器的实现方法
Nov 30 Javascript
基于JavaScript实现大文件上传后端代码实例
Aug 18 Javascript
JavaScript实现10秒后再次获取验证码
Dec 02 Javascript
xmlplus组件设计系列之列表(4)
Apr 26 #Javascript
JS实现数组按升序及降序排列的方法
Apr 26 #Javascript
详解AngularJs ui-router 路由的简单介绍
Apr 26 #Javascript
JS ES6多行字符串与连接字符串的表示方法
Apr 26 #Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
Apr 26 #Javascript
Vue.js实现文章评论和回复评论功能
May 30 #Javascript
详解node.js平台下Express的session与cookie模块包的配置
Apr 26 #Javascript
You might like
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
php实现的二分查找算法示例
2017/06/20 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
js Math 对象的方法
2013/09/01 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
Python创建临时文件和文件夹
2020/08/05 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
师范生自荐信范文
2013/10/06 职场文书
四年级科学教学反思
2014/02/10 职场文书
篝火晚会策划方案
2014/05/16 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
微信搭讪开场白
2015/05/28 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
JavaScript执行机制详细介绍
2021/12/06 Javascript