electron制作仿制qq聊天界面的示例代码


Posted in Javascript onNovember 26, 2018

本文介绍了electron制作仿制qq聊天界面的示例代码,分享给大家,具体如下:

效果图:

electron制作仿制qq聊天界面的示例代码

样式使用scss和flex布局

这也是制作IM系统的最后一个界面了!

在制作之前参考了qq和千牛

需要注意的点

qq将滚动条美化了 而且在无操作的情况下是不会显示的

滚动条美化

::-webkit-scrollbar { /*滚动条整体样式*/
  width: 5px; /*高宽分别对应横竖滚动条的尺寸*/
  height: 1px;
}

::-webkit-scrollbar-thumb { /*滚动条里面小方块*/
  border-radius: 10px;
  -webkit-box-shadow: inset 0 0 5px rgba(228, 57, 60, 0.2);
  background: rgba(20, 20, 50, 0.6);
  position: absolute;
}

::-webkit-scrollbar-track { /*滚动条里面轨道*/
  -webkit-box-shadow: inset 0 0 5px rgba(228, 57, 60, 0.2);
  border-radius: 10px;
  background: #EDEDED;
  position: absolute;
}

滚动条根据时机显示

其实这个也很简单 用的mouseentermouseleave事件

<div
  :style="{overflowY:messageScroll? 'auto' : 'hidden',paddingRight: messageScroll ? '0': '5px' }"
  @mouseenter="showMessageScrolls" 
  @mouseleave="hideMessageScrolls">
</div>

# script
 showMessageScrolls(){
   this.messageScroll = true;
},
hideMessageScrolls(){
  this.messageScroll = false;
},

这里解释一下为什么有一个paddingRight

因为我们的滚动条是5px 如果不加 在滚动条显示的时候页面会抖动

简单写法

@mouseenter="messageScroll = true" 
 @mouseleave="messageScroll = false"

页面滚动

页面打开时消息列表滚动到底部

this.$nextTick(function () {
        this.$refs.msgBox.scrollTop = this.$refs.msgBox.scrollHeight
})

消息发送滚动到底部

this.$refs.msgBox.scrollTop = this.$refs.msgBox.scrollHeight;

内容编辑

没有使用表单元素 直接使用的 contenteditable

因为contenteditable 没法用双向数据绑定 不过 可以用数据侦听器 有很多办法 但是有很简单的 使用input事件就行了

代码

页面代码

