为了账号安全,请及时绑定邮箱和手机立即绑定

使用 jquery jroll2 开发仿qq聊天列表侧滑功能

标签:
JavaScript

由于开发需求,需要做一个类似qq的聊天界面,侧滑弹出单条item右侧菜单,菜单可点击,效果如下图(包括点击事件+长按事件):

https://img1.sycdn.imooc.com//5b6550f80001edee00130023.jpg

1.项目主体dom和css

页面结构比较简单,顶部header做了fixed定位。

页面主体被id="wrapper"包含,每条item有用户的头像、名字和操作btn组成。

复制代码

 1   <header> 2     聊天 3   </header> 4   <div id="wrapper"> 5     <ul id="scroller"> 6       <li class="item"> 7         <div class="item-scroller"> 8           <img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="image/01.jpg" alt=""> 9           <div class="txt">张三</div>10           <div class="del">11             <div class="zhiding">置顶</div>12             <div class="shanchu">删除</div>13           </div>14         </div>15       </li>16       <li class="item">17         <div class="item-scroller">18           <img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="image/01.jpg" alt="">19           <div class="txt">赵四</div>20           <div class="del">21             <div class="zhiding">置顶</div>22             <div class="shanchu">删除</div>23           </div>24         </div>25       </li>26     </ul>27   </div>

复制代码

css部分

