模拟朋友圈项目总结

  1. 实现四种消息类型
    分享消息,单图片消息的模板
/**
 * 分享消息模板
 * @param {object} 分享消息的内容,包含图片和文字 
 * @return {string} 返回html字符串
 */
function shareTpl(share) {
  var htmlText = [];
  htmlText.push('<div class="item-share">');
  htmlText.push('<img class="share-img" src="' + share['pic'] + '">');
  htmlText.push('<p clss="share-tt">' + share['text'] + '</p>');
  htmlText.push('</div>');
  return htmlText.join('');
}


/**
 * 单图片消息模板
 * @param {object} 单图片消息的图片 
 * @return {string} 返回html字符串
 */
function onlyImgTpl(pics) {
  var htmlText = [];
  htmlText.push('<img class="item-only-img" src="' + pics[pics.length - 1] + '" >');
  return htmlText.join('');
}

通过每一条消息的type值进行匹配

switch (content.type) {
    // 多图片消息
    case 0:
        contentHtml = multiplePicTpl(content.pics);
        break;
    case 1:
        // TODO: 实现分享消息
        contentHtml = shareTpl(content.share);
        break;
    case 2:
        // TODO: 实现单张图片消息
        contentHtml = onlyImgTpl(content.pics);
        break;
    case 3:
        // TODO: 实现无图片消息
        contentHtml = '';
        break;
}

在页面渲染函数里,遍历data即可

/**
 * 页面渲染函数:render
 */
function render() {
  // TODO: 目前只渲染了一个消息(多图片信息),需要展示data数组中的所有消息数据。
  var messageHtml = [];
  for (var i = 0; i < data.length; i++) {
    messageHtml.push(messageTpl(data[i], i));
  }

  messageHtml = messageHtml.join('');

  $momentsList.html(messageHtml);
}
四种消息演示.png
  1. 每一条消息都会带有一个回复操作面板,
/*
 *点击回复按钮弹出回复模板
 *@param {Boolean} hasLiked 是否点过赞
 *@return {String} 返回html字符串
 */
function replyPanelTpl(hasLiked) {
  var likeText = hasLiked ? '取消' : '点赞';
  var htmlText = [];
  htmlText.push('<div class="reply-panel">');
  htmlText.push('<div class="like">');
  htmlText.push('<i class="icon-like"></i>');
  htmlText.push('<span class="text-like">' + likeText + '</span>');
  htmlText.push('</div>');
  htmlText.push('<div class="comment">');
  htmlText.push('<i class="icon-comment"></i>');
  htmlText.push('<span class="text-comment">评论</span>');
  htmlText.push('</div>');
  htmlText.push('</div>');

  return htmlText.join('');
}

默认状态均为隐藏,点击时,通过筛选className,通过改变面板的width使其显示,并有一个出现动画

// 弹出回复操作面板
case 'item-reply':
    //隐藏掉所有的回复操作面板和评论框
    hidePanel();
    // 显示当前消息的回复操作面板
    $this.siblings('.reply-panel').css('width', '160px');
    break;
回复按钮功能演示.gif

总结:开始想,只用一个回复操作面板,可以减少html代码量和搜索,用一个全局变量curMomentItem来记录当前想要点赞和评论的是哪一条消息。
后来,考虑到之前老师说要尽量少使用全局变量,于是,采用了每一条消息都有一个回复面板,用增加html代码量的方法取代了。
最终虽然实现了功能,但总感觉有点冗余,不够精简
想请问老师,有没有更好的实现方法?或者在实际开发中,那个会更好?

  1. 实现点赞功能
    当点击了回复面板中的
// 点赞或取消赞
case 'like':
case 'icon-like':
case 'text-like':

    changeLike($this.parents('.moments-item'));
    hidePanel();
    break;

点赞或取消函数

/**
 * 点赞函数
 * @param {object} 点赞目标 
 */
function changeLike($target) {
    // 点赞的消息索引
    var index = $target.attr('data-index');
    // 修改data中的点赞状态
    var like = data[index].reply.hasLiked;
    // 若原来没有点赞,则点赞,
    if (!like) {
        // 修改本人的点赞状态
        data[index].reply.hasLiked = !like;
        // 修改点赞人列表
        data[index].reply.likes.push(userName);
    }
    // 如果原来点赞,则取消点赞
    else {
        // 修改本人的点赞状态 
        data[index].reply.hasLiked = !like;
        // 在点赞人列表中删除本人
        var likeIndex = data[index].reply.likes.indexOf(userName); //找到本人在点赞列表中的索引
        data[index].reply.likes.splice(likeIndex, 1); // 删除
    }


    // 删除原来的点赞列表
    $target.find('.reply-like').remove();
    // 重新渲染点赞列表 
    $target.find('.reply-zone').prepend(likesHtmlTpl(data[index].reply.likes));
    // 修改点赞面板中的文字
    var text = data[index].reply.hasLiked ? '取消' : '点赞';
    $target.find('.text-like').html(text);

}

效果


点赞功能演示.gif.gif

总结:


如上图,当点击左边区域时,都要触发点赞或取消
由于之前的点击事件是通过事件委托的形式实现的,于是,在这里,将点击目标细分为三种,整个div图标以及点赞文字
疑问:如果把这种需要对整个容器都反应的点击是否不使用事件委托会更好?