<template>
  <div class="friend_window">
    <header>
      <div class="nickname">Lee</div>
      <div class="buttons">
        <i class="iconfont"></i>
        <i class="iconfont"></i>
      </div>
    </header>
    <aside>
      <nav>
        <ul>
          <li >
            <div class="avatar"><img src="@/assets/img/1.jpg" alt=""></div>
            <div class="msg_box">
              <div class="nickname">李昊天-</div>
              <div class="messages">最近还好吗</div>
            </div>
            <div class="push_right">
              <div class="time">12:50</div>
              <div class="number">1</div>
            </div>
          </li>
          <li >
            <div class="avatar"><img src="@/assets/img/2.jpg" alt=""></div>
            <div class="msg_box">
              <div class="nickname">李昊天-</div>
              <div class="messages">最近还好吗</div>
            </div>
            <div class="push_right">
              <div class="time">12:50</div>
              <div class="number">1</div>
            </div>
          </li>
          <li >
            <div class="avatar"><img src="@/assets/img/3.jpg" alt=""></div>
            <div class="msg_box">
              <div class="nickname">李昊天-</div>
              <div class="messages">最近还好吗</div>
            </div>
            <div class="push_right">
              <div class="time">12:50</div>
              <div class="number">1</div>
            </div>
          </li>
          <li >
            <div class="avatar"><img src="@/assets/img/4.jpg" alt=""></div>
            <div class="msg_box">
              <div class="nickname">李昊天-</div>
              <div class="messages">最近还好吗</div>
            </div>
            <div class="push_right">
              <div class="time">12:50</div>
              <div class="number">1</div>
            </div>
          </li>
          <li class="active">
            <div class="avatar"><img src="@/assets/img/5.jpg" alt=""></div>
            <div class="msg_box">
              <div class="nickname">李昊天1-</div>
              <div class="messages">最近还好吗</div>
            </div>
            <div class="push_right">
              <div class="time">12:50</div>
              <div class="number">1</div>
            </div>
          </li>
          <li >
            <div class="avatar"><img src="@/assets/img/6.jpg" alt=""></div>
            <div class="msg_box">
              <div class="nickname">李昊天-</div>
              <div class="messages">最近还好吗</div>
            </div>
            <div class="push_right">
              <div class="time">12:50</div>
              <div class="number">1</div>
            </div>
          </li>
          <li >
            <div class="avatar"><img src="@/assets/img/7.jpg" alt=""></div>
            <div class="msg_box">
              <div class="nickname">李昊天</div>
              <div class="messages">最近还好吗</div>
            </div>
            <div class="push_right">
              <div class="time">12:50</div>
              <div class="number">1</div>
            </div>
          </li>
          <li >
            <div class="avatar"><img src="@/assets/img/8.jpg" alt=""></div>
            <div class="msg_box">
              <div class="nickname">李昊天-</div>
              <div class="messages">最近还好吗</div>
            </div>
            <div class="push_right">
              <div class="time">12:50</div>
              <div class="number">1</div>
            </div>
          </li>
        </ul>
      </nav>
      <main>
        <div
            class="message_main"
            ref="ele"
            :style="{overflowY:messageScroll? 'auto' : 'hidden',paddingRight: messageScroll ? '0': '5px' }"
            @mouseenter="showMessageScrolls" @mouseleave="hideMessageScrolls"
        >
          <div class="mes_box" v-for="(item,index) in list" :class="{'me' : index % 2 === 0}">
            <div class="avatar">
              <img src="@/assets/img/5.jpg" alt="">
            </div>
            <div class="message_box">
              {{item.msg}}
            </div>
          </div>
        </div>
        <div class="input_box">
          <div class="menubar">
            <svg class="icon" aria-hidden="true">
              <use xlink:href="#icon-biaoqing-weixiao" rel="external nofollow" ></use>
            </svg>
            <svg class="icon" aria-hidden="true">
              <use xlink:href="#icon-folder" rel="external nofollow" ></use>
            </svg>
            <svg class="icon" aria-hidden="true">
              <use xlink:href="#icon-tupian1" rel="external nofollow" ></use>
            </svg>
            <svg class="icon" aria-hidden="true">
              <use xlink:href="#icon-shuangsechangyongtubiao-" rel="external nofollow" ></use>
            </svg>
          </div>
          <div class="input" ref="input" contenteditable="true" @keydown.enter="sendMsg" @change="inputMsg"
             @input="inputMsg"></div>
          <div class="footerbar">
            <Button>关闭</Button>
            <Button type="primary">发送</Button>
          </div>
        </div>
      </main>
    </aside>
  </div>
</template>

script代码

<script>
  import '@/assets/css/scrool.css'
  import '@/assets/fonts/iconfont.js';

  export default {
    name: "friend",
    data() {
      return {
        list: [
          {msg: '赵客缦胡缨,吴钩霜雪明'},
          {msg: '银鞍照白马,飒沓如流星'},
          {msg: '十步杀一人,千里不留行'},
          {msg: '事了拂衣去,深藏身与名'},
          {msg: '闲过信陵饮,脱剑膝前横。'},
          {msg: '将炙啖朱亥,持觞劝侯嬴。'},
          {msg: '三杯吐然诺,五岳倒为轻'},
          {msg: '眼花耳热后,意气素霓生。'},
          {msg: '救赵挥金槌,邯郸先震惊。'},
          {msg: '千秋二壮士,?@赫大梁城。'},
          {msg: '纵死侠骨香,不惭世上英。'},
          {msg: '谁能书阁下,白首太玄经。'},
          {msg: '是唐代大诗人李白借乐府古题创作的一首诗。此诗开头四句从侠客的装束、兵刃、坐骑刻画侠客的形象;第二个四句描写侠客高超的武术和淡泊名利的行藏;第三个四句引入信'},
        ],
        msg: '',
        number:8,
        messageScroll:false
      }
    },
    mounted() {
      this.$nextTick(function () {
        this.$refs.ele.scrollTop = this.$refs.ele.scrollHeight
      })
    },

    methods: {
      showMessageScrolls(){
        this.messageScroll = true;
      },
      hideMessageScrolls(){
        this.messageScroll = false;
      },
      inputMsg(e) {
        this.msg = e.target.innerHTML;
      },
      sendMsg(e) {
        this.list.push({msg: this.msg});
        this.msg = '';
        this.$refs.input.innerHTML = '';
        setTimeout(() => {
          this.$refs.ele.scrollTop = this.$refs.ele.scrollHeight;
        }, 200);
        e.preventDefault();
      }
    }
  }