复制代码

  1 /*   2 http://www.cnblogs.com/ele-cat Reset Stylesheet  3 v1.0.1 
  4 2018-05-08  5 Author: Ele-cat - http://ele-cat.github.io  6 */  7 body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td,figure,figcaption{padding: 0;margin: 0;}  8 table {border-collapse: collapse;border-spacing: 0;}  9 fieldset,img {border: 0;max-width: 100%;} 10 address,caption,cite,code,dfn,em,strong,th,var {font-weight: normal;font-style: normal;} 11 ol,ul {list-style: none;} 12 caption,th {text-align: left;} 13 h1,h2,h3,h4,h5,h6 {font-weight: normal;font-size: 100%;} 14 q:before,q:after {content:'';} 15 abbr,acronym {border: 0;font-variant:normal;} 16 a{text-decoration: none;transition:all .4s ease-in-out;} 17 sup,sub{vertical-align:baseline;} 18 legend{color:#000;} 19 input,button,textarea,select,optgroup,option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;} 20 input,button,textarea,select{*font-size:100%;outline:none;resize:none;} 21 :-moz-placeholder {color: #ccc;} 22 ::-moz-placeholder {color: #ccc;} 23 input:-ms-input-placeholder,textarea:-ms-input-placeholder {color: #ccc;} 24 input::-webkit-input-placeholder,textarea::-webkit-input-placeholder {color: #ccc;} 25 .fl{float: left;} 26 .fr{float: right;} 27 /*兼容IE6/7*/ 28 .cl {*zoom: 1;} 
 29 .cl:before,.cl:after{display: table;line-height: 0;content: "";} 
 30 .cl:after {clear: both;} 31  32 header { 33   width: 100%; 34   height: 45px; 35   line-height: 45px; 36   background: #ececea; 37   border-bottom: 1px solid #ddd; 38   position: fixed; 39   left: 0; 40   top: 0; 41   z-index: 99; 42   text-align: center; 43   color: #4e4a49; 44   font-size: 1em; 45 } 46  47 #wrapper { 48   width: 100%; 49   padding-top: 45px; 50 } 51  52 .item { 53   width: 100%; 54   height: 2.8rem; 55   background: #FFFFFF; 56   border-bottom: 1px solid #eee; 57 } 58  59 .item-scroller { 60   width: 140%; 61   position: absolute; 62 } 63  64 .item-scroller img { 65   width: 2rem; 66   height: 2rem; 67   position: absolute; 68   top: 0.4rem; 69   left: 0.4rem; 70   border-radius: 0.4rem; 71   overflow: hidden; 72 } 73  74 .item-scroller .txt { 75   margin-left: 2.8rem; 76   line-height: 2.8rem; 77   width: 80%; 78 } 79  80 .del { 81   width: 27%; 82   height: 2.8rem; 83   position: absolute; 84   right: 0; 85   top: 0; 86   color: #fff; 87   text-align: center; 88   line-height: 2.8rem; 89   z-index: 9999; 90 } 91  92 .del .shanchu { 93   width: 50%; 94   height: 2.8rem; 95   text-align: center; 96   background: #FFB300; 97   float: left; 98 } 99 100 .del .zhiding {101   width: 50%;102   height: 2.8rem;103   text-align: center;104   background: #E51C23;105   float: left;106 }

复制代码

View Code

这个时候,页面已经成型。开始加入js代码。

2.js部分

(1)首先,引入jqueryCDN:

<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://cdn.bootcss.com/jquery/2.2.1/jquery.min.js"></script>

(2)引入jroll.js文件,下载地址

使用mooc数据,先删除当前页面里的部分html代码,即删除<ul id="scroller"></ul>里的全部代码

全部js代码:

复制代码

  1 $(function () {  2       var userList = [  3         {  4           name: '张三',  5           avatar: '01.jpg'  6         },  7         {  8           name: '李四',  9           avatar: '02.jpg' 10         }, 11         { 12           name: '王五', 13           avatar: '03.jpg' 14         }, 15         { 16           name: '赵四', 17           avatar: '01.jpg' 18         }, 19         { 20           name: '张三', 21           avatar: '01.jpg' 22         }, 23         { 24           name: '李四', 25           avatar: '02.jpg' 26         }, 27         { 28           name: '王五', 29           avatar: '03.jpg' 30         }, 31         { 32           name: '赵四', 33           avatar: '01.jpg' 34         } 35       ] 36       var html = '' 37       for (let i = 0; i < userList.length; i++) { 38         const userInfo = userList[i]; 39         html += '<li class="item" ="intoChat(\'' + userInfo.name + '\')" ontouchend="touchend()" ontouchmove="touchend()" ontouchstart="touchstart(\'' + userInfo.name + '\')">' 40         html += '  <div class="item-scroller">' 41         html += '    <img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="image/' + userInfo.avatar + '" alt="">' 42         html += '    <div class="txt">' + userInfo.name + '</div>' 43         html += '    <div class="del">' 44         html += '      <div class="zhiding" ="upChat(\'' + userInfo.name + '\')">置顶</div>' 45         html += '      <div class="shanchu" ="delChat(\'' + userInfo.name + '\')">删除</div>' 46         html += '    </div>' 47         html += '  </div>' 48         html += '</li>' 49       } 50       $('#scroller').append(html) 51       jroll(); // 调用jroll 52     }) 53  54     function jroll() { 55       // 创建外层jroll实例 56       var jroll = new JRoll("#wrapper", { 57         scrollBarY: false 58       }); 59       var items = document.querySelectorAll(".item"); 60       var current = null; 61       //保存当前滑开的item 62       for (var i = 0; i < items.length; i++) { 63         // 每行创建jroll实例 64         var j = new JRoll(items[i], { 65           scrollX: true, 66           bounce: false 67         }); 68         j.on("scrollStart", function () { 69           if (current && current !== this) { 70             current.scrollTo(0, 0, 100); 71             current = null; 72           } 73         }); 74         j.on("scroll", function (e) { 75           if (this.x === 0 && !current) { 76             this.call(jroll, e); 77           } else { 78             current = this; 79           } 80         }); 81         j.on("scrollEnd", function () { 82           if (this.x > -50) { 83             this.scrollTo(0, 0, 100); 84             current = null; 85           } else { 86             this.scrollTo(this.maxScrollX, 0, 100); 87           } 88         }) 89       }; 90     } 91  92     // 点击操作 93     function intoChat(name) { 94       alert('点击"' + name + '"进行聊天') 95     } 96  97     // 删除操作 98     function delChat(name) { 99       alert('点击"' + name + '"删除聊天')100     }101 102     // 置顶操作103     function upChat(name) {104       alert('点击"' + name + '"置顶聊天')105     }106 107     // 长按操作108     function getTimeNow() {109       var now = new Date();110       return now.getTime();111     }112     function touchend() {113       clearInterval(time); //如果按下时间不到1000毫秒便弹起,114     }115     function touchstart(name) {116       timeStart = getTimeNow(); //获取鼠标按下时的时间117       time = setInterval(function () {118         timeEnd = getTimeNow(); //也就是每100毫秒获取一次时间119         if (timeEnd - timeStart > 700) //如果此时检测到的时间与第一次获取的时间差有1000毫秒120         {121           alert('长按"' + name + '"进行操作')122           clearInterval(time); //便不再继续重复此函数 (clearInterval取消周期性执行)123         }124       }, 100);125     }

复制代码

重要部分都做了代码注释,有问题的话,可以在留言区评论。

 

补充(1):头像资源:

https://img1.sycdn.imooc.com//5b6551200001032502000200.jpghttps://img1.sycdn.imooc.com//5b65512e0001758802240224.jpghttps://img1.sycdn.imooc.com//5b655136000158dc02000200.jpg

分别是01.jpg 02.jpg 03.jpg。

 补充(2):当我们点击右侧划出菜单时,需要阻止冒泡事件,代码如下:

复制代码

 1     // 删除操作 2     function delChat(name, e) { 3       //如果提供了事件对象,则这是一个非IE浏览器 4       if (e && e.preventDefault) { 5         //阻止默认浏览器动作(W3C)  6         e.preventDefault(); 7       } 8       else { 9         //IE中阻止函数器默认动作的方式 10         window.event.returnValue = false;11         return false;12       }13       alert('点击"' + name + '"删除聊天')14     }15 16     // 置顶操作17     function upChat(name, e) {18       //如果提供了事件对象,则这是一个非IE浏览器19       if (e && e.preventDefault) {20         //阻止默认浏览器动作(W3C) 21         e.preventDefault();22       }23       else {24         //IE中阻止函数器默认动作的方式 25         window.event.returnValue = false;26         return false;27       }28       alert('点击"' + name + '"置顶聊天')29     }

复制代码

原文出处:https://www.cnblogs.com/e-cat/p/9415119.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消