这是学javascript做的项目,用到了jQuery。
思路:
因为整体朋友圈的界面是由信息遍历渲染得到的,在每条信息的div内部创建子元素‘回复弹出界面’和‘评论输入和发送界面’,每条信息有自己的索引,在click事件绑定之后,根据索引对相应数据的内容进行改动,再重新渲染到界面上,从而达到点赞和评论的效果。

<1>整体效果,数据遍历渲染

效果如图:

描述:
分为四种消息类型-多图片、分享、单图片、纯文字。
先设置各种消息的html模板,再遍历数据渲染后生成整个朋友圈。

实现代码:
①各个消息的模板

/*** 多张图片消息模版* @param {Object} pics 多图片消息的图片列表* @return {String} 返回html字符串*/
function multiplePicTpl(pics) {var htmlText = [];htmlText.push('<ul class="item-pic">');for (var i = 0, len = pics.length; i < len; i++) {htmlText.push('<img class="pic-item" src="' + pics[i] + '">')}htmlText.push('</ul>');return htmlText.join('');
}
/*** 分享消息模版* @param {Object} share 分享的图片和信息* @return {String} 返回html字符串*/
function shareTpl(share) {var htmlText = [];htmlText.push('<div class="item-share">');htmlText.push('<img class="sharepic" src="' + share.pic + '">');htmlText.push('<span class="sharetext">' + share.text + '</span>');htmlText.push('</div>');return htmlText.join('');
}
/*** 单图片消息模版* @param {Object} pics 单图片消息的图片* @return {String} 返回html字符串*/
function singlePicTpl(pics) {var htmlText = [];htmlText.push('<img class="singlepic" src="' + pics + '">');return htmlText.join('');
}

②switch语句判断消息类型

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

③遍历渲染

/*** 页面渲染函数:render*/
function render() {// 使用遍历,将data数组中的每个消息都渲染一次var messageHtml = [];for(var i = 0;i < data.length; i++){messageHtml.push(messageTpl(data[i]));}messageHtml = messageHtml.join('');$momentsList.html(messageHtml);
}

<2>点赞评论弹出窗口

效果如图:

描述:
点击朋友圈消息下的按钮,会弹出点赞评论窗口,该窗口同一时间时只能存在一个,点击朋友圈其他地方的时候会隐藏点赞评论窗口。

实现代码:
①点赞评论窗口的HTML结构

/*** 弹出点赞和评论按钮* @param {Boolean} hasLiked 是否已点赞* @return {String} 返回html字符串*/
function panelTpl(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('');
}

②在每条消息的HTML中间插入点赞评论窗口

  // 点赞和评论界面htmlText.push(panelTpl(messageData.reply.hasLiked));

③绑定click事件

  var $replypanel = $('.reply-panel');$replypanel.hide();// 鼠标点击回复按钮弹出点赞和评论的窗口$('.moments-item').on('click','.item-reply',function(){// 显示当前消息的回复操作面板event.stopPropagation();//阻止 click 事件冒泡到父元素$commentArea.animate({height:"hide"},1);$('.reply-panel').animate({width:"hide"},150);$(this).siblings('.reply-panel').animate({width:"show"},150);});

PS:做得略有瑕疵。

<3>点赞和取消点赞

效果如图:

描述:
点击点赞按钮的时候,在下面点赞列表里会出现自己的用户名,同时点赞评论窗口的点赞变成取消,隐藏点赞评论窗口。
点击取消按钮的时候,就会从点赞列表里删除自己的用户名,同时点赞评论窗口的取消变成点赞,隐藏点赞评论窗口。

实现代码:
①点赞函数

/*** 点赞函数* @param {object} 点赞目标*/
function clickLike($target){// 创建数据索引var index = $target.attr('data-index');// 创建点赞状态var like = data[index].reply.hasLiked;// 如果like为false,即未点赞,进行点赞操作if(!like){// 改变数据中的点赞状态为truedata[index].reply.hasLiked = !like;// 在数据中的点赞用户列表中加入自己的用户名data[index].reply.likes.push(userName);}// 如果like为true,即已点赞,进行取消点赞操作else{// 改变数据中的点赞状态为falsedata[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));// 修改reply-panel中点赞按钮的文字var text = data[index].reply.hasLiked ? '取消' : '点赞';$target.find('.text-like').html(text);
}

②click事件绑定

  // 鼠标点击点赞按钮进行点赞和取消点赞的操作$('.moments-item').on('click','.like',function(){event.stopPropagation();clickLike($(this).parents('.moments-item'));$replypanel.animate({width:"hide"},150);});

<4>评论

效果如图:

描述:
点击评论按钮的时候,在视窗的最下方出现input窗口,输入想要评论的内容点击发送或者按键盘上的enter键后,该条消息下方的评论列表会以“自己的用户名:input的内容”的样式出现刚才输入的评论。

实现代码:
①评论函数