</script>

样式代码

.friend_window {
 position: absolute;
 width: 100%;
 height: 100%;
 background-image: url("../img/main_1.jpg");
 border-radius: 4px;
 -webkit-user-select: none;
 background-size: 100% 100%;

 header {
  height: 40px;
  background-color: rgba(0, 0, 0, 0.3);
  -webkit-app-region: drag;
  border-radius: 4px 4px 0 0;
  display: flex;
  justify-content: space-between;

  .nickname {
   color: #FFF;
   line-height: 40px;
   font-size: 20px;
   margin: auto;
   padding-left: 40px
  }

  .buttons {
   i {
    display: inline-block;
    color: #FFF;
    width: 40px;
    height: 40px;
    line-height: 40px;
    text-align: center;
    cursor: pointer;
    -webkit-app-region: no-drag;

    &:hover {
     background-color: rgba(255, 255, 255, 0.3);
    }
   }
  }
 }

 aside {
  height: calc(100% - 40px);
  border-radius: 0 0 4px 4px;
  display: flex;
 }

 nav {
  width: 240px;
  position: relative;

  background-size: 100% 100%;
  overflow-y: auto;

  &:after {
   display: inline-block;
   content: '';
   width: 5px;
   cursor: e-resize;
   position: absolute;
   right: -2px;
   top: 0;
   height: 100%;
  }

  ul {
   li.active {
    background-color: rgba(255, 255, 255, 0.2);
   }
   li {
    list-style: none;
    height: 60px;
    padding-left: 10px;
    cursor: pointer;
    display: flex;
    overflow: hidden;
    align-items: flex-start;

    &:hover {
     background-color: rgba(255, 255, 255, 0.2);
    }

    .push_right {
     padding-right: 10px;
     text-align: center;
     align-self: center;

     .time {
      font-size: 13px;
      color: #CFD3DA;
     }

     .number {
      display: inline-block;
      background-color: #e4393c;
      color: #fff;
      min-width: 15px;
      min-height: 15px;
      padding: 0 2px;
      line-height: 15px;
      border-radius: 50%;
      text-align: center;
      font-size: 12px;
     }
    }

    .msg_box {
     align-self: center;
     flex: 1;
     color: #EFF1F3;

     .messages {
      color: #CFD3DA;
     }
    }

    .avatar {
     width: 45px;
     height: 45px;
     align-self: center;
     margin-right: 10px;

     img {
      width: 100%;
      height: 100%;
      border-radius: 50%;
     }
    }
   }
  }
 }

 main {
  background-color: #fff;
  width: calc(100% - 240px);
  border-radius: 0 0 4px 0;

  .message_main {
   height: calc(100% - 35%);
   overflow-y: auto;

   &::-webkit-scrollbar {
    display: block !important;
   }

   .mes_box {
    display: flex;
    margin-bottom: 10px;
    margin-top: 10px;
    padding: 10px;

    .avatar {
     width: 40px;
     height: 40px;
     margin-right: 10px;

     img {
      width: 100%;
      height: 100%;
      border-radius: 50%;
     }
    }

    .message_box {
     background-color: #FFFFFF;
     color: #333;
     padding: 10px;
     border-radius: 5px;
     max-width: 72%;
     position: relative;
     border: 1px solid #D4D4D4;

     &::before {
      content: '';
      display: block;
      position: absolute;
      width: 10px;
      height: 10px;
      border: 1px solid #D4D4D4;
      border-right: none;
      border-top: none;
      background-color: #FFFFFF;
      border-radius: 3px;
      transform: rotate(44deg);
      left: -6px;
      top: 14px;
     }
    }
   }

   .me {
    display: flex;
    justify-content: flex-end;

    .message_box {
     background-color: #A0E759;
     color: #333;
     border: 1px solid #77BF41;

     &::before {
      display: none;
     }

     &::after {
      content: '';
      display: block;
      position: absolute;
      width: 10px;
      height: 10px;
      border: 1px solid #77BF41;
      border-bottom: none;
      border-left: none;
      border-radius: 3px;
      background-color: #A0E759;
      transform: rotate(45deg);
      right: -6px;
      top: 14px;
     }
    }

    .avatar {
     order: 2;
     margin-left: 10px;
    }
   }
  }

  .input_box {
   border-top: 1px solid #ccc;
   height: calc(100% - 65%);

   .menubar {
    height: 30px;
    width: 100%;
    display: flex;
    align-items: center;

    .icon {
     display: inline-block;
     padding: 2px;
     width: 25px;
     height: 25px;
     cursor: pointer;
     margin-right: 5px;
     margin-left: 5px;

     &:hover {
      background-color: rgba(0, 0, 0, 0.1);
     }
    }
   }

   .footerbar {
    display: flex;
    height: 70px;
    align-items: center;
    justify-content: flex-end;
    padding-right: 20px;

    button {
     margin: 0 10px;
     padding-left: 30px;
     padding-right: 30px;
    }
   }

   .input {
    font-size: 16px;
    padding: 4px 8px;
    overflow-y: auto;
    height: calc(100% - 70px - 30px);

    background-color: #fff;

    &::-webkit-scrollbar {
     display: block !important;
    }
   }
  }
 }
}

