mpvue小程序仿qq左滑置頂刪除

mpvue仿qq左滑置頂刪除組件
背景:

前幾天仰冠,公司的一個(gè)小程序項(xiàng)目開發(fā)的時(shí)候病袄,遇到了一點(diǎn)點(diǎn)問題妥衣。設(shè)計(jì)師這狗幣要讓我在小程序上實(shí)現(xiàn)類似QQ左滑置頂刪除的操作,心里mmp筋夏,我就是一個(gè)剛來公司三天的小小前端實(shí)習(xí)生而已蒂胞,我想學(xué)習(xí)....當(dāng)然剛剛來就被公司委以重任,也能看出本人技術(shù)過人条篷,尤其是作為一個(gè)大二剛剛結(jié)束的學(xué)生來說骗随。廢話不多說,對于這個(gè)功能赴叹,第一反應(yīng)就是百度鸿染,不百度不得了,一百度嚇一跳乞巧。前輩們也來都做過涨椒。“那我不是直接照搬就行绽媒,開心”蚕冬。開開心心的用mpvue上手之后,心里mmp是辕,mpvue的坑這么多囤热。。免糕。赢乓。還不如自己動(dòng)手?jǐn)]一個(gè)忧侧,效率還更快。

image

我們先來看看效果圖牌芋,有圖有真相:

效果圖:

image

實(shí)現(xiàn):

1蚓炬,上面說過mpvue的坑,比如里面的每一個(gè)的元素都是overflow:hidden躺屁,并且似乎都繼承了display:block肯夏。(看小程序開發(fā)工具是這樣的,具體源碼沒看犀暑,就只能猜猜)驯击。所以主要解決是讓元素overflow:scroll,這個(gè)主要是看效果的時(shí)候會(huì)用到

2,左滑和右滑耐亏,這又是一個(gè)坑徊都。本以為mpvue的滑動(dòng)事件會(huì)和vue的一模一樣。開開心心的按著原來想法擼广辰,發(fā)現(xiàn)怎么滑都滑不動(dòng)暇矫,果斷打印一波數(shù)據(jù),發(fā)現(xiàn)滑動(dòng)事件大有奧妙择吊!

3李根,布局方面我采用的是rpx+flex。

4几睛,點(diǎn)擊時(shí)候置頂與取消置頂是通過json數(shù)據(jù)的top實(shí)現(xiàn)的房轿。刪除是用數(shù)組的splice()方法。

5所森,滑動(dòng)效果是css動(dòng)畫控制的囱持。

下面直接貼代碼:如果看不懂可以嫌麻煩可以去我的github:https://github.com/JB-Chen/mpvue-slide

程序員大佬們,覺得可以就給個(gè)star必峰,以資鼓勵(lì)一下洪唐!

HTML代碼:

主要的html代碼:

<template>
  <div class="container">
    <!-- 頭部 -->
    <div class="head">
      <img class="userinfo-avatar" v-if="userInfo.avatarUrl" :src="userInfo.avatarUrl" background-size="cover"/>
      <span class="head-info">消息</span>
    </div>
    <!-- 搜索 -->
    <div class="search">
      <input type="search"/>
      <span>搜索</span>
    </div>
    <!-- 內(nèi)容 -->
    <div class="infoAll" v-for="(item,index) in commitInfo" :key="index">
      <ul v-if="item.top">
        <li @touchstart="touchStart($event)" @touchend="touchEnd($event,index)" :data-type="item.type" style="background-color:#EDFBFE;">
          <div class="imgInfo" @click="recover(index)">
            <img :src="item.img">
          </div>
          <div class="centerInfo">
            <div class="name">
               <span>{{item.name}}</span>
            </div>
            <div class="sonName">
              <span>{{item.sonName}}</span>
              </div>
          </div>
          <div class="timeInfo" @click="recover(index)">
            <div class="time">
              <text>{{item.time}}</text>
            </div>
            <div class="infoNum" style="">
                <text style="font-size:12px;">{{item.infoNum}}</text>  
            </div>
          </div>
          <div class="top" @click="top(index)" style="width:30%">
            取消置頂
          </div>
        </li>  
      </ul>
    </div>
    <div class="infoAll" v-for="(item,index) in commitInfo" :key="index">
      <!-- {{item.img}} -->
      <ul v-if="!item.top">
        <li @touchstart="touchStart($event)" @touchend="touchEnd($event,index)" :data-type="item.type">
          <div class="imgInfo" @click="recover(index)">
            <img :src="item.img">
          </div>
          <div class="centerInfo">
            <div class="name">
               <span>{{item.name}}</span>
            </div>
            <div class="sonName">
              <span>{{item.sonName}}</span>
              </div>
          </div>
          <div class="timeInfo" @click="recover(index)">
            <div class="time">
              <text>{{item.time}}</text>
            </div>
            <div class="infoNum" style="">
                <text style="font-size:12px;">{{item.infoNum}}</text>  
            </div>
          </div>
          <div class="top" @click="top(index)">
            置頂
          </div>
          <div class="delect" @click="delect(index)">
            刪除
          </div>
        </li>  
      </ul>
    </div>
  </div>
