Tag 标签
实用方式
Tags标签常用在兴趣、分类、条件等多选情况中。使用ax-tag
表示内容标签,如果需要以容器形式放置标签,请使用ax-tags
包裹。
<span class="ax-tag">单个Tag标签</span> <div class="ax-break"></div> <div class="ax-tags"> <span class="ax-tag">多个Tag标签</span> <span class="ax-tag">以ax-tags包裹</span> <span class="ax-tag">风格统一</span> <span class="ax-tag">参数统一</span> </div>
主题颜色
使用ax-tag
表示内容标签。本框架一共定义了7种颜色标签,分别是primary、success、danger、warning、info、question、text、brief和ignore,使用theme属性即可定义该Tag标签主题颜色,例如theme="primary"。标签可以用span
也可以使用其他标签,加上默认白色一共可用8种主题颜色。详细说明和举例如下:
<span class="ax-tag">默认</span> <span class="ax-tag" theme="primary">中国</span> <span class="ax-tag" theme="success">操作成功!</span> <span class="ax-tag" theme="error">很危险!</span> <a href="###" class="ax-tag" theme="warning">提示注意!</a> <a href="###" class="ax-tag" theme="question">这是一个疑问!</a> <a href="###" class="ax-tag" theme="info">名词解释</a> <a href="###" class="ax-tag" theme="text">正文标签</a> <a href="###" class="ax-tag" theme="brief">灰色标签</a> <a href="###" class="ax-tag" theme="ignore">浅灰色文字提示</a>
如果使用ax-tags
标签包裹,那么可通过theme
属性统一设定风格,例如theme="prmary"
,同单个Tag一样一共可以使用8种主题风格。
<div class="ax-tags" theme="primary"> <span class="ax-tag">中国</span> <span class="ax-tag">新加坡</span> <span class="ax-tag">澳大利亚</span> <span class="ax-tag">俄罗斯</span> </div>
无边标签
对ax-tag
追加borderless
属性可以实现无边Tag;对ax-tags
追加borderless
属性可统一设定无边Tag。
<span class="ax-tag" theme="primary" borderless>唐朝</span> <a href="###" class="ax-tag" theme="light" borderless>宋朝</a> <div class="ax-break"></div> <div class="ax-tags" borderless theme="warning"> <span class="ax-tag">元朝</span> <span class="ax-tag">明朝</span> <span class="ax-tag">清朝</span> </div>
圆角标签
对ax-tag
追加corner="round"
属性可以实现圆角Tag;对ax-tags
追加corner="round"
属性可统一设定圆角Tag。
<span class="ax-tag" theme="primary" corner="round">唐朝</span> <a href="###" class="ax-tag" theme="light" corner="round">宋朝</a> <div class="ax-break"></div> <div class="ax-tags" corner="round"> <span class="ax-tag">元朝</span> <span class="ax-tag">明朝</span> <span class="ax-tag">清朝</span> </div>
方角标签
对ax-tag
追加corner="square"
属性可以实现直角Tag;对ax-tags
追加corner="square"
属性可统一设定圆角Tag。
<span class="ax-tag" theme="primary" corner="square">唐朝</span> <a href="###" class="ax-tag" theme="light" corner="square">宋朝</a> <div class="ax-break"></div> <div class="ax-tags" corner="square"> <span class="ax-tag">元朝</span> <span class="ax-tag">明朝</span> <span class="ax-tag">清朝</span> </div>
关闭按钮
如果需要使用关闭按钮,在ax-tag标签尾部加入<i remove></i>
即可
<span class="ax-tag">中国<i remove></i></span> <span class="ax-tag" theme="primary">新加坡<i remove></i></span> <a href="###" class="ax-tag" theme="error">澳大利亚<i remove></i></a>
在ax-tag尾部加入<s remove></s>
表示另外一种关闭方式。
<span class="ax-tag">中国<s remove></s></span> <span class="ax-gutter"></span> <span class="ax-tag" theme="primary">新加坡<s remove></s></span> <span class="ax-gutter"></span> <a href="###" class="ax-tag" theme="light">澳大利亚<s remove></s></a>
紧凑尺寸
为了能与input或textarea配合使用,设计了紧凑尺寸Tag,给ax-tag标签追加compact
属性即可;如果是ax-tags浮层包裹则对浮层追加compact
属性。
由于紧凑型标签大大缩小了间隙,所以已经不适合使用s标签做关闭按钮,只可使用i
做标签按钮。
<span class="ax-tag" compact>中国<i remove></i></span> <span class="ax-tag ax-primary" compact>新加坡<i remove></i></span> <a href="###" class="ax-tag" theme="error" compact>澳大利亚<i remove></i></a> <div class="ax-break"></div> <div class="ax-tags" compact> <span class="ax-tag">印度<i remove></i></span> <span class="ax-tag">土耳其<i remove></i></span> <span class="ax-tag">南非<i remove></i></span> </div>
纯文本风格
为了能与用户自定义的布局合理搭配,可使用无边框和无边距的纯文本风格。使用对插件使用text:true
参数或对ax-tags
节点追加text
属性即可。
<div class="ax-tags" text> <span class="ax-tag">澳大利亚<i remove></i></span> <span class="ax-tag">巴西<i remove></i></span> <span class="ax-tag">新加坡<i remove></i></span> </div> <div class="ax-break"></div> <div class="ax-tags" text> <span class="ax-tag">土耳其<s remove></s></span> <span class="ax-tag">俄罗斯<s remove></s></span> <span class="ax-tag">英国<s remove></s></span> </div> <div class="ax-break"></div> <div class="ax-tags" compact text> <span class="ax-tag">印度<i remove></i></span> <span class="ax-tag">沙特阿拉伯<i remove></i></span> <span class="ax-tag">南非<i remove></i></span> </div>
插件使用方法
如果需要对批量创建Tags,并对Tags进行添加和删除操作,此时则需要以插件的形式创建实例。插件运行方式有两种:
- ax*属性:对ax-tags标签使用
axTags
属性并填写content
参数即可按默认参数运行插件。 - js实例:通过
new axTags('#ID',{content:''})
方式创建实例运行。
-
<div class="ax-tags" axTags="content:'中国,新加坡,澳大利亚'"></div> <div class="ax-break"></div> <div id="jsTags"></div>
-
new axTags('#jsTags',{ content:'菲律宾,丹麦,波兰' });
数据源
参数content
接收数据源,支持四种数据格式,这些数据格式通过内置函数转换后会成为标准的数组数据格式,通过内部变量this.content
可查看。
- 一个字符串,也就是Tag的内容,如果用英文逗号隔开则会创建多个Tag(参数separator定义了分隔符)
- 一个对象,格式是{value:'',theme:''},其中value也就是Tag的内容是必填的,theme选填
- 字符串数组,格式是['','',''],每一项字符串都是Tag的内容
- 对象数组,格式是[{value:'',theme:''},{}],每一项都包含value和theme属性,当然theme是选填
<div class="ax-tags" axTags="content:'中国'"></div> <div class="ax-break"></div> <div class="ax-tags" axTags="content:'中国,新加坡,澳大利亚'"></div> <div class="ax-break"></div> <div class="ax-tags" axTags="content:{value:'南非',theme:'warning'}"></div> <div class="ax-break"></div> <div class="ax-tags" axTags="content:['英国','瑞士','俄罗斯']"></div> <div class="ax-break"></div> <div class="ax-tags" axTags="content:[{value:'印度',theme:''},{value:'巴基斯坦',theme:'info'}]"></div>
主题颜色
使用主题颜色的方式有两种:
- 1、使用
theme
参数,支持以上8中主题颜色 - 2、对
content
参数填入对象数组,单独对每个Tag进行主题颜色定义
<div class="ax-tags" axTags="content:'中国,新加坡,澳大利亚',theme:'primary"></div> <div class="ax-break"></div> <div class="ax-tags" axTags="content:[{value:'德国',theme:'danger'},{value:'意大利',theme:'warning'}]"></div>
风格定制
除了使用theme改变颜色之外,还可以通过以下参数改变风格:
borderless
:设定标签是否为无边框状态,默认false,可设为true去掉边框compact
:设定标签是否为紧凑状态,默认false,可设为true让标签之间紧凑排列以便于与input和textarea配合使用corner
:设定标签边缘形态,默认为空即3px的小圆角;设为round则为大圆角;设为square则为方角
<div class="ax-tags" axTags="content:'中国,新加坡,澳大利亚',theme:'primary',borderless:true"></div> <div class="ax-break"></div> <div class="ax-tags" axTags="content:'中国,新加坡,澳大利亚',compact:true"></div> <div class="ax-break"></div> <div class="ax-tags" axTags="content:'中国,新加坡,澳大利亚',corner:'round'"></div> <div class="ax-break"></div> <div class="ax-tags" axTags="content:'中国,新加坡,澳大利亚',corner:'square'"></div>
变量和操作方法
本插件有系列内部成员变量和内部操作方法,用户根据这些变量和方法可以自由操作实例,据此可方便与其他组件进行交互。请按下F12按键打开浏览器控制台来观摩以下实例。
内部成员变量如下:
this.destroyed
:是否销毁状态,true或falsethis.targetDom
:Tag父节点,也即ax-tags节点this.content
:Tags对象数组,包含了id、value、theme、dom等属性this.maxIndex
:最大索引值,新增Tag的id属性值将以此为基数this.contentProxy
:this.content的代理,返回{proxy:'',instance:''}- proxy:this.content的代理对象,需要联动监听则操作该属性,否则直接操作this.content即可
- instance:axObserve的代理实例,可使用on方法进行监听,详细用法请点击这里。
内部操作方法如下:
this.update(setting, callback)
:更新所有参数,支持两个参数:- setting:必填项,对象类型,用户自定义的参数
- callback:选填项,回调函数,无参数:
this.add(obj, callback)
:增加Tags,支持两个参数:- obj:必填项,支持4种格式,格式与插件参数content一致
- callback:选填项,回调函数,支持一个参数即新增项:
this.remove(obj, callback)
:删除Tags,支持两个参数:- obj:必填项,支持多种格式,详细说明如下:
- 一个字符串:即查找Tag的内容
- 一个数字:即查找Tag的id索引
- 一个DOM节点:即查找Tag的DOM节点
- 一个对象,对象中有id或value或dom属性:即通过这些属性依次查找,直到找到第一个为止
- 数组,每一项可以是以上四种类型,以进行批量删除
- callback:选填项,回调函数,支持一个参数即删除项:
this.clear(callback)
:清除所有Tags,支持一个参数即callback回调,回调函数无参数。this.destroy(callback)
:销毁实例,支持回调函数,回调无参数:
全局操作方法如下:
axInstance
:每个new实例都会自动加入到全局实例合集当中,通过该方法可获取实例,继而使用实例的内部变量和内部操作方法。关于axInstance使用方法请点击这里。
- this:实例本身
- this.targetDom:实例的Dom
- this.options:实例的参数
删除Tag
删除标签的方法有三种:
- 1、使用
removable:true
,即显示标签删除按钮,点击删除按钮可删除该标签。 - 2、使用
this.remove()
方法删除指定的Tag,可批量删除;参数说明如上。 - 3、使用
this.clear()
方法删除所有Tags;参数说明如上。
-
<div class="ax-tags" axTags="content:'中国,新加坡,澳大利亚',removable:true"></div> <div class="ax-break"></div> <div class="ax-tags" id="removeIns"></div> <div class="ax-break"></div> <a href="###" class="ax-btn ax-primary" id="removeOneBtn">删除“丹麦”</a> <a href="###" class="ax-btn ax-primary" id="removeMoreBtn">删除“意大利,巴西,俄罗斯”</a> <a href="###" class="ax-btn ax-primary" id="clearBtn">删除全部</a> <a href="###" class="ax-btn ax-primary" id="removeViewBtn">查看剩余Tags</a>
-
let removeOneBtn = document.querySelector('#removeOneBtn'), removeMoreBtn = document.querySelector('#removeMoreBtn'), clearBtn = document.querySelector('#clearBtn'), removeViewBtn = document.querySelector('#removeViewBtn'), removeIns = new axTags('#removeIns', { content: '菲律宾,丹麦,波兰,荷兰,意大利,巴西,俄罗斯,印度', removable: true, }); removeOneBtn.onclick = () => { removeIns.remove('丹麦', () => { console.log('删除了“丹麦”') }); } removeMoreBtn.onclick = () => { removeIns.remove('意大利,巴西,俄罗斯', () => { console.log('删除了“意大利,巴西,俄罗斯”') }); } clearBtn.onclick = () => { removeIns.clear(() => { console.log('全部删除了') }); } removeViewBtn.onclick = () => { console.log(removeIns.content); }
新增Tag
通过this.add()
方法新增Tags节点,可添加单个和多个Tags;参数说明如上。
-
<div class="ax-tags" id="addIns"></div> <div class="ax-break"></div> <a href="###" class="ax-btn ax-primary" id="addOneBtn">增加“丹麦”</a> <a href="###" class="ax-btn ax-primary" id="addMoreBtn">增加“意大利,巴西,俄罗斯”</a> <a href="###" class="ax-btn ax-primary" id="addViewBtn">查看所有Tags</a>
-
let addOneBtn = document.querySelector('#addOneBtn'), addMoreBtn = document.querySelector('#addMoreBtn'), clearBtn = document.querySelector('#clearBtn'), addViewBtn = document.querySelector('#addViewBtn'), addIns = new axTags('#addIns', { content: '菲律宾,丹麦,波兰,荷兰,意大利,巴西,俄罗斯,印度', removable: true, }); addOneBtn.onclick = () => { addIns.add('丹麦', () => { console.log('删除了“丹麦”') }); } addMoreBtn.onclick = () => { addIns.add('意大利,巴西,俄罗斯', () => { console.log('删除了“意大利,巴西,俄罗斯”') }); } clearBtn.onclick = () => { addIns.clear(() => { console.log('全部删除了') }); } addViewBtn.onclick = () => { console.log(addIns.content); }
行内编辑
插件默认只能通过add和remove方法进行添加和删除操作,将设置参数eidt.enable:true
开启行内编辑,使用表现如下:
- 1、输入内容后,按下回车键可新增Tag;如果输入的字符带有分隔符比如英文逗号则会创建多个Tag,如果不带分隔符则会创建一个Tag
- 2、当表单域内容为空,按下删除键则会选中最后一个Tag,此时最后一个Tag会高亮显示
- 3、当表单域内容为空,当Tag已经处于选中状态,此时如果再按一下删除键则会删除最后一个Tag,按下其他任意按键会取消选中状态
-
<div class="ax-tags" id="editIns"></div>
-
new axTags('#editIns', { content: '菲律宾,波兰,荷兰,印度', removable: true, edit:{enable:true} });
使用表单域
如果不需要行内编辑方式,而需要通过外部的input进行编辑,那么需要设置两个参数:
edit
,设为true开启可编辑功能input
,input或textarea表单域节点,可填#id、.className或节点。表现效果如行内编辑一致
-
<div class="ax-tags" id="inputIns"></div> <div class="ax-break"></div> <input type="text" placeholder="输入字符串..." id="inputBtn" />
-
new axTags('#inputIns', { content: '菲律宾,波兰,荷兰,印度', removable: true, edit:{enable:true,input: '#inputBtn'} });
禁止添加相同的
插件默认可以添加任何文本的tag,但是有些情况需要禁止添加相同label/value的tag,可设置参数unique
为true禁止添加相同的tag。
-
<div class="ax-tags" id="uniqueIns"></div>
-
new axTags('#uniqueIns', { content: '菲律宾,波兰,荷兰,印度', edit: { enable: true }, removable: true, unique:true, });
销毁实例
通过使用this.destroy(callback)
方法销毁实例,支持回调函数,回调无参数;销毁后可通过init
初始化重新启用。
销毁后将不能再使用删除功能以及add、remove、clear和update方法。
-
<div id="insDestroy"></div> <div class="ax-break"></div> <a href="###" class="ax-btn ax-primary" id="btnDestroy">销毁</a> <a href="###" class="ax-btn ax-primary" id="btnInit">初始化</a>
-
let insDestroy = new axTags('#insDestroy', { content: '菲律宾,波兰,荷兰,印度', removable: true, }), btnDestroy = document.querySelector('#btnDestroy'), btnInit = document.querySelector('#btnInit'); btnDestroy.onclick = function () { insDestroy.destroy(function () { alert('销毁了实例!') }); } btnInit.onclick = function () { insDestroy.init(); }
在创建实例的时候会自动添加到全局实例合集当中;如果填写了实例名insName
,那么可通过axInstance
方法进行销毁实例。关于axInstance使用方法请点击这里。
-
<div axTags='insName:"big",content:"中国,新加坡,澳大利亚",removable:true'></div> <div class="ax-break"></div> <div axTags='insName:"small",content:"俄罗斯,印度,美国",removable:true'></div> <div class="ax-break"></div> <a href="###" class="ax-btn ax-primary" id="destroyBig">销毁big实例</a> <a href="###" class="ax-btn ax-primary" id="destroySmall">销毁small实例</a> <a href="###" class="ax-btn ax-primary" id="viewAll">查看实例合集</a> <a href="###" class="ax-btn ax-primary" id="initAll">重新启用</a>
-
let destroyBig = document.querySelector('#destroyBig'), destroySmall = document.querySelector('#destroySmall'), viewAll = document.querySelector('#viewAll'), initAll = document.querySelector('#initAll'); destroyBig.onclick = function () { axInstance.destroy('big'); } destroySmall.onclick = function () { axInstance.destroy('small'); } viewAll.onclick = function () { //只查看有name的实例合集 console.log(axInstance.data.filter(i => i.name && i.type === 'tags')); } initAll.onclick = function () { //重新初始化以启用 let items = axInstance.data.filter(i => (i.name === 'big' || i.name === 'small') && i.type === 'tags'); items.forEach(i => { i.instance.init(); }); }
监听事件
本插件有若干监听方法,以on为关键字,参数中监听格式为:new instance({onShow:function(){}})
;实例后监听格式是:instance.on('show',function(){})
。在参数中监听和实例后监听效果相同。具体事件说明如下:
onInit
初始化后执行,无参数onAdd/add
打开窗口前执行,支持一个参数,即新增项onRemove/remove
窗口隐藏前执行,支持两个参数,即删除项(数组)和删除项对应的索引(数组)onUpdate/update
参数更新前执行,无参数onClear/clear
全部清除前执行,无参数onDestroy/destroy
销毁后执行,无参数
演示实例显示结果使用了console.log方法,请按下F12按键打开开发者工具中的“控制台”查看监听效果。
-
<div id="insOn"></div> <div class="ax-break"></div> <a href="###" class="ax-btn ax-primary" id="addOn">增加</a> <a href="###" class="ax-btn ax-primary" id="removeOn">删除</a> <a href="###" class="ax-btn ax-primary" id="settingOn">更新参数</a> <a href="###" class="ax-btn ax-primary" id="clearOn">全部删除</a> <a href="###" class="ax-btn ax-primary" id="destroyOn">销毁</a> <a href="###" class="ax-btn ax-primary" id="initOn">初始化</a>
-
let insOn = new axTags('#insOn', { content: '菲律宾,波兰,荷兰,印度', removable: true, onInit: () => { console.log('初始化了!') } }), addOn = document.querySelector('#addOn'), removeOn = document.querySelector('#removeOn'), settingOn = document.querySelector('#settingOn'), clearOn = document.querySelector('#clearOn'), destroyOn = document.querySelector('#destroyOn'), initOn = document.querySelector('#initOn'); addOn.onclick = () => { insOn.add('中国,马来西亚'); } removeOn.onclick = () => { insOn.remove('波兰,印度'); } clearOn.onclick = () => { insOn.clear(); } settingOn.onclick = () => { insOn.update({ content: '意大利,巴西,俄罗斯,印度', theme: 'danger', }); } destroyOn.onclick = () => { insOn.destroy(); } initOn.onclick = () => { insOn.init(); } insOn.on('add', () => { console.log('增加了!'); }).on('remove', () => { console.log('删除了!'); }).on('clear', () => { console.log('全部清空了!'); }).on('update', () => { console.log('参数更新了!'); }).on('destroy', () => { console.log('销毁了!') });
添加和删除劫持
参数onBeforeAdd
是添加前监听函数,支持一个参数即当前添加的label文本;通过onBeforeAdd参数可劫持input的add事件,使用该参数需要使用add
方法手动添加tag。
参数onBeforeRemove
是删除前监听函数,支持一个参数即当前要删除的项;通过onBeforeRemove参数可劫持input的remove事件,使用该参数需要使用remove
方法手动删除tag。
-
<div id="insStop"></div>
-
new axTags('#insStop', { content: '菲律宾,波兰,荷兰,印度', removable: true, edit: { enable: true }, onBeforeAdd: function (data) { console.log('当前数据:', data); new axDialog({ content: '确定新增tag么?', confirm: { callback: () => { this.add(data); } } }).show(); }, onBeforeRemove: function (data) { console.log('当前数据:', data); new axDialog({ content: '确定删除tag么?', confirm: { callback: () => { this.remove(data); } } }).show(); } });
参数选项
insName: '',//实例名称,对axInstance有用 content: '',//数据源,支持四种格式,包括:一个字符串/对象,一个字符串数组/一个对象数组 theme: '',//主题风格,可填primary、error、success、danger、warning、question、info、text、brief和ignore,默认为空 borderless: false,//是否显示边框,默认false显示,可选择true不显示 compact: false,//是否使用紧凑风格,默认false不使用,可选择true使用 text: false,//是否使用纯文本风格,默认false不使用,可选择true使用 corner: '',//设置单个Tag的圆角,可填round则是圆角,square则是方角,默认为空即是radiu:3px的小圆角 className: '',//其他样式类,多个用空格分开 removeNode: 'i',//关闭按钮的节点名,默认是i,可选择s removable: false,//是否出现关闭按钮并可关闭,默认false不可关闭,可选择true可关闭 separator: ',',//字符串数据分隔符,默认为英文逗号 unique: false,//是否要求添加同唯一值的tag,默认fase不要求,可选择true要求 emptyShow: true,//是否显示空状态,默认true显示,可选择false不显示 emptyTip: '还没有创建标签!',//空提示 edit: { enable: false,//是否显示行内input,默认false不显示,可选择true显示 addable: true,//是否可通过回车新增tag,默认true允许,可选择false不允许 deletable: true,//是否可通过del键删除tag,默认true允许,可选择false不允许 input: '',//默认行内编辑,如果需要外部编辑则需要设置该参数,可以是#id、.className、[name]或输入表单节点,通常是input或textarea placeholder: '输入关键字...',//input的提示文字 }, breakpoints: {},//使用断点以适配终端,详情查看ax-utils-other.php页面 onInit: '',//回调函数,初始化后执行,无参数 onBeforeAdd: '',//使用input添加之前执行,支持一个参数即添加label文本值 onAdd: '',//回调函数,添加后执行,支持一个参数即增加的对象 onBeforeRemove: '',//使用input删除之前执行,支持一个参数即删除的项 onRemove: '',//回调函数,删除后执行,支持一个参数即删除的对象 onUpdate: '',//回调函数,参数更新后执行,无参数 onUClear: '',//回调函数,清零新后执行,无参数 onDestroy: '',//回调函数,销毁后执行,无参数