.icon {
 width: 1em;
 height: 1em;
 vertical-align: -0.15em;
 fill: currentColor;
 overflow: hidden;
}

声明

代码只为学习使用,如果有个人或者机构使用该代码带来的侵权行为,与本人无关

如果代码有不合理之处请大家提出

遗留问题

有一个问题就是左侧的列表是没法拉伸的 不过已经做了样式了 如果不想要的可以去掉这个css代码

&:after {
   display: inline-block;
   content: '';
   width: 5px;
   cursor: e-resize;
   position: absolute;
   right: -2px;
   top: 0;
   height: 100%;
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用js实现层随着内容大小动态渐变改变 推荐
Dec 19 Javascript
基于jQuery选择器的整理集合
Apr 26 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
Sep 10 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
Jun 03 Javascript
jQuery中fadeOut()方法用法实例
Dec 24 Javascript
基于jQuery倒计时插件实现团购秒杀效果
May 13 Javascript
angularjs实现过滤并替换关键字小功能
Sep 19 Javascript
修改node.js默认的npm安装目录实例
May 15 Javascript
vue input输入框模糊查询的示例代码
May 22 Javascript
jquery添加div实现消息聊天框
Feb 08 jQuery
Vue Render函数创建DOM节点代码实例
Jul 08 Javascript
Vant picker 多级联动操作
Nov 02 Javascript
Vuex的初探与实战小结
Nov 26 #Javascript
微信小程序页面间值传递的两种方法
Nov 26 #Javascript
Vue中的methods、watch、computed的区别
Nov 26 #Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 #Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
Nov 25 #Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 #Javascript
vue中tab选项卡的实现思路
Nov 25 #Javascript
You might like
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
2011/07/17 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
Javascript 动态改变imput type属性
2016/11/01 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
js实现旋转木马效果
2017/03/17 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
Python3 模块、包调用&amp;路径详解
2017/10/25 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
项目经理岗位职责
2013/11/11 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
小区推广策划方案
2014/06/06 职场文书