当前位置: 首页 > news >正文

微信小程序的手机通讯录点击本页面跳转位置的代码详解

最近开始做小程序,通读一遍文档再上手并不算难,但不得不说小程序里还是有一些坑。这里说一下如何实现页面锚点跳转,一个城市列表的效果示意图如下:

因为在微信小程序的环境中不能想在浏览器里设置标签,或者操作dom滚动,传统做法就行不通了,一切都得按小程序的文档来。

一开始我们的做法是使用boundingClientRect()方法获取每个锚点的坐标,然后再用wx.pageScrollTo()方法滑动过去。结果发现效果不是很好,因为boundingClientRect方法返回的每个点的坐标会随着屏幕滑动而变化,可能还会引起页面抖动,最后还是选择scroll-view(可滚动视图区域)组件来实现锚点效果。

具体实现

具体API就不赘述了,可以去看官方文档,这里讲几个需要注意的地方,下面是一个示意的scroll-view组件代码,上面的几个属性是必须的:

复制代码代码如下:
<scroll-view scroll-y style="height: {{height}}px;" bindscroll="scroll" scroll-into-view="{{toView}}" >

scroll-into-view:这个绑定了一个属性,它的值应该是页面元素的id,设置它的值就可以跳转到ID对应的元素那里了。

scroll-y:添加这个属性标明是竖向滑动的,对应的scroll-x则表示横向滑动,竖向滑动时scroll-view必须设置一个固定的height

bindscroll:监听滑动,传给他一个事件,滑动时执行该事件

文档上给的属性特别多,暂时只需要上述几个就可实现我们想要的效果。实现原理也很简单,内容部分,每个英文简写的view设置一个id,然后在导航list那里点击时,就把scroll-into-view的值设置成点击的那个id即可实现跳转。

再说一下scroll-view的高度问题,这个一定要做适配的固定高度,不然在不同屏幕大小的手机上的显示效果有差异。

获取屏幕大小的代码:height是个变量,获取到的高度付给他,并反馈到页面

  onLoad: function (options) {

    var that = this
    // 获取系统信息
    wx.getSystemInfo({
      success: function (res) {
        // 计算主体部分高度,单位为px
        that.setData({
          height: res.windowHeight
        })
      }
    })
  },

 

几点优化

到这里功能基本都实现了,但后面还发现一些问题:如果要隐藏scroll-view的滚动条,需要设置css样式:::-webkit-scrollbar

::-webkit-scrollbar {
 width: 0;
 height: 0;
 color: transparent;
}

还有就是点了一个锚点实现了跳转,这个时候你滚动页面再点之前点的锚点,页面就不会再跳转了,这个时候就需要监听滚动事件,滚动时将scroll-into-view属性的值清空。或者在每次锚点跳转后,再由一个异步操作将scroll-into-view属性的值清空。

scroll-view默认是无滑动动画的,需要滚动的动画效果需要在组件上设置:

scroll-with-animation='true'

关于固定高度height的设置问题,一开始我以为这个高度和滚动元素的数目/高度有关,这个时候处理动态变化的列表就很麻烦。后面在网上看到的一个方法就是使用wx.getSystemInfo方法得到windowHeight,把这个设置为scroll-view的高度(单位为px)即可。

 

 

 

自己的测试代码

wxml代码:

<scroll-view scroll-y style="height: {{height}}px" bindscroll="scroll" scroll-into-view="{{toView}}" scroll-with-animation='true'
>
<view wx:for="{{carModel}}">
  <view wx:for = "{{item}}">
  <view wx:if="{{item.id == 0}}" id="{{item.name}}">
    <view class='zimu'>
      <view class='weizhi'>
        {{item.name}}
      </view>
     </view>
  </view>
  <view wx:else> 
    <view class='carFrame'>
      <image src='{{item.url}}' class='tupian'></image>
      <view class='carText'>{{item.name}} </view>
    </view>
  </view>
  </view>
</view>
  <view id='cdwz'>
    <view wx:for="{{letter}}" class='caidan' bindtap='jump' id="{{index}}">
    {{item}}
    </view>
  </view>
</scroll-view>

wxss代码:

/* 汽车图片 */
.tupian{
  width: 100rpx;
  height: 100rpx;
  display:inline-block;
  vertical-align:middle;
  margin-left: 10rpx;
}
/* 汽车外框 */
.carFrame,.biaotou{
  font-size: 30rpx;
  width: 100%;
  height: 100rpx;
  line-height: 50rpx;
  border-bottom: 1rpx solid #F4F4F8;
  display:inline-block;
}
/* 文本文字 */
.carText{
  font-size: 28rpx;
  margin-left: 50rpx;
  display:inline-block;
  vertical-align:middle;
}
/* 字母属性 */
.zimu{
  height: 50rpx;
  border-bottom: 1rpx solid #F4F4F8;
  font-size: 29rpx;
  color: #777777;
}
/* 字母位置 */
.weizhi{
  margin:10rpx 0 0 18rpx;
}
/* 菜单位置 */
#cdwz{
  position: fixed;
  right: 30rpx;
  top: 80rpx;
  text-align: center;
}
/* 字母菜单样式 */
.caidan{
  font-size: 25rpx;
  margin-top: 10rpx;
  color: #007ADF;
}
::-webkit-scrollbar {
 width: 0;
 height: 0;
 color: transparent;
}

