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 相关文章推荐
运用jquery实现table单双行不同显示并能单行选中
Jul 25 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
May 17 Javascript
javascript随机之洗牌算法深入分析
Jun 07 Javascript
JavaScript中用于生成随机数的Math.random()方法
Jun 15 Javascript
JavaScript事件 &quot;事件对象&quot;的注意要点
Jan 14 Javascript
AngularJS控制器之间的数据共享及通信详解
Aug 01 Javascript
JS中判断null的方法分析
Nov 21 Javascript
js入门之Function函数的使用方法【新手必看】
Nov 22 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
Jan 12 Javascript
seajs下require书写约定实例分析
May 16 Javascript
浅谈关于iview表单验证的问题
Sep 29 Javascript
让mocha支持ES6模块的方法实现
Jan 14 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
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
javascript删除字符串最后一个字符
2014/01/14 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
Python程序设计入门(4)模块和包
2014/06/16 Python
Python检测生僻字的实现方法
2016/10/23 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
int在python中的含义以及用法
2019/06/27 Python
浅谈Python中的模块
2020/06/10 Python
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
园林系毕业生求职信
2014/06/23 职场文书
家长会标语
2014/06/24 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
优秀党员先进材料
2014/12/18 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
中班下学期个人总结
2015/02/12 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
python基础入门之普通操作与函数(三)
2021/06/13 Python