微信表情选择

gitee仓库代码

#企微开发使用微信发送自定义欢迎语表情选择#

效果图

组件使用

<template>
  <div id="app">
    <emotion :width="500" :content="content" @getChildInfo="getChildInfo"></emotion>
  </div>
</template>

<script>
import emotion from "./components/emotion/emotion";
export default {
  name: 'App',
  components: {
    emotion
  },
  data(){
    return{
      content:''
    }
  },
  methods:{
    //执行方法
    getChildInfo(value) {
      this.content = value
    },
  }
}
</script>

封装组件

<template>
  <div :style="{width: width + 'px' }">
    <el-input
        style="width: 100%;"
        :rows="10"
        type="textarea"
        placeholder="请输入内容"
        v-model="contentShow"
        :maxlength="maxText"
        @blur="handleInputBlur"
        show-word-limit
        :disabled="disabled"
    ></el-input>
    <div>
      <div class="emoji-box">
        <div @click="handleEmoji" class="cursor emoji-box"><img :src="emoji" alt="">添加表情</div>
        <div v-if="customerStatus" class="btm cursor" @click="addCustomer">客户昵称</div>
      </div>


      <div style="position: relative;" v-show="showEmoji">
        <div v-if="url" :style="{height: height}" class="qqface-container">
          <span class="qqface-wrapper" v-for="[key, value] of Object.entries(emoijs)" :key="value">
            <img :src="url" class="qqface" :class="[`qqface${value}`]" @click="input(key)">
          </span>
        </div>
      </div>

    </div>
    <div v-if="!!contentShowEmoji">
      <h5>效果展示</h5>
      <div class="text-show-box" v-html="contentShowEmoji"></div>
    </div>
  </div>
</template>