/*** 评论函数* @param {object} 评论目标*/
function sendComment($target){// 创建数据索引var index = $target.attr('data-index');// 如果评论输入框内有文字,则将输入的文字添加至data中的comments中if($target.find('.comment-text').val()){data[index].reply.comments.push({author: userName,text: $target.find('.comment-text').val()});}// 刷新评论用户列表$target.find('.reply-comment').remove();$target.find('.reply-zone').append(commentsHtmlTpl(data[index].reply.comments));// 隐藏评论界面$target.find('.comment-area').animate({height:"hide"},1);
}

②click事件绑定

  // 鼠标点击评论按钮进行评论的操作$('.moments-item').on('click','.comment',function(){event.stopPropagation();$replypanel.animate({width:"hide"},150);$(this).parents('.moments-item').find('.comment-area').animate({height:"toggle"},1);$(this).parents('.moments-item').find('.comment-text')[0].focus();});// 鼠标点击发送按钮发送评论$('.moments-item').on('click','.comment-send',function(){if($(this).siblings('.comment-text').val()){sendComment($(this).parents('.moments-item'));$(this).siblings('.comment-text').val('');$(this).css('background', '#dfdfdf');$(this).css('cursor','auto');$(this).attr('disabled', true);}});

③键盘事件绑定

  // 键盘输入$('.comment-text').on('keydown', function(event) {// 按enter键等同于点击发送按钮if(event.keyCode === 13) {if($(this).val()){sendComment($(this).parents('.moments-item'));$(this).val('');$(this).siblings('.comment-send').css('background', '#dfdfdf');$(this).siblings('.comment-send').css('cursor','auto');$(this).siblings('.comment-send').attr('disabled', true);}}});

<5>评论输入界面的设置

效果如图:

描述:
点击评论按钮后评论输入界面弹出,input框获得焦点,未输入文字前发送按钮是灰色的且不可用,输入文字之后发送按钮变成绿色且可用。鼠标点击除评论输入界面的其他地方会隐藏该界面,Input框的内容会缓存,下次出现时之前输入的内容还在input框内。

实现代码:
①评论输入界面的HTML结构

  // 评论输入和发送界面htmlText.push('<div class="comment-area">');htmlText.push('<input type="text" class="comment-text" placeholder="评论内容">');htmlText.push('<button class="comment-send">发送</button>');htmlText.push('</div>');

②事件绑定

  // 评论输入框绑定$('.comment-text').on('input',function(){if($(this).val()){$(this).siblings('.comment-send').css('background', '#3CB035');$(this).siblings('.comment-send').css('cursor','pointer');$(this).siblings('.comment-send').attr('disabled', false);}else{$(this).siblings('.comment-send').css('background', '#dfdfdf');$(this).siblings('.comment-send').css('cursor','auto');$(this).siblings('.comment-send').attr('disabled', true);}});

③优化

  /*** 优化: 点击不是回复按钮的地方则隐藏replypanel块*/$('body').on('click', function(event) {var target = event.target;if(target.className !== 'reply-panel'){$replypanel.animate({width:"hide"},150);}if(target.className !== 'comment-area' && target.className !== 'comment-text' && target.className !== 'comment-send'){$commentArea.animate({height:"hide"},1);}});

<6>放大查看图片

效果如图:

描述:
鼠标点击图片的时候,图片以黑色为背景放大居中显示,在页面的最上层,覆盖其他所有的元素。
再次点击任意处即可返回之前的朋友圈界面。

实现代码:
①HTML结构

<!-- 创建容纳放大图片的DIV -->
<div class="background"><img src="" class="bigger-pic">
</div>

②CSS样式

/*放大图片的CSS样式*/
.background{position: absolute;display: block;margin: 0 auto;top: 0;width: 100%;max-width: 640px;height: 0;background: #000;z-index: 4;
}
.background .bigger-pic{width: 100%;max-width: 640px;position: fixed;top: 50vh;left: 50%;transform: translate(-50%, -50%);
}

③click事件绑定

  // 图片放大显示$('.moments-item').on('click','.pic-item',function(){var height = $page.height() + 'px';$('.background').css({'height': height,'display': 'block'});$('.bigger-pic').attr('src',$(this).attr('src'));});$('.moments-item').on('click','.singlepic',function(){var height = $page.height() + 'px';$('.background').css({'height': height,'display': 'block'});$('.bigger-pic').attr('src',$(this).attr('src'));});// 图片隐藏$('.page-moments').on('click','.background',function(){$(this).css('display','none');});

总结:
总是把简单的事情想复杂化,之前想了很久怎做弹出的界面,钻了牛角尖,等做出一个来之后,后面的要求就慢慢都会了,要把基础打牢,求精不求快。