4.实现增加评论功能
当点击评论时

  // 评论
  case 'comment':
  case 'icon-comment':
  case 'text-comment':
      hidePanel();
      // 展现当前消息的评论框
      $this.parents('.item-right').children('.comment-form').css('display', 'flex');
      // 让当前消息的评论框获得焦点
      $this.parents('.item-right').children('.comment-form').children('.comment-text')[0].focus();

实时检测输入框是否为空

// 评论输入框实时绑定
  $('.comment-text').on('input', function() {

    var $this = $(this);

    if ($this.val()) {

      // 如果内容不为空,则发送按钮背景为绿色,并且可用
      $('.comment-submit').css('background', '#44b00e');
      $('.comment-submit').attr('disabled', false);

    } else {

      // 如果内容为空,则发送按钮背景为灰色,不可用
      $('.comment-submit').css('background', '#808080cc');
      $('.comment-submit').attr('disabled', true);
    }

  });

点击发送按钮

  // 发送评论
  case 'comment-submit':

      commentSubmit($this);
      break;

在输入框按下enter键,同样可以发送消息

// 按下enter鍵自動提交評論
$('.comment-text').on('keydown', function(event) {
    // 判斷按下的是否為enter鍵
    if (event.keyCode === 13) {
        commentSubmit($(this).siblings('.comment-submit'));
    }
});

发送评论函数

/**
 * 評論函数
 * @param {object} 提交按鈕 
 */
function commentSubmit(target) {
    var $this = target;
    // 生成新的评论html代码
    var commentHtml = '<div class="comment-item">' +
        '<a class="reply-who" href="#">' +
        userName +
        '</a>:' +
        $this.siblings('.comment-text').val() +
        '</div>';
    // 找到当前消息的回复评论
    var $replyComment = $this.parents('.item-right').find('.reply-comment');

    // 如果没有评论列表,需要新建一个评论列表框
    if (!$replyComment.length) {

        var replyCommentHtml = '<div class="reply-comment"></div>';
        var $replyZone = $this.parents('.item-right').find('.reply-zone');

        // 新建一个评论列表框
        $replyZone.append(replyCommentHtml);
        $replyComment = $replyZone.children('.reply-comment');


    }

    // 添加新评论
    $replyComment.append(commentHtml);
    // 删除掉输入框里的文字
    $this.siblings('.comment-text').val('');
    // 隐藏评论框
    $('.comment-form').css('display', 'none');

    // 修改消息体,增加当前消息的一条评论
    var index = $this.parents('.moments-item').attr('data-index');
    data[index].reply.comments.push({
        author: userName,
        text: $this.siblings('.comment-text').val()
    });
    console.log(data[index].reply.comments);
}

演示


[图片上传中...(评论演示2.gif-842faa-1537184743106-0)]
评论演示2.gif

总结:评论与点赞相同,也是每一条消息有一个评论框,初始都是隐藏的,直到被点击

4.实现点击放大图片
html代码

<div class="layer">
    <img src="" class="pic-enlarge">
</div>

对应的css代码

.page-moments .layer{
    position: absolute;
    display: block;
    margin: 0 auto;
    top: 0;
    width: 100%;
    max-width: 640px;
    height: 0;
    background: #000;
    z-index: 999;
}

.layer .pic-enlarge{
    width: 100%;
    max-width: 500px;
    max-height: 500px;
    position: fixed;
    top: 50vh;
    left: 50%;
    transform: translate(-50%, -50%);
}

点击处理

 // 放大图片
 case 'pic-item':
 case 'item-only-img':
     hidePanel();
     // 获取页面
     var height = $page.height() + 'px';
     // 设置笼罩层的高度和显示
     $('.layer').css({
         'height': height,
         'display': 'block'
     });
     // 设置放大图片的地址
     $('.pic-enlarge').attr('src', $this.attr('src'));
     break;


 // 隐藏放大图片区域
 case 'layer':
 case 'pic-enlarge':
     hidePanel();
     $('.layer').css('display', 'none');
     break;

总结:主要是并没有设置背景层的高度,想着把高度设成与想个朋友圈页面高度一致,但好像在实际手机中并不需要只要是手机屏幕的高度就可以了,但如果这样子在网页中就没有罩住整个页面,当滚动的时候就会看到下面的消息,所以,在js中,用获取page的高度,设置成一样的。
另外,放大后的图片设置最大高宽为500px,有尝试设置成640px,那样照片放大后有点模糊,所以,改成500px了,于是,就想着上下左右各留一点空隙
不知道这种想法是否正确,还请老师指点。

收获与不足
不足:自己对于jqery的一些方法和属性还不太熟悉
比如children()find(),一开始以为`children()'是找到所有的后代元素,花了好久测试以及搜索才知道原来只是找到直接子元素。

收获:相对地,通过发现自己的不足,把不熟悉的属性通过查资料更加熟悉了,更了解了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,671评论 2 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,226评论 25 707
  • 1 暗恋一个人,是什么感觉呢? 无意听到一首歌的时候,脑海里会浮现出那个人的模样,然后微微笑。 但也会因为看到他和...
    乱扯杂货阅读 218评论 0 2
  • 一年后最糟糕的自己,今天取眼镜的时候突然想到一年后最糟糕的自己是什么样的啦,那就是工作水平跟现在一样平庸没有任何上...
    崴崴阅读 194评论 2 0