开发 | 想让你的小程序更好用?不如试试为它「加特技」

小程序

2017-10-30 20:00

文 | OkayChen

写在前面

最近在负责一个微信小程序的前端以及前后端接口的对接的项目,整体上所有页面的布局我都已经搭建完成。

在小程序中,有一些常用的特效。在这里就为总结一下,希望对大家和我都能有所帮助。

1. 滚动 Tab 选项卡

先看一下效果图吧,能够点击菜单或滑动页面切换,tab 菜单部分可以实现左右滚动

好了,看一下实现方法吧。

首先是 WXML 代码:

<!-- tab header -->
<scroll-view scroll-x="true" class="tab-h" scroll-left="{{scrollLeft}}">
  <view class="tab-item {{currentTab==0?'active':''}}" data-current="0" bindtap="swichNav"> 全部</view>
  <view class="tab-item {{currentTab==1?'active':''}}" data-current="1" bindtap="swichNav"> 营销系统</view>
  <view class="tab-item {{currentTab==2?'active':''}}" data-current="2" bindtap="swichNav"> 家居建材</view>
  <view class="tab-item {{currentTab==3?'active':''}}" data-current="3" bindtap="swichNav"> 美妆护肤</view>
  <view class="tab-item {{currentTab==4?'active':''}}" data-current="4" bindtap="swichNav"> 数码电器</view>
  <view class="tab-item {{currentTab==5?'active':''}}" data-current="5" bindtap="swichNav"> 母婴玩具</view>
  <view class="tab-item {{currentTab==6?'active':''}}" data-current="6" bindtap="swichNav"> 零元购活动</view>
</scroll-view>

<!-- tab content -->
<swiper class="tab-content" current="{{currentTab}}" duration="300" bindchange="switchTab" style="max-height:{{winHeight}}rpx">
  <swiper-item wx:for="{{[0,1,2,3,4,5,6]}}">
    <scroll-view scroll-y="true" class="scoll-h">
      <block wx:for="{{[1,2,3,4,5,6,7]}}" wx:key="*this">
        <view class='goods-Wrapper'>
          <image mode='widthFix' class="goods-img" src='../../image/goods1.jpg'></image>
          <view class="goods-info">
            <view> 周边团门店微营销系统年费</view>
            <view>
              <text class='price'>¥298.00</text> 
              <text class='line-delete'>
                ¥298.00
              </text>
              <label>
                <button><image mode='widthFix' src='../../image/icon1.png'></image>1 人团</button>
                <button><image mode='widthFix' src='../../image/icon2.png'></image> 去开团</button>
              </label>
            </view>
          </view> 
        </view>
      </block>
    </scroll-view>
  </swiper-item>
</swiper>

在 WXSS 代码中,这里只展示 tab 菜单处的样式代码。

.tab-h {
  height: 80rpx;
  width: 100%;
  box-sizing: border-box;
  overflow: hidden;
  line-height: 80rpx;
  background: #f7f7f7;
  font-size: 14px;
  white-space: nowrap;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 99;
}

.tab-item {
  margin: 0 36rpx;
  display: inline-block;
}

.tab-item.active {
  color: #4675f9;
  position: relative;
}

.tab-h .tab-item.active:after {
  content: "";
  display: block;
  height: 8rpx;
  width: 115rpx;
  background: #4675f9;
  position: absolute;
  bottom: 0;
  left: 5rpx;
  border-radius: 16rpx;
}

.tab-h .tab-item:nth-child(1).active:after {
  width: 52rpx;
}

JS 代码如下:

var app = getApp();
Page({
  data: {
    winHeight: "",//窗口高度
    currentTab: 0, //预设当前项的值
    scrollLeft: 0, //tab 标题的滚动条位置
    expertList: [{ //假数据
      img: "",
      name: "",
      tag: "",
      answer: 134,
      listen: 2234
    }]
  },
  // 滚动切换标签样式
  switchTab: function (e) {
    this.setData({
      currentTab: e.detail.current
    });
    this.checkCor();
  },
  // 点击标题切换当前页时改变样式
  swichNav: function (e) {
    var cur = e.target.dataset.current;
    if (this.data.currentTaB == cur) { return false; }
    else {
      this.setData({
        currentTab: cur
      })
    }
  },
  //判断当前滚动超过一屏时,设置 tab 标题滚动条。
  checkCor: function () {
    if (this.data.currentTab > 4) {
      this.setData({
        scrollLeft: 300
      })
    } else {
      this.setData({
        scrollLeft: 0
      })
    }
  },
  onLoad: function () {
    var that = this;
    //  高度自适应
    wx.getSystemInfo({
      success: function (res) {
        var clientHeight = res.windowHeight,
          clientWidth = res.windowWidth,
          rpxR = 750 / clientWidth;
        var calc = clientHeight * rpxR - 180;
        console.log(calc)
        that.setData({
          winHeight: calc
        });
      }
    });
  },
  footerTap: app.footerTap
})

2. 星级评分

按照惯例,先上效果图。

在实例中,默认一星,点击可以选择星级,可半星显示。

来看看代码。首先是 WXML:

<view class='accessWrapper'> 
  <view class='title'>
    评价 
    <view class='starsWrapper'>
      <block wx:for="{{stars}}">
        <image class="star-image" style="left: {{item*50}}rpx" src="{{key > item ?(key-item == 0.5?halfSrc:selectedSrc) : normalSrc}}">
          <view class="item" style="left:0rpx" data-key="{{item+0.5}}" bindtap="selectLeft"></view>
          <view class="item" style="left:25rpx" data-key="{{item+1}}" bindtap="selectRight"></view>
        </image>
      </block>
    </view> 
  </view>
 
<!-- 这里绑定是 bindInput 而不是 bindtab -->
<textarea bindinput='textAreaCon' placeholder='写点什么吧...' auto-focus='true'></textarea> 
<view class='uploadFile' bindtap='upload'>+</view> 
</view>

<button type='submit' bindtap='saveAccess' class='save-edit'> 提交保存</button>

然后是 WXSS 样式。

page{
  background: #f5f5f5;
}

.accessWrapper{
  background: #fff;
  font-size: 14px;
  padding-bottom: 10px;
}

.accessWrapper textarea{
  width: 94%;
  margin: 0 auto;
  max-height: 200px;
  border-top: 1px solid #f5f5f5;
  padding: 10px 0px;
}

.accessWrapper textarea::-webkit-scrollbar{
  width: 0px;
  height: 0px;
  color: transparent;
}

.accessWrapper .title{
  padding: 10px;
}
.starsWrapper{
  position: absolute;
  top: -20px;
  right: 135px;
}
/* stars */
.star-image {
  position: absolute;
  top: 50rpx;
  width: 50rpx;
  height: 50rpx;
  src: "../../../image/normal.png";
}

.item {
  position: absolute;
  top: 0rpx;
  width: 50rpx;
  height: 50rpx;
}

.uploadFile{
  width: 50px;
  height: 50px;
  border: 1px solid #f5f5f5;
  color: #999;
  text-align: center;
  line-height: 50px;
  font-size: 20px;
  margin-left: 10px;
}

JS 代码:

var app = getApp()
Page({
  data: {
    stars: [0, 1, 2, 3, 4],
    normalSrc: '../../../image/normal.png',
    selectedSrc: '../../../image/selected.png',
    halfSrc: '../../../image/half.png',
    key: 1,//评分
    path: ' ',
    userInput:' '
  },
  onLoad: function () {
    
  },

  //点击右边, 半颗星
  selectLeft: function (e) {
    var key = e.currentTarget.dataset.key
    if (this.data.key == 0.5 && e.currentTarget.dataset.key == 0.5) {
      //只有一颗星的时候, 再次点击, 变为 0 颗
      key = 0;
    }
    console.log("得" + key + "分")
    this.setData({
      key: key
    })
  },
  //点击左边, 整颗星
  selectRight: function (e) {
    var key = e.currentTarget.dataset.key
    console.log("得" + key + "分")
    this.setData({
      key: key
    })
  },

   upload: function () {
    var that = this
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success: function (res) {
        var tempFilePaths = res.tempFilePaths
        console.log(tempFilePaths)
        wx.uploadFile({
          url: 'http://example.weixin.qq.com/upload',
          filePath: tempFilePaths[0],
          name: 'file',
          formData: {
            'user': 'test'
          },
          success: function (res) {
            var data = res.data
            wx.showModal({
              title: '上传文件返回状态',
              content: '成功',
              success: function (res) {
                if (res.confirm) {
                  console.log('用户点击确定')
                }
              }
            })//do something
          },
          fail: function (res) {
            console.log(res)
          }
        })
        that.setData({
          path: tempFilePaths
        })
      }
    })
  },
  
   textAreaCon:function(e){
     var that = this;
     that.setData({
       userInput: e.detail.value,
     })
   },
   saveAccess:function(e){
     if(this.data.userInput == ' '){
       wx.showModal({
         title: '提示',
         content: '对不起,请输入留言内容',
       })
     }else{
      console.log(this.data.userInput);
      //  成功监听用户输入内容
     }
   }
})

3. 自定义底部弹出层

自定义底部弹出层,在电商的小程序中经常会用到,需要根据实际需求,自定义弹出内容。

先看下我的效果:

在这里的示例代码中,我已经把我自定义的部分抽离了出来。

照例,先是 WXML 代码:

<view class='yourPurse' bindtap='showModal1'></view>
<view class="commodity_screen" bindtap="hideModal" wx:if="{{showModalStatus}}"></view>
<view animation="{{animationData}}" class="commodity_attr_box" wx:if="{{showModalStatus}}"></view>

接下来是样式 WXSS:

.commodity_screen {
  width: 100%;
  height: 100%;
  position: fixed;
  top: 0;
  left: 0;
  background: #000;
  opacity: 0.2;
  overflow: hidden;
  z-index: 1000;
  color: #fff;
}

.commodity_attr_box {
  width: 100%;
  overflow: hidden;
  position: fixed;
  bottom: 0;
  left: 0;
  z-index: 2000;
  background: #fff;
  padding-top: 20rpx;
}

JS 代码如下:

showModal: function () {
  // 显示遮罩层
  var animation = wx.createAnimation({
    duration: 200,
    timingFunction: "linear",
    delay: 0
  })
  this.animation = animation
  animation.translateY(300).step()
  this.setData({
    animationData: animation.export(),
    showModalStatus: true
  })
  setTimeout(function () {
    animation.translateY(0).step()
    this.setData({
      animationData: animation.export()
    })
  }.bind(this), 200)
},
hideModal: function () {
  // 隐藏遮罩层
  var animation = wx.createAnimation({
    duration: 200,
    timingFunction: "linear",
    delay: 0
  })
  this.animation = animation
  animation.translateY(300).step()
  this.setData({
    animationData: animation.export(),
  })
  setTimeout(function () {
    animation.translateY(0).step()
    this.setData({
      animationData: animation.export(),
      showModalStatus: false
    })
  }.bind(this), 200)
}

写在后面

这次没有知识点讲解,是我正在做的小程序项目中我做的一些小实例的源码,总结下来了三个非常常用的。如果喜欢,或者对你有帮助,欢迎 copy 和学习。

另外,这个项目最近在 GitHub 上持续更新。

关注「知晓程序」微信公众号,回复「源码」,获取本项目源码更新。

欢迎大家 star、在留言区中留下你的建议。

关注「知晓程序」公众号 👇

  • 在微信后台回复「开发」,获取小程序开发。
  • 在微信后台回复「定制」,做一个属于你的小程序。

登录,参与讨论前请先登录

评论在审核通过后将对所有人可见

正在加载中

小程序商店 minapp.com,一扫即用的小程序大全。微信公众号「知晓程序」,做中国最好的小程序报道。

本篇来自栏目

解锁订阅模式,获得更多专属优质内容