web学习-项目练习-No.4-朋友圈相关推荐

  1. java web学习项目20套源码完整版

    java web学习项目20套源码完整版 自己收集的各行各业的都有,这一套源码吃遍所有作业项目! 1.BBS论坛系统(jsp+sql) 2.ERP管理系统(jsp+servlet) 3.OA办公自动化 ...

  2. 拳王虚拟项目公社:微信朋友圈卖虚拟资源教程怎么做,月入过万发方法

    众所周知,微信现在已经成为了营销的热土,10亿的微信用户摆在那里呢.那么拳王今天又来说说用微信朋友圈卖教程的项目. 这个项目虽然单卖的利润不高,但是我们又不需要成本,每天的工作时间也很充裕,只需要在朋 ...

  3. 农村信息综合展示平台(微信网页)项目开发笔记三——朋友圈开发遇到的问题

    本篇记录在朋友圈功能页面中实现图片点击放大查看的功能,遇到了的问题 本系统是使用Vux库因此,为实现查看图片的功能就使用了Vux自带的Previewer,如何使用在这里就不多说,之间查看Vux文档. ...

  4. 1.2w星!火爆GitHub的Python学习100天刷爆朋友圈!

    Python的火不容置疑! 2018年起,凭借应用广效率高的特点,Python将 Java 和 C++甩出身后,很多人开始学习Python. 但试问,怎样学Python,才不会入门即放弃?从小白成为大 ...

  5. 如何利用朋友圈学习和提升自己?

    大多数人都开通着朋友圈,即使不经常发,也会时不时的点击刷一下,生怕错过了天下大事.但往往刷了朋友圈也就刷了,看一乐呵. 既然在朋友圈已经花时间了,那么,是否可以利用它来刷新一些认知.学习一些技能.激励 ...

  6. 揭秘朋友圈发现的一个裂变引流套路

    目前在流量被各个平台分散.稀释的情况下,如何获取流量,获取精准流量无疑是不少网络从业者谈论不绝的一个话题,获取流量有方法吗?有!博客分享了不下百个小众可能偏时效性的引流方式方法或者一些精彩的案例剖析, ...

  7. uni-app - H5 公众号网页分享到微信朋友圈 / 转发分享给朋友好友 / 分享到手机 QQ / 分享到 QQ 空间,给微信分享卡片设置图标、标题、描述文字等(JS-SDK 通用解决方案放心用)

    前言 如果您是纯 Vue.js 项目(或 Nuxt.js),请访问 Vue - 最新网页 H5 分享到微信朋友圈 / 转发分享好友 这篇详细教程. 目前网上大部分教程都过时了(老版本.无效),并且未对 ...

  8. 微商发朋友圈有何技巧?

    微商发朋友圈有何技巧? 如出一辙的微商朋友圈发圈方式,让很多人都不胜厌烦,看得多了也就开始反感了.一旦别人慢慢进入反感状态,跟随而来的有可能就是屏蔽或拉黑你!这也是目前大多微商都存在的一个难点. 那微 ...

  9. 【朋友圈精选】web前端招聘面试的10个小分享

    web前端教程 用大白话,来讲编程 上一篇<敲得慢一点,学得快一点>也提到了,上个月给团队招纳贤才的时候,面试过程中总结了一些想法见和笑料,在微信朋友圈和大家分享了.希望给马上毕业找工作或 ...

最新文章

  1. cnc加工中心保养表_CNC数控加工中心,硬轨的好还是线轨的好?
  2. iscsi lun extend---windows客户端
  3. 43 | 发挥人的潜能:探索式测试
  4. ubuntu 设置root启动
  5. mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比,于是写了个插件。
  6. c语言变量名必须用小写 常量用大写,day02 -C语言 常量 变量 数据类型 进制转换 数据溢出...
  7. javq接口_Java的接口及实例
  8. php无法查询mysql字母,php – 无法在Multi MYSQL查询语句中获取结果
  9. typora.io使用教程
  10. Visual C#.Net网络程序开发-Tcp篇(1)
  11. 运行HelloJersey遇到异常解决方法
  12. ==与===的区别 与类型转换
  13. java坦克大战图片素材包,坦克大战素材包
  14. springboot电子阅览室app毕业设计源码016514
  15. 【论文复现】ReLU、Leaky ReLU、PReLU、RReLU实验对比(2015)
  16. 使用特征传播重构缺失数据进行图机器学习
  17. 使用MNE工具包处理脑电数据(1)基础处理总览(EEG、MEG、ERP研究)
  18. 南通市户口迁移(市外)
  19. 基于电流型磁链观测器的异步电机矢量控制学习
  20. 金蝶旗舰版4.0 供应链期末结账提示内存溢出

热门文章

  1. 使用spire.pdf.free缩小过大的pdf页面
  2. 71个简单的做饭技巧
  3. java 正斜杠与反斜杠之分
  4. 太极图(JAVA实现)
  5. 钢琴节奏时值测试软件,这些钢琴曲可以测试出你的钢琴水平达到哪个阶段?
  6. Quadro P5200 - 最强大的移动工作站显卡 专门为了惠普 VR Z 背包电脑而发布
  7. dsf5.0组件相关
  8. Excel图表7——漏斗图
  9. 首款国产7纳米GPGPU芯片在上海问世
  10. 异构群体机器人协作任务分配(群体智能论文学习)