<script>
import emoji from "../../utils/emoji";
import qqface from '../../assets/qqface.png'
import { deleteEmoji, qqfaceArr } from '../../utils/util'
export default {
  name: "emotion",
  props: {
    width: {
      type: Number,
      default: 200,
    },
    content: {
      type: String,
      default: '',
    },
    button: {
      type: Boolean
    },
    height: {
      type: String,
      default: '200px'
    },
    maxText:{
      type: Number,
      default: 2000,
    },
    customerStatus:{
      type: Boolean,
      default: false,
    },
    disabled:{
      type: Boolean,
      default: false,
    }
  },
  data() {
    return {
      emoji: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFIGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTktMDQtMjRUMTc6MzA6MzArMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE5LTA0LTI3VDE3OjQ0OjM3KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE5LTA0LTI3VDE3OjQ0OjM3KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmEzMmQ1YjE2LWNkZjUtNDk5My1iMDc2LTg5NDIwMzBjMjIyMiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDphMzJkNWIxNi1jZGY1LTQ5OTMtYjA3Ni04OTQyMDMwYzIyMjIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDphMzJkNWIxNi1jZGY1LTQ5OTMtYjA3Ni04OTQyMDMwYzIyMjIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmEzMmQ1YjE2LWNkZjUtNDk5My1iMDc2LTg5NDIwMzBjMjIyMiIgc3RFdnQ6d2hlbj0iMjAxOS0wNC0yNFQxNzozMDozMCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKE1hY2ludG9zaCkiLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+GUGtVwAAAkZJREFUSIm11j1onVUcx/HPNZKAEBxcfEEQRBShU9SYQCAUOhqTxqTEwamo2RzNXxC6/Okg6ObSJR1Cmwgam4BL2iyaUloEJVIhg/gSV1/Q4YLE4Tk3PPfm3twg5g8PPM95+f7OOf+X8zQODg6cpj1wqnQ8eFxnZg5iujxjeBxN/Iyv8SnWI6LZi9FzB5k5g128hW2cwzAewSul7W3sZub5XpxGpw8ycwCJKSxGxHbvPZKZk/gYnyMi4p9+O0i8jNF+cBVxGy9htMxtszaBzHwNr2IqIv7oB6+J/NmaVxiHdnhExaF7WIiIL08K71jgOK7j6Zbj6zuYw/f/FQ4R8RXuY77VVheYxmrHinYyc7nPqpczc6fWtFpYRwRexK0ujH7J2Oj4vokXWh/1RHsUP9ZHRsRYH7iIeKOj6Sc81k2giSE0M7OJv3DSQtXAUEQ81NlRF/gVT6ictIcLEfHtSeiZeUYVPfBkYaH9fL/BRHnfUIuEE9gsvijvZ3G3m8BnNehHeDMzn+lHLmMW8UFpmi+sIwJreDYzxyNiH+9h8ziR0repqkH7mTmG5woLHcUuM+dwCWMR8Xtmvo4PcQXX8F0Z+jwWcBHvRMRKZj6M23g/Ig4F2mK8dGxgPTOHI2JFFdMDWMHf+A1XVRE2UuDDWMeNOpzuF86Sygd3MrNVrt8tT7djmlSV660yt82O3Ae1ibO4jB9U6b+lSqJBVShOqBz6FJYi4pNunJ4CRWRQVQRnMKLKE/gF91RX5tpxV+axAv+Hnfpfxb9DlNE9K+wyIgAAAABJRU5ErkJggg==',
      list: ['[微笑]', '[撇嘴]', '[色]', '[发呆]', '[得意]', '[流泪]', '[害羞]', '[闭嘴]', '[睡]', '[大哭]', '[尴尬]', '[发怒]', '[调皮]', '[呲牙]', '[惊讶]', '[难过]', '[酷]', '[冷汗]', '[抓狂]', '[吐]', '[偷笑]', '[愉快]', '[白眼]', '[傲慢]', '[饥饿]', '[困]', '[惊恐]', '[流汗]', '[憨笑]', '[悠闲]', '[奋斗]', '[咒骂]', '[疑问]', '[嘘]', '[晕]', '[折磨]', '[衰]', '[骷髅]', '[敲打]', '[再见]', '[擦汗]', '[抠鼻]', '[鼓掌]', '[糗大了]', '[坏笑]', '[左哼哼]', '[右哼哼]', '[哈欠]', '[鄙视]', '[委屈]', '[快哭了]', '[阴险]', '[亲亲]', '[吓]', '[可怜]', '[菜刀]', '[西瓜]', '[啤酒]', '[篮球]', '[乒乓]', '[咖啡]', '[饭]', '[猪头]', '[玫瑰]', '[凋谢]', '[示爱]', '[爱心]', '[心碎]', '[蛋糕]', '[闪电]', '[炸弹]', '[刀]', '[足球]', '[瓢虫]', '[便便]', '[月亮]', '[太阳]', '[礼物]', '[拥抱]', '[强]', '[弱]', '[握手]', '[胜利]', '[抱拳]', '[勾引]', '[拳头]', '[差劲]', '[爱你]', '[NO]', '[OK]', '[爱情]', '[飞吻]', '[跳跳]', '[发抖]', '[怄火]', '[转圈]', '[磕头]', '[回头]', '[跳绳]', '[挥手]', '[激动]', '[街舞]', '[献吻]', '[左太极]', '[右太极]'],
      showEmoji: false,
      contentShow: this.content,
      contentShowEmoji: '',
      emoijs: qqfaceArr,
      url: qqface,//'https://mars-ly-oss.malldongli.com/qqface.png',//'https://cdn-9gvbsn1n5046b67b-1301839800.tcloudbaseapp.com/emojis/qqface.png',
      cursorIndex:null,
    }
  },
  watch: {
    contentShow(newVal, oldVal) {
      this.contentShowEmoji = this.$string2emoji(newVal)
      this.$emit('getChildInfo', newVal)
    },
    content(newVal, oldVal) {
      this.contentShow = newVal
    },
    immediate: true
  },
  created() {
    emoji.toEmotion(this.contentShow)
  },
  mounted() {

  },
  methods: {

    //失去焦点
    handleInputBlur(e){
      this.cursorIndex = e.srcElement.selectionStart;
    },

    input(key){
      let index = this.cursorIndex
      let str = this.contentShow
      this.contentShow = str.slice(0, index) + key + str.slice(index);
      this.cursorIndex =  this.cursorIndex + key.length
    },
    deleteEmoji(){
      this.$emit('input', deleteEmoji(this.value))
    },


    handleEmoji() {
      if (this.disabled) return
      this.showEmoji = !this.showEmoji
    },

    addCustomer(){
      this.contentShow += '#客户昵称#'
    },
  }
}
</script>

<style lang="scss">
.cursor {
  cursor: pointer
}

