Vue练习四十五:06_02_仿腾讯微博效果_待完善淡入淡出
Demo 在线地址:
https://sx00xs.github.io/test/45/index.html
---------------------------------------------------------------
ide: vscode
文件格式:.vue
解析:(待补)
<template> <div class="msgBox"> <form @submit="handleSubmit" ref="myForm"> <h2>来 , 说说你在做什么 , 想什么</h2> <div> <input id="userName" class="f-text" v-model="username" ref="username" :class="{active:isusernameAcitve}" @focus="handleuserNameFocus" @blur="handleuserNameBlur" /> <p id="face"> <img v-for="(pic, index) in pics" :key="pic.src" :src="pic.src" :class="[{current:pic.isActive},{hover:pic.isOver}]" @mouseover="handleImgOver(pic)" @mouseout="handleImgOut(pic)" @click="handleImgClick(index)" > </p> </div> <div><textarea id="conBox" class="f-text" v-model="conbox" ref="conbox" :class="{active:isconboxActive}" @blur="hadnleconboxBlur" @keyup="confine" @focus="confine" @change="confine" ></textarea></div> <div class="tr"> <p> <span class="countTxt">{{countTxt}}</span><strong :class="[{maxNumColor:isMaxNumActive},maxNum]">{{maxNum}}</strong><span>个字</span> <input @click="handleSend" id="sendBtn" type="button" value="" title="快捷键 Ctrl+Enter" @mouseover="handleSendOver" :class="{hover:isSendActive}" @mouseout="handleSendOut" /> </p> </div> </form> <div class="list"> <h3><span>大家在说</span></h3> <ul> <template v-if="lists.length"> <li v-for="(list,index) in lists" :key="index" :class="{hover:list.isLiActive}" @mouseover="handleLiover(index)" @mouseout="handleLiout" > <div class="userPic"><img :src="list.src"/></div> <div class="content"> <div class="userName"><a href="#">{{list.username}}</a></div> <div class="msgInfo">{{list.msg}}</div> <div class="times"><span>{{list.times}}</span><a @click="handleDelLi(index)" class="del" v-show="list.isLiActive" href="#">删除</a></div> </div> </li> </template> </ul> </div> </div> </template> <script> import {lists, pics} from './lists'; function format(str){ return str.toString().replace(/^(\d)$/,'0$1'); } export default { name:'Navs', data(){ return{ pics:pics, lists:lists, username:'', conbox:'', bSend:false, isusernameAcitve:false, isconboxActive:false, maxNum:140, countTxt:'还能输入', isMaxNumActive:false, isSendActive:false } }, methods:{ handleDelLi(index){ this.lists.splice(index,1) }, handleLiover(index){ for(var i=0;i<this.lists.length;i++) this.lists[i].isLiActive=false; this.lists[index].isLiActive=true; }, handleLiout(){ for(var i=0;i<this.lists.length;i++) this.lists[i].isLiActive=false; }, handleSendOver(){ this.isSendActive=true; }, handleSendOut(){ this.isSendActive=false; }, handleuserNameFocus(){ this.isusernameAcitve=true; }, handleuserNameBlur(){ this.isusernameAcitve=false; }, hadnleconboxBlur(){ this.isconboxActive=false; }, confine(){ this.isconboxActive=true; var len=0; for(var i=0;i<this.conbox.length;i++) len += /[^\x00-\xff]/g.test(this.conbox.charAt(i)) ? 1 : 0.5; this.maxNum = Math.abs(140 - Math.floor(len)); 140 - Math.floor(len) >= 0 ? (this.isMaxNumActive=false,this.countTxt='还能输入',this.bSend=true) :(this.isMaxNumActive=true, this.countTxt='已超出',this.bSend=false); }, handleImgOver(pic){ pic.isOver=true; }, handleImgOut(pic){ pic.isOver=false; }, handleImgClick(index){ for(var i=0; i<this.pics.length;i++) this.pics[i].isActive=false; this.pics[index].isActive=true; }, handleSubmit(){ return false; }, handleSend(){ var reg=/^\s*$/g; if(reg.test(this.username)){ alert("\u8bf7\u586b\u5199\u60a8\u7684\u59d3\u540d"); this.$refs.username.focus() } else if(!/^[u4e00-\u9fa5\w]{2,8}$/g.test(this.username)){ alert("\u59d3\u540d\u75312-8\u4f4d\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u4e0b\u5212\u7ebf\u3001\u6c49\u5b57\u7ec4\u6210\uff01"); this.$refs.username.focus() } else if(reg.test(this.conbox)){ alert("\u968f\u4fbf\u8bf4\u70b9\u4ec0\u4e48\u5427\uff01"); this.$refs.conbox.focus() } else if(!this.bSend){ alert("\u4f60\u8f93\u5165\u7684\u5185\u5bb9\u5df2\u8d85\u51fa\u9650\u5236\uff0c\u8bf7\u68c0\u67e5\uff01"); this.$refs.conbox.focus() } else{ var date = new Date(); var mySrc = ''; for(var i=0;i<this.pics.length;i++){ if(this.pics[i].isActive) mySrc =this.pics[i].src; } this.lists.unshift({ src:mySrc, username:this.username, msg:this.conbox, times:format(date.getMonth() + 1) + '\u6708' + format(date.getDate()) + '\u65e5 ' + format(date.getHours()) + ':' + format(date.getMinutes()), isLiActive:false }); this.username=''; this.conbox=''; for(var i=0;i<this.pics.length;i++) this.pics[i].isActive=false; this.pics[0].isActive=true; } }, handleDocKeyup(){ event.ctrlKey && event.keyCode == 13 && this.handleSend() } }, mounted(){ document.addEventListener('keyup',this.handleDocKeyup); this.confine(); } } </script>