js代码:

  //获取屏幕高度

  var screenHeight = wx.getSystemInfo({
    success: function (res) {
      screenHeight = res.windowHeight
    }
  })
Page({

  /**
   * 页面的初始数据
   */
  data: {
    toView:'',
    height:"",
    carModel: [
      [
        {
          id: "0",
          name: "A"
        },
      ],
      [
      {
        id: "0",
        name: "B"
      },
      ],
      [
        {
          id: "0",
          name: "C"
        },
      ],
      [
        {
          id: "0",
          name: "D"
        },
      ],
      [
        {
          id: "0",
          name: "E"
        },
      ],
      [
        {
          id: "0",
          name: "F"
        },
      ], 
      [
        {
          id: "0",
          name: "G"
        },
      ], 
      [
        {
          id: "0",
          name: "H"
        },
      ], 
      [
        {
          id: "0",
          name: "I"
        },
      ],
      [
        {
          id: "0",
          name: "J"
        },
      ], 
      [
        {
          id: "0",
          name: "K"
        },
      ], 
      [
        {
          id: "0",
          name: "L"
        },
      ], 
      [
        {
          id: "0",
          name: "M"
        },
      ], 
      [
        {
          id: "0",
          name: "N"
        },
      ], 
      [
        {
          id: "0",
          name: "O"
        },
      ], 
      [
        {
          id: "0",
          name: "P"
        },
      ], 
      [
        {
          id: "0",
          name: "Q"
        },
      ], 
      [
        {
          id: "0",
          name: "R"
        },
      ], 
      [
        {
          id: "0",
          name: "S"
        },
      ], 
      [
        {
          id: "0",
          name: "T"
        },
      ], 
      [
        {
          id: "0",
          name: "U"
        },
      ], 
      [
        {
          id: "0",
          name: "V"
        },
      ], 
      [
        {
          id: "0",
          name: "W"
        },
      ], 
      [
        {
          id: "0",
          name: "X"
        },
      ], 
      [
        {
          id: "0",
          name: "Y"
        },
      ], 
      [
        {
          id: "0",
          name: "Z"
        },
      ],
    ],
    letter: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],
    },
  jump: function (num){
    var text = this.data.letter[num.target.id];
    this.setData({
      toView: text,
    })
    console.log(text);

  },
  onLoad: function (options) {

    var that = this
    // 获取系统信息
    wx.getSystemInfo({
      success: function (res) {
        // 计算主体部分高度,单位为px
        that.setData({
          height: res.windowHeight
        })
      }
    })
  },

})  

    

 

转载于:https://www.cnblogs.com/baobaoa/p/9641860.html

相关文章:

  • 阿里云搬家用。
  • 『中级篇』overlay网络和etcd实现多机的容器通信(31)
  • HTTPS协议详解(三):PKI 体系
  • 日志分析方法
  • 2018年最新苹果开发者账号申请流程
  • 【Spark】环境搭建(CentOS7)
  • 指定UIView的某几个角为圆角
  • 内存屏障和 volatile 语义
  • 上传本地代码到github
  • Centos Crontab查看状态和开启
  • dotnet core高吞吐Http api服务组件FastHttpApi
  • 第四十一天
  • 秒级展现的百万级大清单报表怎么做
  • Confluence 6 属性的一个活动
  • 怎样寻回参数错误K盘的资料
  • SegmentFault for Android 3.0 发布
  • angular学习第一篇-----环境搭建
  • CEF与代理
  • crontab执行失败的多种原因
  • express + mock 让前后台并行开发
  • JAVA_NIO系列——Channel和Buffer详解
  • java2019面试题北京
  • JavaScript-Array类型
  • JavaScript标准库系列——Math对象和Date对象(二)
  • js正则,这点儿就够用了
  • Magento 1.x 中文订单打印乱码
  • php面试题 汇集2
  • React 快速上手 - 07 前端路由 react-router
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • WebSocket使用
  • 闭包--闭包作用之保存(一)
  • 力扣(LeetCode)22
  • 入手阿里云新服务器的部署NODE
  • 手写一个CommonJS打包工具(一)
  • 推荐一个React的管理后台框架
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • ​Spring Boot 分片上传文件
  • #14vue3生成表单并跳转到外部地址的方式
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2)STL算法之元素计数
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (js)循环条件满足时终止循环
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET关于 跳过SSL中遇到的问题
  • /usr/bin/env: node: No such file or directory
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [20150321]索引空块的问题.txt
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C]整形提升(转载)