</template>

css代碼:

// 頭部
*{
    margin:0px;
    padding: 0px;
}
.head {
    width: 100%;
    height:130rpx;
    background-color: #38A7FA;
    margin-top:-195rpx;
    display: flex;
    align-items: center;
    .head-info{
        color: #fff;
        font-size:30rpx;
        margin-left: 30%;
        margin-top:20rpx;
        letter-spacing: 4rpx;
      }
      .userinfo-avatar {
        width: 80rpx;
        height: 80rpx;
        margin: 20rpx;
        border-radius: 50%;
        margin-top:30rpx;
      
      }
  }
  .search{
      width: 90%;
      margin-top:20rpx;
      margin-bottom: 20rpx;
      input{
          width: 100%;
          height: 20rpx;
          background-color: #F3F3F3;
          border-radius: 5rpx;
          z-index: 0;
      }
      span{
          position: absolute;
          color: #B5B5B5;
          font-size: 24rpx;
          margin-top:-44rpx;
          z-index: 999;
          margin-left: 42%;
          text-align: center;
    
      }
  }
  .infoAll{
     width: 100%;
      ul{
        width: 100%;
        // overflow-x: scroll;
          li{
            -webkit-transition: all 0.2s;
            transition: all 0.2s;
              width: 1100rpx;
              height: 150rpx; 
            //   background-color: red;
              line-height: 150rpx;
              border-bottom: 1px solid #E0EEF1;
            //   垂直居中钻蹬,  // 子div水平排列
              display:flex;
            //   justify-content:center;
              align-items:center;
            
              .imgInfo{
                width: 100rpx;
                height: 100rpx;
                border-radius: 50%;
                background-color: #38A7FA;
                margin-left: 2%;
                img{
                    width: 100rpx;
                    height: 100rpx;
                    border-radius: 50%;
                    overflow: hidden;
                }
                
              }
              .centerInfo{
                width: 40%;
                height: 150rpx;
                margin-left: 2%;
                .name{
                    margin-top:-20rpx;
                    span{
                        font-size: 35rpx;
                    }
                   
                }
                .sonName{
                    margin-top:-110rpx;
                    span{
                        font-size: 24rpx;
                        color: #7C8489;
                    }
                
                }
                 
              }
              .timeInfo{
                width: 15%;
                height: 150rpx;
                margin-left: 6%;
               
                .time{
                    margin-top:-20rpx;
                    color: #92A0A1;
                    font-size: 25rpx;
                    position: absolute;
                    
                }
                .infoNum{
                    width:50rpx;
                    display:flex;
                    align-items:center;
                    justify-content:center;
                    height: 30rpx;
                    border-radius: 10rpx;
                    background-color: #93D5ED;
                    margin-left: 10rpx;
                    margin-top: 70rpx;

                }
                 
              }
              .top{
                  width: 15%;
                  height: 150rpx;
                  background-color: #C4C7CD;
                  color: #fff;
                  font-size: 34rpx;
                  text-align:center
              }
              .delect{
                width: 15%;
                height: 150rpx;
                background-color: #FF3B32;
                color: #fff;
                font-size: 34rpx;
                text-align:center
              }
          }
      }
  }
li[data-type="0"]{
    transform: translate3d(0,0,0);
}
li[data-type="1"]{
    transform: translate3d(-400rpx,0,0);
}

js主要代碼:

<script>
import card from '@/components/card'