.text-show-box {
  display: block;
  resize: vertical;
  padding: 5px 15px;
  line-height: 1.5;
  box-sizing: border-box;
  width: 100%;
  font-size: inherit;
  color: #606266;
  background-color: #FFF;
  border: 1px solid #DCDFE6;
  border-radius: 4px;
  transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
  min-height: 200px;
  word-wrap: break-word;
  word-break: break-all;
  white-space: break-spaces;
}


.qqface-container {
  overflow: overlay;
  .qqface-wrapper {
    cursor: pointer;
    display: inline-block;
    transform: scale(1);
    margin: 5px
  }
}

.qqface-wrapper {
  width: 24px;
  height: 24px;
  margin-bottom: -5px;
  position: relative;
  overflow: hidden;
  .qqface {
    width: 280px;
    position: absolute;
    &.qqface0 {
      clip-path: circle(16px at 12px 12px);
    }
    &.qqface1 {
      left: -36px;
      clip-path: circle(16px at 48px 12px);
    }
    &.qqface2 {
      left: -72px;
      clip-path: circle(16px at 84px 12px);
    }
    &.qqface3 {
      left: -109px;
      clip-path: circle(16px at 120px 12px);
    }
    &.qqface4 {
      left: -145px;
      clip-path: circle(16px at 158px 12px);
    }
    &.qqface5 {
      left: -182px;
      clip-path: circle(16px at 194px 12px);
    }
    &.qqface6 {
      left: -219px;
      clip-path: circle(16px at 230px 12px);
    }
    &.qqface7 {
      left: -256px;
      clip-path: circle(16px at 266px 12px);
    }
    &.qqface8 {
      top: -36px;
      clip-path: circle(16px at 12px 48px);
    }
    &.qqface9 {
      top: -36px;
      left: -36px;
      clip-path: circle(16px at 48px 48px);
    }
    &.qqface10 {
      top: -36px;
      left: -72px;
      clip-path: circle(16px at 84px 48px);
    }
    &.qqface11 {
      top: -36px;
      left: -110px;
      clip-path: circle(16px at 120px 48px);
    }
    &.qqface12 {
      top: -36px;
      left: -146px;
      clip-path: circle(16px at 158px 48px);
    }
    &.qqface13 {
      top: -36px;
      left: -182px;
      clip-path: circle(16px at 194px 48px);
    }
    &.qqface14 {
      top: -36px;
      left: -219px;
      clip-path: circle(16px at 230px 48px);
    }
    &.qqface15 {
      top: -36px;
      left: -256px;
      clip-path: circle(16px at 266px 48px);
    }
    &.qqface17 {
      top: -74px;
      clip-path: circle(16px at 12px 84px);
    }
    &.qqface18 {
      top: -74px;
      left: -36px;
      clip-path: circle(16px at 48px 84px);
    }
    &.qqface19 {
      top: -74px;
      left: -72px;
      clip-path: circle(16px at 84px 84px);
    }
    &.qqface20 {
      top: -74px;
      left: -109px;
      clip-path: circle(16px at 120px 84px);
    }
    &.qqface21 {
      top: -74px;
      left: -145px;
      clip-path: circle(16px at 158px 84px);
    }
    &.qqface22 {
      top: -74px;
      left: -182px;
      clip-path: circle(16px at 194px 84px);
    }
    &.qqface23 {
      top: -74px;
      left: -219px;
      clip-path: circle(16px at 230px 84px);
    }
    &.qqface25 {
      top: -74px;
      left: -256px;
      clip-path: circle(16px at 266px 84px);
    }
    &.qqface26 {
      top: -110px;
      clip-path: circle(16px at 12px 121px);
    }
    &.qqface28 {
      top: -110px;
      left: -36px;
      clip-path: circle(16px at 48px 121px);
    }
    &.qqface29 {
      top: -110px;
      left: -72px;
      clip-path: circle(16px at 84px 121px);
    }
    &.qqface31 {
      top: -110px;
      left: -110px;
      clip-path: circle(16px at 120px 121px);
    }
    &.qqface32 {
      top: -110px;
      left: -146px;
      clip-path: circle(16px at 158px 121px);
    }
    &.qqface33 {
      top: -110px;
      left: -182px;
      clip-path: circle(16px at 194px 121px);
    }
    &.qqface34 {
      top: -110px;
      left: -219px;
      clip-path: circle(16px at 230px 121px);
    }
    &.qqface36 {
      top: -110px;
      left: -256px;
      clip-path: circle(16px at 266px 121px);
    }
    &.qqface37 {
      top: -147px;
      clip-path: circle(16px at 12px 157px);
    }
    &.qqface38 {
      top: -147px;
      left: -36px;
      clip-path: circle(16px at 48px 157px);
    }
    &.qqface39 {
      top: -147px;
      left: -73px;
      clip-path: circle(16px at 85px 160px);
    }
    &.qqface40 {
      top: -147px;
      left: -109px;
      clip-path: circle(16px at 120px 157px);
    }
    &.qqface41 {
      top: -147px;
      left: -145px;
      clip-path: circle(16px at 158px 157px);
    }
    &.qqface42 {
      top: -147px;
      left: -183px;
      clip-path: circle(16px at 194px 157px);
    }
    &.qqface44 {
      top: -147px;
      left: -219px;
      clip-path: circle(16px at 230px 157px);
    }
    &.qqface46 {
      top: -147px;
      left: -256px;
      clip-path: circle(16px at 266px 157px);
    }
    &.qqface48 {
      top: -184px;
      clip-path: circle(16px at 12px 196px);
    }
    &.qqface49 {
      top: -184px;
      left: -36px;
      clip-path: circle(16px at 48px 196px);
    }
    &.qqface50 {
      top: -184px;
      left: -72px;
      clip-path: circle(16px at 84px 196px);
    }
    &.qqface51 {
      top: -184px;
      left: -109px;
      clip-path: circle(16px at 120px 196px);
    }
    &.qqface52 {
      top: -184px;
      left: -145px;
      clip-path: circle(16px at 158px 196px);
    }
    &.qqface54 {
      top: -184px;
      left: -182px;
      clip-path: circle(16px at 194px 196px);
    }
    &.qqface53 {
      top: -184px;
      left: -219px;
      clip-path: circle(16px at 230px 196px);
    }
    &.qqface47 {
      top: -184px;
      left: -256px;
      clip-path: circle(16px at 266px 198px);
    }
    &.qqface35 {
      top: -222px;
      clip-path: circle(16px at 12px 234px);
    }
    &.qqface16 {
      top: -222px;
      left: -36px;
      clip-path: circle(16px at 48px 234px);
    }
    &.qqface45 {
      top: -222px;
      left: -72px;
      clip-path: circle(16px at 84px 234px);
    }
    &.qqface24 {
      top: -222px;
      left: -109px;
      clip-path: circle(16px at 120px 234px);
    }
    &.qqface27 {
      top: -222px;
      left: -145px;
      clip-path: circle(16px at 158px 234px);
    }
    &.qqface30 {
      top: -222px;
      left: -182px;
      clip-path: circle(16px at 194px 234px);
    }
    &.qqface43 {
      top: -222px;
      left: -219px;
      clip-path: circle(16px at 230px 234px);
    }
    &.qqface55 {
      top: -222px;
      left: -256px;
      clip-path: circle(16px at 266px 234px);
    }
    &.qqface56 {
      top: -258px;
      clip-path: circle(16px at 12px 270px);
    }
    &.qqface57 {
      top: -258px;
      left: -36px;
      clip-path: circle(16px at 48px 270px);
    }
    &.qqface58 {
      top: -258px;
      left: -72px;
      clip-path: circle(16px at 84px 270px);
    }
    &.qqface59 {
      top: -258px;
      left: -109px;
      clip-path: circle(16px at 120px 270px);
    }
    &.qqface60 {
      top: -258px;
      left: -145px;
      clip-path: circle(16px at 158px 270px);
    }
    &.qqface61 {
      top: -258px;
      left: -182px;
      clip-path: circle(16px at 194px 270px);
    }
    &.qqface62 {
      top: -258px;
      left: -219px;
      clip-path: circle(16px at 230px 270px);
    }
    &.qqface74 {
      top: -258px;
      left: -256px;
      clip-path: circle(16px at 266px 270px);
    }
    &.qqface63 {
      top: -294px;
      clip-path: circle(16px at 12px 306px);
    }
    &.qqface64 {
      top: -294px;
      left: -36px;
      clip-path: circle(16px at 48px 306px);
    }
    &.qqface65 {
      top: -294px;
      left: -72px;
      clip-path: circle(16px at 84px 306px);
    }
    &.qqface66 {
      top: -294px;
      left: -109px;
      clip-path: circle(16px at 120px 306px);
    }
    &.qqface67 {
      top: -294px;
      left: -145px;
      clip-path: circle(16px at 158px 306px);
    }
    &.qqface68 {
      top: -294px;
      left: -182px;
      clip-path: circle(16px at 194px 306px);
    }
    &.qqface69 {
      top: -294px;
      left: -219px;
      clip-path: circle(16px at 230px 306px);
    }
    &.qqface70 {
      top: -294px;
      left: -256px;
      clip-path: circle(16px at 266px 306px);
    }
    &.qqface71 {
      top: -330px;
      clip-path: circle(16px at 12px 342px);
    }
    &.qqface72 {
      top: -330px;
      left: -36px;
      clip-path: circle(16px at 48px 342px);
    }
    &.qqface73 {
      top: -330px;
      left: -73px;
      clip-path: circle(16px at 84px 342px);
    }
    &.qqface75 {
      top: -330px;
      left: -109px;
      clip-path: circle(16px at 120px 342px);
    }
    &.qqface76 {
      top: -330px;
      left: -145px;
      clip-path: circle(16px at 158px 342px);
    }
    &.qqface77 {
      top: -330px;
      left: -182px;
      clip-path: circle(16px at 194px 342px);
    }
    &.qqface78 {
      top: -330px;
      left: -219px;
      clip-path: circle(16px at 230px 342px);
    }
    &.qqface79 {
      top: -330px;
      left: -256px;
      clip-path: circle(16px at 266px 342px);
    }
    &.qqface80 {
      top: -366px;
      clip-path: circle(16px at 12px 378px);
    }
    &.qqface81 {
      top: -366px;
      left: -36px;
      clip-path: circle(16px at 48px 378px);
    }
    &.qqface82 {
      top: -366px;
      left: -72px;
      clip-path: circle(16px at 84px 378px);
    }
    &.qqface83 {
      top: -366px;
      left: -109px;
      clip-path: circle(16px at 120px 378px);
    }
    &.qqface84 {
      top: -366px;
      left: -145px;
      clip-path: circle(16px at 158px 378px);
    }
    &.qqface85 {
      top: -366px;
      left: -182px;
      clip-path: circle(16px at 194px 378px);
    }
    &.qqface86 {
      top: -366px;
      left: -219px;
      clip-path: circle(16px at 230px 378px);
    }
    &.qqface87 {
      top: -366px;
      left: -256px;
      clip-path: circle(16px at 266px 378px);
    }
    &.qqface88 {
      top: -404px;
      clip-path: circle(16px at 12px 416px);
    }
    &.qqface89 {
      top: -404px;
      left: -36px;
      clip-path: circle(16px at 48px 416px);
    }
    &.qqface90 {
      top: -404px;
      left: -72px;
      clip-path: circle(16px at 84px 416px);
    }
    &.qqface91 {
      top: -404px;
      left: -109px;
      clip-path: circle(16px at 120px 416px);
    }
    &.qqface92 {
      top: -404px;
      left: -145px;
      clip-path: circle(16px at 158px 416px);
    }
    &.qqface93 {
      top: -404px;
      left: -182px;
      clip-path: circle(16px at 194px 416px);
    }
    &.qqface94 {
      top: -404px;
      left: -219px;
      clip-path: circle(16px at 230px 416px);
    }
    &.qqface95 {
      top: -404px;
      left: -256px;
      clip-path: circle(16px at 267px 416px);
    }
    &.qqface96 {
      top: -441px;
      clip-path: circle(16px at 12px 452px);
    }
    &.qqface97 {
      top: -441px;
      left: -36px;
      clip-path: circle(16px at 48px 452px);
    }
    &.qqface98 {
      top: -441px;
      left: -72px;
      clip-path: circle(16px at 84px 452px);
    }
    &.qqface99 {
      top: -441px;
      left: -109px;
      clip-path: circle(16px at 120px 452px);
    }
    &.qqface100 {
      top: -441px;
      left: -145px;
      clip-path: circle(16px at 158px 452px);
    }
    &.qqface101 {
      top: -441px;
      left: -182px;
      clip-path: circle(16px at 194px 452px);
    }
    &.qqface102 {
      top: -441px;
      left: -219px;
      clip-path: circle(16px at 230px 452px);
    }
    &.qqface103 {
      top: -441px;
      left: -256px;
      clip-path: circle(16px at 266px 452px);
    }
    &.qqface104 {
      top: -477px;
      clip-path: circle(16px at 12px 489px);
    }
    &.qqface105 {
      top: -477px;
      left: -36px;
      clip-path: circle(16px at 48px 489px);
    }
    &.qqface106 {
      top: -477px;
      left: -72px;
      clip-path: circle(16px at 84px 489px);
    }
    &.qqface107 {
      top: -477px;
      left: -109px;
      clip-path: circle(16px at 120px 489px);
    }
    &.qqface108 {
      top: -477px;
      left: -145px;
      clip-path: circle(16px at 158px 489px);
    }
  }
  &:after {
    content: "";
  }
}


