emoji

仿微信表情组件。使用前需将文档下方提供的表情雪碧图上传 CDN,再传入表情组件。为提升首次加载表情图片的性能,可通过 image 组件提前触发雪碧图的下载,利用浏览器的缓存机制。在不使用表情面板的页面,可将 emoji 组件隐藏或移出屏幕外,仅使用 parseEmoji 的功能。

安装

  1. npm install @miniprogram-component-plus/emoji

在页面 page.json 中

  1. // page.json
  2. {
  3. "usingComponents": {
  4. "mp-emoji": "@miniprogram-component-plus/emoji"
  5. }
  6. }

属性列表

属性类型默认值必填说明
sourcestring表情雪碧图地址
heightnumber300表情盘高度
background-colorstring#EDEDED表情盘背景色
show-sendbooleantrue是否显示发送按钮
show-delbooleantrue是否显示删除按钮
show-historybooleantrue是否显示最近使用
bindinsertemojieventhandle插入表情,e.detail={emotionName}
binddelemojieventhandle点击删除按钮
bindsendeventhandle点击发送按钮

示例代码

在开发者工具中预览效果

使用方式

点击表情图标将会获得对应的中文含义,例如😊->[微笑]。在实际输入过程中,我们通常仅展示中文含义即可。

对文字和表情混合的评论需要解析后才能展示,组件内提供了 parseEmoji 解析函数,获取方式如下:

  1. // .mp-emoji 为表情组件的选择器
  2. const emojiInstance = this.selectComponent('.mp-emoji')
  3. const emojiNames = emojiInstance.getEmojiNames()
  4. const parseEmoji = emojiInstance.parseEmoji
  5. const comment = '测试[得意][偷笑]文本'
  6. const parsedCommnet = parseEmoji(comment)

解析后的评论结构如下,文字和表情分割构成的数组,type=1 为纯文本,type=2 为表情 iconimageClass 记录了表情在雪碧图上的位置。需注意的是组件开启了 styleIsolation: 'page-shared',组件内样式与页面共享。

  1. [
  2. {type: 1, content: '测试'},
  3. {type: 2, content: '[得意]', imageClass: 'smiley_4'},
  4. {type: 2, content: '[偷笑]', imageClass: 'smiley_20'},
  5. {type: 1, content: '文本'},
  6. ]

由于表情 icon 采用雪碧图生成,展示时可采用如下的结构。需要注意的是每个 icon 的实际大小为 64px,因此在段落中通过 scale 进行缩放,缩放的比例为 行高 / 64。

  1. <view class="comment">
  2. <block wx:for="{{parsedComment}}" wx:key="*this">
  3. <block wx:if="{{item.type === 1}}">{{item.content}}</block>
  4. <view wx:if="{{item.type === 2}}" style="display: inline-block; width: {{lineHeight}}px; height: {{lineHeight}}px">
  5. <view
  6. class="{{item.imageClass}}"
  7. style="background-image: url({{emojiSource}});transform-origin: 0 0; transform: scale({{lineHeight / 64}});">
  8. </view>
  9. </view>
  10. </block>
  11. </view>
  1. .comment {
  2. font-size: 18px;
  3. display: flex;
  4. align-items: center;
  5. flex-wrap: wrap;
  6. line-height: 24px;
  7. }

如何与 input 结合使用,参考示例代码。

表情雪碧图

emoji-sprite