export default {
  data () {
    return {
      userInfo: {},
      commitInfo:[
        {
          img:"http://img3.imgtn.bdimg.com/it/u=3067730600,935028889&fm=27&gp=0.jpg",
          name:"旺財(cái)",
          sonName:"今晚去吃飯嗎?",
          time:"19:08",
          infoNum:"9",
          top:false,
          type:0
        },

        {
          img:"http://img1.imgtn.bdimg.com/it/u=1257196754,3171363795&fm=27&gp=0.jpg",
          name:"前端學(xué)習(xí)群",
          sonName:"hanber:異步與同步的問題",
          time:"02:08",
          infoNum:"99+",
          top:false,
          type:0
        },
        {
          img:"https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1672209094,624238697&fm=27&gp=0.jpg",
          name:"小學(xué)同學(xué)",
          sonName:"好久不見吼蚁,最近好嗎?",
          time:"02:08",
          infoNum:"9",
          top:false,
          type:0
        },
         {
          img:"https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1312347818,1612941824&fm=200&gp=0.jpg",
          name:"老媽",
          sonName:"啥時(shí)候回家一趟呀问欠?",
          time:"23:08",
          infoNum:"1",
          top:false,
          type:0
        },
        {
          img:"http://img2.imgtn.bdimg.com/it/u=1093392508,3329264726&fm=27&gp=0.jpg",
          name:"AD動(dòng)漫群",
          sonName:"ghost:《你的名字》求資源",
          time:"02:08",
          infoNum:"99+",
          top:false,
          type:0
        }
      ]
    }
  },

  components: {
    card
  },

  methods: {
  // 滑動(dòng)開始
    touchStart(e){
      // 獲取移動(dòng)距離肝匆,可以通過打印出e,然后分析e的值得出
        this.startX = e.mp.changedTouches[0].clientX;
    },
    // 滑動(dòng)結(jié)束
    touchEnd(e,index){
        // 獲取移動(dòng)距離
        this.endX = e.mp.changedTouches[0].clientX;  
        if(this.startX-this.endX > 10){
            for(let i=0;i<this.commitInfo.length;i++){
                  this.commitInfo[i].type = 0
            }
            this.commitInfo[index].type = 1
        }
        else if(this.startX-this.endX < -10){
            for(let i=0;i<this.commitInfo.length;i++){
                  this.commitInfo[i].type = 0
            }
        }
    
    },
    // 點(diǎn)擊回復(fù)原狀
    recover(index){
          this.commitInfo[index].type = 0
    },
    getUserInfo () {
      // 調(diào)用登錄接口
      wx.login({
        success: () => {
          wx.getUserInfo({
            success: (res) => {
              this.userInfo = res.userInfo
            }
          })
        }
      })
    },
    // 置頂
    top(index){
      this.commitInfo[index].top = !this.commitInfo[index].top;
      this. recover(index);
    },
    // 刪除
    delect(index){
      this.commitInfo.splice(index,1);
    }
  },

  created () {
    // 調(diào)用應(yīng)用實(shí)例的方法獲取全局?jǐn)?shù)據(jù)
    this.getUserInfo()
  }
}
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顺献,一起剝皮案震驚了整個(gè)濱河市旗国,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌注整,老刑警劉巖能曾,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件度硝,死亡現(xiàn)場離奇詭異,居然都是意外死亡寿冕,警方通過查閱死者的電腦和手機(jī)蕊程,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驼唱,“玉大人藻茂,你說我怎么就攤上這事∶悼遥” “怎么了辨赐?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長京办。 經(jīng)常有香客問我掀序,道長碑诉,這世上最難降的妖魔是什么陶因? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮径密,結(jié)果婚禮上审孽,老公的妹妹穿的比我還像新娘县袱。我一直安慰自己,他們只是感情好佑力,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布式散。 她就那樣靜靜地躺著,像睡著了一般打颤。 火紅的嫁衣襯著肌膚如雪暴拄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天编饺,我揣著相機(jī)與錄音乖篷,去河邊找鬼。 笑死透且,一個(gè)胖子當(dāng)著我的面吹牛撕蔼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秽誊,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲸沮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锅论?” 一聲冷哼從身側(cè)響起讼溺,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎最易,沒想到半個(gè)月后怒坯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炫狱,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年剔猿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毕荐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艳馒,死狀恐怖憎亚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弄慰,我是刑警寧澤第美,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站陆爽,受9級特大地震影響什往,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慌闭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一别威、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驴剔,春花似錦省古、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至布讹,卻和暖如春琳拭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背描验。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工白嘁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膘流。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓絮缅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親睡扬。 傳聞我的和親對象是個(gè)殘疾皇子盟蚣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 核心概念 敘事 敘事”是廣義的講故事黍析。你并不一定非得講一個(gè)完整的有人物有劇情有轉(zhuǎn)折的故事卖怜,你只要能用某個(gè)主觀的視角...
    上善若水在路上閱讀 213評論 0 0
  • 當(dāng)我們痛苦得無法傾聽我們無法給別人我們自己都沒有的東西。有時(shí)阐枣,我們會(huì)發(fā)現(xiàn)自己沒有心情去關(guān)心別人马靠。一般來說奄抽,這反映了...
    Fly_Catkin閱讀 265評論 0 0
  • 一顆熾熱的心, 漸漸變成了一顆鐵鑄之心甩鳄, 嬌媚的面容已經(jīng)死寂一片逞度, 在錯(cuò)誤的年齡, 選了錯(cuò)誤的人妙啃。 于是档泽, 一顆顆...
    貓妖金淼淼閱讀 301評論 2 5
  • 在簡書上,在微信上揖赴,經(jīng)彻菽洌看幾個(gè)女人發(fā)的文,她們都在深圳燥滑,可能是因?yàn)樵谏钲谏钸^多年原因渐北,家人還在深圳的原故,經(jīng)趁。看...
    愛生生萬物閱讀 198評論 2 0
  • 辭職以后想把大學(xué)時(shí)候的專業(yè)拾起來搀菩,起碼保持個(gè)狀態(tài)呕臂,忘了怪可惜,于是又報(bào)名了一遍N1肪跋。三月诵闭、四月主要減肥了,也背背單...
    李煜垚閱讀 274評論 0 0