雪碧图表情包上传评论区

上传表情,不用:smile : 、[微笑]、/微笑这样的字符串转换,也不用多个图片组成li;

利用一张雪碧图,完成所有表情;

富文本编辑技术(即添加contenteditable="true"属性)。用contenteditable="true"属性把div模拟为input、textarea。

/*html页面*/
<div class="commentInDiv">
    <div id="inputBox" class="commentIn" contenteditable="true" placeholder="雁过留名,人过留声!"></div>
    <div class="commentBtn">
        <span class="nullMsg">不能发送空白信息</span>
        <i class="iconfont icon-emoji" onclick="sendEmoji(this)"></i>
        <div class="timiBtn" onclick="sendComment()">评论</div>
    </div>
    <div class="emoji" style="display: none;">
        <div class="emojiBox"></div>
    </div>
</div>

/*emoji图标点击*/
function sendEmoji(e) {
    $(".commentInDiv .emoji").css("display", "block");
    $(".commentInDivNew .emoji").css("display", "none");
    stopBubble(event);
}
/*阻止冒泡函数*/
function stopBubble(e) {
    if (e && e.stopPropagation) {
        e.stopPropagation();
    } else {
        window.event.cancelBubble = true;
    }
}

雪碧图

 

 最终效果

 

/*雪碧图循环*/
window.onload = function () {
    let emojiEle = document.getElementsByClassName("emojiBox")[0];
    console.log(ele)
    let box;
    let i = 1;
    for (let y = 0; y < 5; y++) {//根据图的每行每列的个数,也可以随便取值
        for (let x = 0; x < 8; x++) {
            box = document.createElement("div");
            box.className = "emojiItem";
            box.style.backgroundPositionX = ~((x * 40) - 1) + 'px';
            box.style.backgroundPositionY = ~((y * 40) - 1) + 'px';
            box.id = "emo_" + i;
            emojiEle.appendChild(box);
            i++
        }
    }
}
/*动态生成表情包*/
let commentInDivNew = '<div class="commentInDivNew">' +
                '<div id="inputBoxNew" class="commentIn" contenteditable="true" placeholder="' + '回复:' + jsrNameDom + '"></div>' +
                '<div class="commentBtnNew">' +
                '<span class="nullMsgNew">不能发送空白信息</span>' +
                '<i class="iconfont icon-emoji" onclick="sendEmojiNew(this)"></i>'+
                '<div class="timiBtnNew" onclick="sendReplyComment()">评论</div>' +
                '</div>' +
                '<div class="emoji" style="display: none;">' +
                '<div class="emojiBoxNew">' +
                emojiEle.innerHTML +
                '</div>'+
                '</div>'+
                '</div>';
取emojiEle.innerHTML的值;

/*CSS*/
.emojiItem {
    width: 35px;
    height: 35px;
    background: url('../image/emoji.png');
    background-size: 400px;
    display: inline-block;
    cursor: pointer;
    padding: 2px;
}

/*出现多处表情包弹窗,点击任一处,其他弹窗隐藏*/
window.onclick = function () {
        $(".emoji").css("display", "none");
        document.onclick = null;
}

/*表情包上传到评论区*/
$(".emojiBox").on('click', ".emojiItem", function (e) {
        let imgID = $(this).attr("id");
        let imgStyle = $(this).attr("style");
        $("#inputBox").val("").focus();
        var source = '<div class="emojiItem" id="' + imgID + '" contenteditable="false" style="' + imgStyle + '"></div>';
         _insertimg(source);
    });

表情上传后的光标处理

/*光标处理*/
function _insertimg(data) {
    var selection = window.getSelection ? window.getSelection() : document.selection;
    var range = selection.createRange ? selection.createRange() : selection.getRangeAt(0);
    if (!window.getSelection) {
        document.getElementById('inputBox').focus();
        var selection = window.getSelection ? window.getSelection() : document.selection;
        var range = selection.createRange ? selection.createRange() : selection.getRangeAt(0);
        range.pasteHTML(data);
        range.collapse(false);
        range.select();
    } else {
        document.getElementById('inputBox').focus();
        range.collapse(false);
        var hasR = range.createContextualFragment(data);
        var hasR_lastChild = hasR.lastChild;
        while (hasR_lastChild && hasR_lastChild.nodeName.toLowerCase() == "br" && hasR_lastChild.previousSibling && hasR_lastChild.previousSibling.nodeName.toLowerCase() == "br") {
            var e = hasR_lastChild;
            hasR_lastChild = hasR_lastChild.previousSibling;
            hasR.removeChild(e)
        }
        range.insertNode(hasR);
        if (hasR_lastChild) {
            range.setEndAfter(hasR_lastChild);
            range.setStartAfter(hasR_lastChild)
        }
        selection.removeAllRanges();
        selection.addRange(range)
    }
}

微信聊天框样式示例

#talkbubble {
      width: 120px;
      height: 80px;
      background: red;
      position: relative;
      -moz-border-radius: 10px;
      -webkit-border-radius: 10px;
      border-radius: 10px;
    }
#talkbubble:before {
      content: "";
      position: absolute;
      right: 100%;
      top: 26px;
      width: 0;
      height: 0;
      border-top: 13px solid transparent;
      border-right: 26px solid red;
      border-bottom: 13px solid transparent;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值