关于小程序swiper图片不能撑满解决方案
创始人
2024-03-26 03:14:41
0

问题描述

最近在写小程序的时候使用了swiper组件,但是发现一个很奇怪的现象,如果给image组件设置mode=“widthFix”的话,那么图片的高度是不够撑满swiper-item的这样就会导致swiper的指示器往下偏移(其实没有偏移,只是图片没有撑满swiper-item的高度罢了)效果如下:
在这里插入图片描述

解决方案

方案一

这个方案我自己想出来的,但是会有一个缺点,如果图片过小的话,强行拉伸会导致图片变样,但是这种情况一般不会存在,ui在设计banner图的时候肯定不会给你那么小的,但是万一呢,哈哈哈,所以如果方案二看不懂的铁铁们,也可以使用这个,如果ui给你的图很小直接拉出出打死哈哈哈哈~~

  • 不要给image设置mode属性
  • 利用css找到image组件设置宽高都为100%
{swiperList}}" wx:key="index">{item.imageUrl}}" >

.main-music .banner .banner-img {width: 100%;height: 100%;
}

方案二

这个方案是看coderwhy大神讲解的,稍微有些许麻烦,其实还好,就是小程序的api有点反人类 哈哈哈

  • 当图片加载完毕后,然后获取到当前图片的高度,
  • 然后给swiper组件设置高度
  • image组件有个事件是当图片加载完毕后触发的
  • 小程序有个api是选择组件的的,使用这个api可以获取到当前选择的组件的宽高等一系列信息
  • 有了这些信息之后我们就可以做对应的操作了
  • 等等,因为图片每次加载完毕都会触发,这里用到了节流函数,这个是自己封装的(也是学code大神的),也可以使用三方库(lodash…),或者干脆不用节流
{bannerHeight}}px;">{swiperList}}" wx:key="index">{item.imageUrl}}">

xxx.js

import { querySelect, ymThrottle } from '../../utils/util'
// 不使用节流的话记得把这个干掉哦
const querySelectThrottle = ymThrottle(querySelect)
Page({data: {swiperList: [],bannerHeight: 130},// 图片加载完毕后触发async onSwipperImageLoad() {const res = await querySelectThrottle('.banner-img')// 不使用节流// const res = await querySelect('.banner-img')this.setData({bannerHeight: res.height})}
})

util.js


// 获取矩形框的宽高等信息
export function querySelect(selector) {return new Promise((resolve, reject) => {const query = wx.createSelectorQuery()query.select(selector).boundingClientRect()query.exec((res) => {resolve(...res)})})
}// 节流
export  function ymThrottle(
cb,
interval = 100,
{ leading = true, traling = false } = {}
) {let startTime = 0;let timer = null;const _throttle = function (...args) {return new Promise((resolve, reject) => {try {const nowTime = Date.now();if (!leading && startTime === 0) {startTime = nowTime;}const waitTime = interval - (nowTime - startTime);if (waitTime <= 0) {if (timer) clearTimeout(timer);const res = cb.apply(this, args);resolve(res);startTime = nowTime;timer = null;return;}// 实现尾部取消// 在间隔点之后添加一个定时器// 如果是间隔点那么就会取消这个定时器if (traling && !timer) {timer = setTimeout(() => {const res = cb.apply(this, args);resolve(res);startTime = Date.now();timer = null;}, waitTime);}} catch (error) {reject(error);}});};// 取消_throttle.cancel = function () {if (timer) clearTimeout(timer);};return _throttle;
}

结尾

都看到这了,如果对君有帮助的话,劳烦君给个双击么么哒吧 哈哈哈!!!

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...