.picker-button {
  position: absolute;
  right: 20px;
  bottom: 20px;
  background: #fff;
  padding: 10px 20px 4px 20px;
  border-radius: 6px;
}
.emoji-box{
  display: flex;
  align-items: center;
}
.btm{
  width: auto;
  height: 26px;
  line-height: 20px;
  padding: 2px 4px;
  border-radius: 4px;
  margin-left: 10px;
  background-color: #ecf5ff;
  color: #409eff;
  border: 1px solid #d9ecff;
}
</style>

emoji.js

function toEmotion(text, isNoGif) {
  var list = ['微笑', '撇嘴', '色', '发呆', '得意', '流泪', '害羞', '闭嘴', '睡', '大哭', '尴尬', '发怒', '调皮', '呲牙', '惊讶', '难过', '酷', '冷汗', '抓狂', '吐', '偷笑', '愉快', '白眼', '傲慢', '饥饿', '困', '惊恐', '流汗', '憨笑', '悠闲', '奋斗', '咒骂', '疑问', '嘘', '晕', '折磨', '衰', '骷髅', '敲打', '再见', '擦汗', '抠鼻', '鼓掌', '糗大了', '坏笑', '左哼哼', '右哼哼', '哈欠', '鄙视', '委屈', '快哭了', '阴险', '亲亲', '吓', '可怜', '菜刀', '西瓜', '啤酒', '篮球', '乒乓', '咖啡', '饭', '猪头', '玫瑰', '凋谢', '示爱', '爱心', '心碎', '蛋糕', '闪电', '炸弹', '刀', '足球', '瓢虫', '便便', '月亮', '太阳', '礼物', '拥抱', '强', '弱', '握手', '胜利', '抱拳', '勾引', '拳头', '差劲', '爱你', 'NO', 'OK', '爱情', '飞吻', '跳跳', '发抖', '怄火', '转圈', '磕头', '回头', '跳绳', '挥手', '激动', '街舞', '献吻', '左太极', '右太极', '嘿哈', '捂脸', '奸笑', '机智', '皱眉', '耶', '红包', '鸡'];
  if (!text) {
    return text;
  }
  text = text.replace(/\[[\u4E00-\u9FA5]{1,3}\]|\[NO\]|\[OK\]/gi, function (word) {
    var newWord = word.replace(/\[|\]/gi, '');
    var index = list.indexOf(newWord);
    var backgroundPositionX = -index * 24
    var imgHTML = '';
    if (index < 0) {
      return word;
    }
    if (isNoGif) {
      if (index > 104) {
        return word;
      }
      imgHTML = `<i class="static-emotion" style="background:url(https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/default218877.gif) ${backgroundPositionX}px 0;"></i>`
    } else {
      var path = index > 104 ? '/img' : 'https://res.wx.qq.com/mpres/htmledition/images/icon';
      imgHTML = `<img class="static-emotion-gif" style="vertical-align: middle" src="${path}/emotion/${index}.gif">`
    }
    return imgHTML;
  });
  return text;
}

