uni-app 小程序中的定位问题 以及 页面安全距离

uni-app 小程序定位问题
一、问题描述:页面上定位偏移

最近接到一个需求,在小程序首页写一个新手引导。
具体内容就是:整个页面背景黑色半透明蒙层,首页上的某几个按钮需要高亮显示(有一些引导提示语指向按钮)

1. 我的问题

ps: 写之前没想到有兼容问题,太大意了;写完成了自测才发现,emo~

最开始,我是直接新写了一个组件,全屏、背景黑色半透明蒙层;然后把要高亮的按钮写出来,通过定位将这些按钮定位到页面以前的位置上;但是,不管我是用rpx或者%或者vh,后面我又考虑了安全距离的问题。但是在不同机型上还是或多或少又问题

2. 解决方案

2.1 方案一:能用
在首页(父组件)中获取到要高亮元素的文职,并且传递给蒙层组件,然后在蒙层组件中通过定位将元素定位到指定位置。而如果又引导线,提示语等,都基于这个元素去定位、移动即可

缺点:
如果存在引导线,提示语等,基于高亮元素去定位,在不同机型(特别是比较老的机型)上可能以一点的便宜,但不会很大,定位的时候留足空间,不要重叠即可

  • 怎么获取元素的位置
const query = uni.createSelectorQuery().in(this);
query.select(".editIcon").boundingClientRect((data) => {
  console.log("得到布局位置信息" + JSON.stringify(data));
  console.log("节点离页面顶部的距离为" + data.top);
}).exec();

2.2 方案二:效果最好,但开发量较大,可视实际情况选用
使用蒙版镂空定位,方法如下:

  • 父组件(首页),整体 z-index: 1
  • 子组件(蒙层组件),只负责蒙层和逻辑部分,判断当前需要显示那个高亮元素,回传到父组件(this.$parent.xxx = xxx 或者 其他通信方案),然后再父组件中通过这个变量去判断 z-index: 2
  • 父组件(首页),父组件中通过这个变量去判断,当时是否高亮显示元素 z-index: 3 这样这个元素就显示在蒙层之上了

缺点:

  1. 元素需要写两套(通过变量判断是否展示蒙层,具体展示什么内容);一套原本正常的元素,一套蒙层高亮元素
  2. 如果高亮元素较多的话,会改动较大

注意:z-index的用法

  1. 只有在元素的position属性值为 relative, absolute, fixed或sticky(即非static) 时才会起作用
  2. 父元素的z-index属性值必须小于子元素的z-index属性值并且也要有position属性值(非static)
二、小程序上的安全距离

safeAreaInsets 安全距离:主要指的是在全面屏手机(如 iPhone X 及以上型号)上,屏幕顶部和底部为了容纳刘海屏或前置摄像头而预留的安全区域。(iPhone X 之前和大部分安卓机是没有的,为0)

1. 怎么获取安全距离
uni.getSystemInfo({ // 获取窗口信息
  success: (res) => {
    this.topSafeDistance = res.safeArea.top; // 顶部安全区域距离
  }
})

safeAreaInsets 的结构

参数类型说明
leftNumber安全区域左侧插入位置
rightNumber安全区域右侧插入位置
topNumber安全区顶部插入位置
bottomNumber安全区域底部插入位置
2. 在那些地方需要注意这个安全距离 => 说白了就是不同机型的适配问题
  1. 页面(绝对)定位 => 正常写页面不会有什么问题;举例:如果想在页面写好后,想写一个元素定位到已经写好的页面上去重叠,就需要注意这个安全距离了,不然会出现定位偏移问题。
  2. 自定义顶部导航栏
  3. 自定义底部导航栏

文章仅为本人学习过程的一个记录,仅供参考,如有问题,欢迎指出!

### 如何在uni-app中集成腾讯位置服务的地图功能 #### 1. 准备工作 为了在 uni-app 中成功集成腾讯地图的功能,开发者需要先完成一些准备工作。这包括注册并创建一个腾讯位置服务平台的应用程序,从而获得相应的密钥(Key),这是后续调用腾讯地图 API 所必需的[^3]。 #### 2. 获取腾讯地图 Key 访问腾讯位置服务官网 (https://lbs.qq.com/) 并登录账号,在 **应用管理 -> 我的应用** 页面创建一个新的应用程序。创建完成后会生成一个专属的 `SK` 或者 `Key`,这个密钥将在之后的开发过程中被用来验证身份和授权请求。 #### 3. 安装依赖包 对于 Native 应用场景下的地图展示需求,推荐直接引入官方提供的 SDK 文件或者通过 npm/yarn 来安装对应的插件库。例如: ```bash npm install @tencent/qqmap-wx-jssdk --save ``` 此命令将会把腾讯地图 JavaScript SDK 添加至项目当中以便于进一步配置使用[^2]。 #### 4. 初始化组件与加载地图 下面是一个简单的例子展示了如何初始化腾讯地图控件以及设置中心点坐标等功能: ```html <template> <view class="container"> <!-- 地图容器 --> <map id="myMap" :longitude="center.longitude" :latitude="center.latitude" scale="16"></map> <!-- 当前定位按钮 --> <button type="primary" bindtap="getCurrentLocation">获取当前位置</button> </view> </template> <script> export default { data() { return { center: { longitude: '', latitude: '' } // 初始地图中心点为空白状态等待更新 } }, methods:{ getCurrentLocation(){ const QQMapWX = require('@tencent/qqmap-wx-jssdk'); let qqmapserv = new QQMapWX({ key: '您的腾讯地图key' // 替换为您自己的key值 }); wx.getLocation({ // 假设此处运行环境支持微信小程序方法 success(res){ this.center.longitude=res.longitude; this.center.latitude=res.latitude; console.log('当前纬经度:', res); // 可在此处继续执行其他逻辑比如标记点位等操作... }.bind(this), fail(err){ console.error('失败原因', err); } }); } } } </script> ``` 上述代码片段实现了基本的地图渲染及用户点击“获取当前位置”后自动调整视图到其所在地理位置的效果[^1]^。 #### 5. 计算两点间距离 如果还需要实现计算两个地理坐标的直线距离,则可以参照如下方式调用相关接口函数: ```javascript function getDistance(lat1, lng1, lat2, lng2) { var radLat1 = deg2rad(lat1); var radLat2 = deg2rad(lat2); var deltaRadLon = deg2rad(lng2 - lng1); var deltaRadLat = radLat2 - radLat1; var a = Math.sin(deltaRadLat / 2) * Math.sin(deltaRadLat / 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.sin(deltaRadLon / 2) * Math.sin(deltaRadLon / 2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var distanceInKm = EARTH_RADIUS_KM * c; return distanceInKm.toFixed(2); // 返回保留两位小数的结果单位公里 } // 辅助转换角度制为弧度制的方法 function deg2rad(degrees){ return degrees*(Math.PI/180); } const EARTH_RADIUS_KM=6371;//地球半径平均约等于6371km console.info(getDistance(39.9042 ,116.4074 ,22.5431 ,114.0523)); // 输出两地之间的大致距离 ``` 以上脚本定义了一个名为getDistance的辅助工具类方法用于估算任意给定两组经纬度参数之间的球面最短路径长度近似值[^5]^。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值