在uni-app开发微信小程序等项目时,经常会遇到这样的页面布局需求:上半部分高度固定,下半部分自动占满剩余高度,如下图所示应用场景:上半部分为固定高度或内容填充高度的内容区域下半部分为scroll-view滑动区域,可以无限下拉滚动进行数据加载
由于scroll-view实现纵向滚动需要设置高度height,如果设置一个固定的高度值将会使页面在不同屏幕尺寸下出现内容溢出屏幕或无法占满整个屏幕的情况,使页面看起来很不美观😅
因此为了提升用户体验,应该始终让整个页面保持在屏幕区域内固定,通过计算出页面的剩余高度,动态获取scroll-view高度,从而实现滚动组件的高度自适应。
页面剩余高度 = 屏幕高度 - 上方区域高度
由于微信小程序并非运行在浏览器环境下,因此如果进行直接进行DOM操作在H5端运行正常,小程序端会报错❌
还好uni-app官方提供了uni.createSelectorQuery()和nodesRef.boundingClientRect(callback)可以获取到小程序的节点和对应节点信息🎉
好的👌,那么大致的实现思路就已经确定了✅
uni.getSystemInfoSync().windowHeight获取到屏幕高度ScreenHeight🖥uni.createSelectorQuery().in().select('#top')获取上方区域节点nodesRef.boundingClientRect(callback)获取上方节点的高度信息TopHeightVue3提供了Hooks代替Vue2的mixins进行复用逻辑抽离,考虑到大部分的滚动列表使用场景可能都需要动态计算高度,因此通过Hooks进行代码抽离是很有必要的。
// useScrollH.ts
/** Hooks 动态计算scrollList滑动区域高度
* @param {Number} offset 可选 -offset偏移量 手动微调scroll高度
* */
import { ref, getCurrentInstance } from 'vue'
export const useScrollHeight = (offset?: number):any => {const scrollHeight = ref<number>(0) // scroll组件高度const topHeight = ref<number>(0)// 组件上方占用高度const currentInstance = getCurrentInstance(); // vue3绑定thisconst height = uni.getSystemInfoSync().windowHeight // 获取页面高度const topEl = uni.createSelectorQuery().in(currentInstance).select('#top')// 获取#top元素topEl.boundingClientRect((data) => {// 获取顶部高度topHeight.value = (data as any).heightscrollHeight.value = height - topHeight.value - (offset || 0) // 计算剩余高度 offset 偏移量}).exec()return scrollHeight
}
<template><view><Tag id="top" /><view><scroll-view :style="{'height': scrollH + 'px'}" scroll-y></scroll-view></view></view>
</template>
import { ref, watchEffect } from 'vue';
import type { Ref } from 'vue';
import { useScrollHeight } from '@/config/utils/useScrollH';
import { onReady } from '@dcloudio/uni-app';
const scrollH = ref<number>(0) // scroll组件高度
...
// onReady中调用
onReady(() => {let scrollHeight:Ref<number>;scrollHeight = useScrollHeight()watchEffect(() => {scrollH.value = scrollHeight.value})
})
感谢评论区大佬提醒🙏,增加一种纯CSS实现scroll-view动态高度思路👇
page指定高度height:100%display:flex,纵向布局flex-direction:column,height:100vh,溢出隐藏overflow:hiddenflex:1 overflow:scroll,随便给个初始高度,1px即可,不影响布局效果<template><view class="container"><view style="height: 100rpx; background-color: aquamarine;">我是标题</view><scroll-view scroll-y class="scroll-container"><view v-for="item in 100" :key="item">{{item}}</view></scroll-view><view style="height: 100rpx; background-color: aquamarine;">我是结尾</view></view>
</template>
page{height:100%;// 重要
}
.container {display: flex;flex-direction:column;height:100vh;// 重要 设成100%小程序端会失效overflow:hidden;
}
.scroll-container {flex: 1;overflow: scroll;// 重要height: 0;
}
微信小程序端效果展示:
小程序端获取动态高度可能存在延迟,本处使用
watchEffect监听到变化后立即执行,也可以考虑使用setTimeout进行延迟获取。
1.获取节点高度首先要等节点渲染完成,因此要在
onReady中调用> 2.注意小程序端可能存在延迟,考虑使用watchEffect或setTimeout延迟获取
整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。




有需要的小伙伴,可以点击下方卡片领取,无偿分享
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie
我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.
据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b
我正在寻找一种简单的方法来为我在RubyonRails上的项目实现简单的“即将推出”(预启动)页面。用户应该能够留下电子邮件以便在项目启动时收到通知。有没有这样的插件\gem?或者我应该自己做... 最佳答案 LaunchingSoon是一个Rails插件。它还集成了MailChimp或Campaignmonitor. 关于ruby-on-rails-RoR&&"comingsoon"页面,我们在StackOverflow上找到一个类似的问题: https:/
我有一个使用Jekyll托管在GitHub上的静态网站。问题是,我真的不需要master分支,因为存储库唯一包含的是网站。这样我就必须gitcheckoutgh-pages,然后gitmergemaster,然后gitpushorigingh-pages。有什么简单的方法可以摆脱gh-pages分支并直接从master推送? 最佳答案 Theproblemis,Idon'treallyneedthemasterbranch,astheonlythingtherepositorycontainsisthewebsite.Isthere