export default {
  toEmotion
}

util.js

export const qqfaceArr = {
    '[微笑]': '0',
    '[撇嘴]': '1',
    '[色]': '2',
    '[发呆]': '3',
    '[得意]': '4',
    '[流泪]': '5',
    '[害羞]': '6',
    '[闭嘴]': '7',
    '[睡]': '8',
    '[大哭]': '9',
    '[尴尬]': '10',
    '[发怒]': '11',
    '[调皮]': '12',
    '[呲牙]': '13',
    '[惊讶]': '14',
    '[难过]': '15',
    '[破涕为笑]': '16',
    '[囧]': '17',
    '[抓狂]': '18',
    '[吐]': '19',
    '[偷笑]': '20',
    '[愉快]': '21',
    '[白眼]': '22',
    '[傲慢]': '23',
    '[失望]': '24',
    '[困]': '25',
    '[惊恐]': '26',
    '[无语]': '27',
    '[憨笑]': '28',
    '[悠闲]': '29',
    '[嘿哈]': '30',
    '[咒骂]': '31',
    '[疑问]': '32',
    '[嘘]': '33',
    '[晕]': '34',
    '[脸红]': '35',
    '[衰]': '36',
    '[骷髅]': '37',
    '[敲打]': '38',
    '[再见]': '39',
    '[擦汗]': '40',
    '[抠鼻]': '41',
    '[鼓掌]': '42',
    '[捂脸]': '43',
    '[坏笑]': '44',
    '[恐惧]': '45',
    '[右哼哼]': '46',
    '[生病]': '47',
    '[鄙视]': '48',
    '[委屈]': '49',
    '[快哭了]': '50',
    '[阴险]': '51',
    '[亲亲]': '52',
    '[笑脸]': '53',
    '[可怜]': '54',
    '[奸笑]': '55',
    '[机智]': '56',
    '[皱眉]': '57',
    '[耶]': '58',
    '[吃瓜]': '59',
    '[加油]': '60',
    '[汗]': '61',
    '[天啊]': '62',
    '[社会社会]': '63',
    '[旺柴]': '64',
    '[好的]': '65',
    '[打脸]': '66',
    '[哇]': '67',
    '[翻白眼]': '68',
    '[666]': '69',
    '[让我看看]': '70',
    '[叹气]': '71',
    '[苦涩]': '72',
    '[裂开]': '73',
    '[Emm]': '74',
    '[嘴唇]': '75',
    '[爱心]': '76',
    '[心碎]': '77',
    '[拥抱]': '78',
    '[强]': '79',
    '[弱]': '80',
    '[握手]': '81',
    '[胜利]': '82',
    '[抱拳]': '83',
    '[勾引]': '84',
    '[拳头]': '85',
    '[OK]': '86',
    '[合十]': '87',
    '[啤酒]': '88',
    '[咖啡]': '89',
    '[蛋糕]': '90',
    '[玫瑰]': '91',
    '[凋谢]': '92',
    '[菜刀]': '93',
    '[炸弹]': '94',
    '[便便]': '95',
    '[月亮]': '96',
    '[太阳]': '97',
    '[庆祝]': '98',
    '[礼物]': '99',
    '[红包]': '100',
    '[發]': '101',
    '[福]': '102',
    '[烟花]': '103',
    '[爆竹]': '104',
    '[猪头]': '105',
    '[跳跳]': '106',
    '[发抖]': '107',
    '[转圈]': '108'
  }
  export const reverseEmoijMap = {}
  const keys = Object.keys(qqfaceArr)
  for (const key of keys) {
    reverseEmoijMap[qqfaceArr[key]] = key
  }
  
  export function genString2emoji (url) {
    return words => {
      const keys = words.match(/\[(.+?)\]/g) || []
    let result = words
    for (const key of keys) {
      if (qqfaceArr[key]) {
        result = result.replace(new RegExp(`\\[${key.slice(1, -1)}\\]`, 'g'), `<span style="display: inline-block;" class="qqface-wrapper"><img src="${url}" class="qqface qqface${qqfaceArr[key]}"></span>`)
      }
    }
    console.log(result, keys)
    return result
    }
  }
  
  export function emoji2string (words) {
    let result = words.replace(new RegExp(`<span[^>]+><img [^>]*? class="qqface qqface(\\d+?)"[^>]*></span>`, 'g'), (match, offset) => {
      return reverseEmoijMap[offset]
    })
    return result
  }

  export function deleteEmoji(text) {
    const reg = /\[[^\]]+?\]$/
    if(reg.test(text)){
      return text.replace(reg, '')
    }else if(text){
      return text.slice(0, -1)
    }
  }

install.js

import qqface from '../assets/qqface.png'
import { emoji2string, genString2emoji } from "./util";

const plugins = {
 install(Vue, options) {
  // Let's register our component globally
  // https://vuejs.org/v2/guide/components-registration.html
  const url = options && options.url || qqface
  Vue.prototype.$string2emoji = genString2emoji(url)
  Vue.prototype.$emoji2string = emoji2string
 }
};

// Automatic installation if Vue has been added to the global scope.
if (typeof window !== 'undefined' && window.Vue) {
    window.Vue.use(plugins);
}

export default plugins;

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值