uniapp页面样式和布局和nvue教程详解

uniapp页面样式和布局和nvue教程

尺寸单位

uni-app 支持的通用 css 单位包括 pxrpx

  • px 即屏幕像素。
  • rpx 即响应式px,一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准,750rpx恰好为屏幕宽度。屏幕变宽,rpx 实际显示效果会等比放大。但在 App 端和 H5 端屏幕宽度达到 960px 时,默认将按照 375px 的,屏幕宽度进行计算,具体配置参考:rpx计算配置

rpx 详细说明:

设计师在提供设计图时,一般只提供一个分辨率的图。严格按设计图标注的 px 做开发,在不同宽度的手机上界面很容易变形。而且主要是宽度变形。高度一般因为有滚动条,不容易出问题。由此,引发了较强的动态宽度单位需求。微信小程序设计了 rpx 解决这个问题。 uni-appApp 端、H5 端都支持了 rpx ,并且可以配置不同屏幕宽度的计算方式,具体参考:rpx计算配置。
rpx 是相对于基准宽度的单位,可以根据屏幕宽度进行自适应。uni-app 规定屏幕基准宽度 750rpx
开发者可以通过设计稿基准宽度计算页面元素 rpx 值,设计稿 1px 与框架样式 1rpx 转换公式如: 设计稿 1px / 设计稿基准宽度 = 框架样式 1rpx / 750rpx
换言之,页面元素宽度在 uni-app 中的宽度计算公式:750 * 元素在设计稿中的宽度 / 设计稿基准宽度
页面元素宽度在 uni-app 中的宽度计算举例说明:

  • 若设计稿宽度为 750px,元素 A 在设计稿上的宽度为 100px,那么元素 A 在 uni-app 里面的宽度应该设 为: 750 * 100 / 750 ,结果为:100rpx。
  • 若设计稿宽度为 640px,元素 A 在设计稿上的宽度为 100px,那么元素 A 在 uni-app 里面的宽度应该设 为: 750 * 100 / 640 ,结果为:117rpx。
  • 若设计稿宽度为 375px,元素 B 在设计稿上的宽度为 200px,那么元素 B 在 uni-app 里面的宽度应该设 为: 750 * 200 / 375 ,结果为:400rpx。

注意 :
rpx 是和宽度相关的单位,屏幕越宽,该值实际像素越大。如不想根据屏幕宽度缩放,则应该使用 px 单位。如果开发者在字体或高度中也使用了 rpx ,那么需注意这样的写法意味着随着屏幕变宽,字体会变大、高度会变大。如果你需要固定高度,则应该使用px,rpx不支持动态横竖屏切换计算,使用rpx建议锁定屏幕方向。

全局样式与局部样式

定义在 App.vue 中的样式为全局样式,作用于每一个页面。在 pages 目录下 的 vue 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 App.vue 中相同的选择器。
注意:
App.vue 中通过 @import语句可以导入外联样式文件,一样作用于每一个页面。

<style>
	/*每个页面公共css */
	@import url("../../common/css/common.css");
</style>

uniapp页面样式和布局和nvue教程
效果:
uniapp页面样式和布局和nvue教程详解
APP和小程序中子组件会使用父组件的样式,H5端不会使用父组件的样式。

CSS变量

uni-app 提供内置 CSS 变量

CSS 变量描述App小程序H5
–status-bar-height系统状态栏高度系统状态栏高度250
–window-top内容区域距离顶部的距离00NavigationBar 的高度
–window-bottom内容区域距离底部的距离00TabBar 的高度

注意:

  • var(--status-bar-height) 此变量在微信小程序环境为固定 25px,在 App 里为手机实际状态栏高度。
  • 当设置 "navigationStyle":"custom" 取消原生导航栏后,由于窗体为沉浸式,占据了状态栏位置。此时可以使用一个高度为var(--status-bar-height)view 放在页面顶部,避免页面内容出现在状态栏。
  • 由于在 H5 端,不存在原生导航栏和 tabbar,也是前端 div 模拟。如果设置了一个固定位置的居底 view,在小程序和 App 端是在 tabbar 上方,但在 H5 端会与 tabbar 重叠。此时可使用--window-bottom,不管在哪个端,都是固定在 tabbar 上方。
  • 目前 nvueApp 端,还不支持 --status-bar-height变量,替代方案是在页面 onLoad 时通过 uni.getSystemInfoSync().statusBarHeight 获取状态栏高度,然后通过 style 绑定方式给占位 view 设定高度。

示例:

<template>
	<view>
		<view class="status_bar">
			<!-- 这里是状态栏 -->
		</view>
		<view> 状态栏下的文字 </view>
	</view>
</template>
<style>
	.status_bar {
		height: var(--status-bar-height);
		width: 100%;
		background: red;
	}
</style>

效果:
uniapp页面样式和布局和nvue教程详解

<template/><block/>

uni-app 支持在 template 模板中嵌套 <template/><block/> ,用来进行 列表渲染条件渲染
<template/><block/> 并不是一个组件,它们仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。
<block/> 在不同的平台表现存在一定差异,推荐统一使用 <template/>

<template>
	<view>
		<view class="box">
			<template v-if="test">
				<view>test为true,</view>
				<view>test为true</view>
			</template>
			<template v-else>
				<view>test为false,</view>
				<view>test为false</view>
			</template>
		</view>
	</view>
</template>
<script>
	export default {
		data() {
			return {
				test: false,
			}
		}
	}
</script>

<style>
	.box {
		display: flex;
	}
</style>

效果:
uniapp页面样式和布局和nvue教程详解

Flex 布局

为兼容多端跨平台运行,建议使用flex布局进行开发
阮一峰的flex教程:flex教程

{
display: flex;
flex-direction: row;
}

flex-direction 决定主轴的方向(即项目的排列方向)
flex-wrap 默认情况下,项目都排在一条线(又称"轴线")上。
flex-wrap属性定义,如果一条轴线排不下,如何换 行。
flex-flowflex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
justify-content 定义了项目在主轴上的对齐方式。
align-items 定义项目在交叉轴上如何对齐。
align-content 定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

nvue 教程

        uni-app App 端内置了一个基于 weex 改进的原生渲染引擎,提供了原生渲染能力。在 App 端,如果使用 vue 页面,则使用 webview 渲染;如果使用 nvue 页面(native vue 的缩写),则使用原生渲染。一个 App 中可以同时使用两种页面,比如首页使用 nvue,二级页使用 vue 页面,hello uni-app 示例就是如此。
        虽然 nvue 也可以多端编译,输出 H5 和小程序,但 nvuecss 写法受限,所以如果你不开发 App,那么不需要使用 nvue
        以往的 weex ,有个很大的问题是它只是一个高性能的渲染器,没有足够的 API 能力(比如各种 push sdk 集成、蓝牙等能力调用),使得开发时非常依赖原生工程师协作,开发者本来想节约成本,结果需要前端iOSAndroid 3 拨人开发,适得其反。 nvue 解决了这个问题,让前端工程师可以直接开发完整 App,并提供丰富的插件生态和云打包。这些组合方案,帮助开发者切实的提高效率、降低成本。
        如果一个页面路由下同时有vue页面和nvue页面,即出现同名的vuenvue文件。那么在App端,会仅使用nvue页面,同名的vue文件将不会被编译到App端。而在非App端,会优先使用vue页面。

nvue开发与vue开发的常见区别

基于原生引擎的渲染,虽然还是前端技术栈,但和web开发肯定是有区别的。

  1. nvue 页面控制显隐只可以使用 v-if 不可以使用 v-show
  2. nvue 页面只能使用 flex 布局,不支持其他布局方式。页面开发前,首先想清楚这个页面的纵向内容有什么,哪些是要滚动的,然后每个纵向内容的横轴排布有什么,按 flex 布局设计好界面。
  3. nvue 页面的布局排列方向默认为竖排( column ),如需改变布局方向,可以在 manifest.json -> app-plus -> nvue -> flex-direction 节点下修改,仅在 uni-app 模式下生效。
  4. nvue页面编译为H5小程序时,会做一件css默认值对齐的工作。因为weex渲染引擎只支持flex,并且默认flex方向是垂直。而H5小程序端,使用web渲染,默认不是flex,并且设置 display:flex 后,它的flex方向默认是水平而不是垂直的。所以nvue编译为H5小程序时,会自动把页面默认布局设为flex、方向为垂直。当然开发者手动设置后会覆盖默认设置。
  5. 文字内容,必须、只能在 <text> 组件下。不能在 <div><view>text区域里直接写文字。否则即使渲染了,也无法绑定js里的变量。
  6. 只有 text 标签可以设置字体大小,字体颜色。
  7. 布局不能使用百分比、没有媒体查询。
  8. nvue 切换横竖屏时可能导致样式出现问题,建议有 nvue 的页面锁定手机方向。
  9. 支持的css有限,不过并不影响布局出你需要的界面, flex 还是非常强大的。
  10. 不支持背景图。但可以使用 image 组件和层级来实现类似web中的背景效果。因为原生开发本身也没有web这种背景图概念
  11. css选择器支持的比较少,只能使用 class 选择器。
  12. nvue 的各组件在安卓端默认是透明的,如果不设置 background-color ,可能会导致出现重影的问题。
  13. class 进行绑定时只支持数组语法。
  14. Android端在一个页面内使用大量圆角边框会造成性能问题,尤其是多个角的样式还不一样的话更耗费性能。应避免这类使用。
  15. nvue页面没有 bounce 回弹效果,只有几个列表组件有 bounce 效果,包括 listrecycle-listwaterfall
  16. 原生开发没有页面滚动的概念,页面内容高过屏幕高度并不会自动滚动,只有部分组件可滚动( listwaterfallscroll-view/scroller ),要滚得内容需要套在可滚动组件下。这不符合前端开发的习惯,所以在 nvue 编译为 uni-app模式时,给页面外层自动套了一个 scroller ,页面内容过高会自动滚动。(组件不会套,页面有 recycle-list 时也不会套)。
  17. App.vue 中定义的全局js变量不会在 nvue 页面生效。 globalDatavuex 是生效的。
  18. App.vue 中定义的全局css,对nvuevue页面同时生效。如果全局css中有些cssnvue下不支持,编译时控制台会报警,建议把这些不支持的css包裹在条件编译里, APP-PLUS-NVUE
  19. 不能在 style 中引入字体文件,nvue 中字体图标的使用参考:加载自定义字体。如果是本地字体,可以用plus.ioAPI转换路径。
  20. 目前不支持在 nvue 页面使用 typescript/ts
  21. nvue 页面关闭原生导航栏时,想要模拟状态栏,可以参考文章。但是,仍然强烈建议在nvue页面使用原生导航栏。nvue的渲染速度再快,也没有原生导航栏快。原生排版引擎解析 json 绘制原生导航栏耗时少,而解析nvuejs绘制整个页面的耗时要大的多,尤其在新页面进入动画期间,对于复杂页面,没有原生导航栏会在动画期间产生整个屏幕的白屏或闪屏。

样式

  • nvuecss仅支持flex布局,是webviewcss语法的子集。这是因为操作系统原生排版不支持非flex之外的web布局。当然flex足以排布出各种页面,只是写法需要适应。
  • 在选择器方面支持的较少,只支持简单的 class="classA"
  • class 进行绑定时只支持数组语法。
  • 不支持媒体查询。
  • 不支持复合样式,不支持简写。
  • 不能在 style 中引入字体文件。
  • 布局不能使用百分比,如 width:100%;
  • 有些webcss属性在nvue里无法支持,比如背景图。但可以使用image组件和层级来实现类似web中的背景效果。因为原生开发本身也没有web这种背景图概念。
  • nvue 的各组件在安卓端默认是透明的,如果不设置 background-color ,可能会导致出现重影的问题。
  • 文字内容,必须只能在 text 组件下, text 组件不能换行写内容,否则会出现无法去除的周边空白。
  • 只有 text 标签可以设置字体大小,字体颜色。

nvuevue 相互通讯

uni.$emit(eventName,OBJECT)

触发全局的自定事件。附加参数都会传给监听器回调。
eventName类型String 事件名,OBJECT Object 触发事件携带的附加参数。

代码示例

uni.$emit('update',{msg:'页面更新'})
uni.$on(eventName,callback)

监听全局的自定义事件。事件可以由 uni.$emit 触发,回调函数会接收所有传入事件触发函数的额外参数。

示例:vuenvue的传值通讯
uniapp页面样式和布局和nvue教程详解
index.vue页面代码

<template>
	<view>
		<button @click="sendMessage">点击修改数据</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				message: 'Hello from nVue'
			};
		},
		methods: {
			sendMessage() {
				uni.navigateTo({
					url: '../test/test',
					success: () => {
						// 确保目标页面已经加载
						uni.$emit('ceshi', {
							title: '测试标题',
							content: '测试内容'
						});
					}
				});
			}
		}
	};
</script>

test.nvue页面代码

<template>
  <view>
    <text>Test Page</text>
  </view>
</template>

<script>
export default {
  onLoad() {
    // 注册事件监听器
    uni.$on('ceshi', (data) => {
      console.log('标题:' + data.title);
      console.log('内容:' + data.content);
    });
  },
  onUnload() {
    // 页面卸载时移除事件监听器
    uni.$off('ceshi');
  },
  methods: {}
};
</script>

<style scoped>
/* 可以在这里添加样式 */
</style>

效果:
uniapp页面样式和布局和nvue教程详解

uni.$once(eventName,callback)

监听全局的自定义事件。事件可以由uni.$emit触发,但是只触发一次,在第一次触发之后移除监听器。

属性类型描述
eventNameString事件名
callbackFunction事件回调函数
示例代码:
onLoad() {
	uni.$once('update',function(data){
		console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
	})
}

示例:

<template>
	<view>
		<text>Test Page</text>
	</view>
</template>

<script>
	export default {
		onLoad() {
			uni.$once('ceshi', function(data) {
				console.log('监听到事件来自 update ,携带参数 msg 为:' + data);
			})
		},
		onUnload() {
			// 页面卸载时移除事件监听器
			uni.$off('ceshi');
		},
		methods: {}
	};
</script>

<style scoped>
	/* 可以在这里添加样式 */
</style>

效果:
uniapp页面样式和布局和nvue教程详解

uni.$off([eventName, callback])

移除全局自定义事件监听器。

属性类型描述
eventNameArray[String]事件名
callbackFunction事件回调函数
示例代码
onUnload() {
// 移除 update 监听器
uni.$off('update')
}

上面中已经用到了uni.$off的使用,在每次onUnload页面卸载的时候移除事件监听。

Tips
  • 如果没有提供参数,则移除所有的事件监听器;
  • 如果只提供了事件,则移除该事件所有的监听器;
  • 如果同时提供了事件与回调,则只移除这个回调的监听器;
  • 提供的回调必须跟$on的回调为同一个才能移除这个回调的监听器;

阶段完结~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/919658.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用 Python 与 Turtle 创作属于你的“冰墩墩”!

用 Python 与 Turtle 创作属于你的“冰墩墩”&#xff01; &#x1f980; 前言 &#x1f980;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f980; 前言 &#x1f980; 冰墩墩是2022年北京冬季奥林匹克运动会的官方吉祥物。以熊猫为原型&#x…

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言&#xff1a;数据的宝藏 在这个信息爆炸的时代&#xff0c;数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说&#xff0c;1688上的商品详情就是那些闪闪发光的金子。今天&#xff0c;我们将化身为数据的海盗&#xff0c;用Python这把锋利的剑&#xff0…

力扣hot100-->二分查找

目录 二分查找 1. 33. 搜索旋转排序数组 2. 34. 在排序数组中查找元素的第一个和最后一个位置 3. 240. 搜索二维矩阵 II 3. 287. 寻找重复数 二分查找 1. 33. 搜索旋转排序数组 中等 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&am…

http自动发送请求工具(自动化测试http请求)

点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中&#xff0c;HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求&#xff0c;我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…

蓝队技能-应急响应篇日志自动采集日志自动查看日志自动化分析Web安全内网攻防工具项目

知识点&#xff1a; 1、应急响应-系统日志收集-项目工具 2、应急响应-系统日志查看-项目工具 3、应急响应-日志自动分析-项目工具 演示案例-蓝队技能-工具项目-自动日志采集&自动日志查看&自动日志分析 系统日志自动采集-观星应急工具(Windows系统日志) SglabIr_Co…

Jenkins修改LOGO

重启看的LOGO和登录页面左上角的LOGO 进入LOGO存在的目录 [roottest-server01 svgs]# pwd /opt/jenkins_data/war/images/svgs [roottest-server01 svgs]# ll logo.svg -rw-r--r-- 1 jenkins jenkins 29819 Oct 21 10:58 logo.svg #jenkins_data目录是我挂载到了/opt目录&…

k8s-NetworkPolicy

NetworkPolicy 是k8s中的网络策略可以限制pod以及namespace之间的访问流量 演示一下名称空间之间基于端口的访问限制 官方对networkpolicy的介绍 官方网址&#xff1a; 网络策略 |Kubernetes &#xff08;简体中文&#xff09; 一&#xff1a;创建NetworkPolicy vim…

【算法一周目】滑动窗口(1)

目录 长度最小的子数组 解题思路 代码实现 无重复字符的最大字串 解题思路 代码实现 最大连续1的个数l l l 解题思路 代码实现 将x减到0的最小操作数 解题思路 代码实现 长度最小的子数组 题目链接&#xff1a;209. 长度最小的子数组题目描述&#xff1a; 给定一个…

Methode Electronics EDI 需求分析

Methode Electronics 是一家总部位于美国的全球性技术公司&#xff0c;专注于设计和制造用于多个行业的电子和电气组件&#xff0c;产品涵盖汽车、工业、电信、医疗设备以及消费电子等多个领域&#xff0c;提供创新的解决方案。 填写Methode_EDI_Parameters_Template Methode_…

【K8S系列】Kubernetes集群资源管理与调度 深度分析

在现代微服务架构中&#xff0c;Kubernetes&#xff08;K8s&#xff09;作为容器编排平台&#xff0c;提供了强大的资源管理和调度能力。然而&#xff0c;随着应用规模的扩大和复杂性增加&#xff0c;如何高效地管理和调度集群资源成为一个关键挑战。本文将深入探讨 Kubernetes…

HarmonyOS鸿蒙系统上File文件常用操作

HarmonyOS鸿蒙系统上&#xff0c;file文件常用操作记录 1.创建文件 createFile(fileName: string, content: string): string {// 获取应用文件路径let context getContext(this) as common.UIAbilityContext;let filesDirPath context.filesDir / fileName;// 新建并打开…

【SpringMVC - 1】基本介绍+快速入门+图文解析SpringMVC执行流程

目录 1.Spring MVC的基本介绍 2.大致分析SpringMVC工作流程 3.SpringMVC的快速入门 首先大家先自行配置一个Tomcat 文件的配置 配置 WEB-INF/web.xml 创建web/login.jsp 创建com.ygd.web.UserServlet控制类 创建src下的applicationContext.xml文件 重点的注意事项和说明…

DTH11传感器温度湿度+esp8266+阿里云+小程序

arduino在之前灯的基础上再添加两个库 Adafruit_Sensor&#xff0c;#include “DHT.h” 代码如下 #include <ESP8266WiFi.h> // 引入Arduino ESP8266核心库 #include <ArduinoJson.h> // 引入JSON处理库 #include <Ticker.h> // 引入定时库 #inclu…

【汇编语言】转移指令的原理(三) —— 汇编跳转指南:jcxz、loop与位移的深度解读

文章目录 前言1. jcxz 指令1.1 什么是jcxz指令1.2 如何操作 2. loop 指令2.1 什么是loop指令2.2 如何操作 3. 根据位移进行转移的意义3.1 为什么&#xff1f;3.2 举例说明 4. 编译器对转移位移超界的检测结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构…

mac安装appuim

要在macOS上安装Appium&#xff0c;这是一个自动化测试框架&#xff0c;可以用来对移动应用进行测试&#xff08;支持iOS和Android应用&#xff09;。为了安装Appium和其依赖的环境&#xff0c;你需要做一些准备工作。以下是详细的安装步骤&#xff1a; 前提条件 1、macOS系统…

【WSL+Kali】进行系统升级时在 Setting up libc6:amd64 (2.37-15) ... 卡住不动

问题描述 当尝试执行以下命令进行系统升级时&#xff1a; sudo apt upgrade升级进程在以下步骤中卡住不动&#xff1a; Setting up libc6:amd64 (2.37-15) ...重启系统后&#xff0c;该问题仍然存在&#xff0c;如下图所示&#xff1a; 原因分析 apt命令是一个用于处理包的…

DevOps工程技术价值流:加速业务价值流的落地实践与深度赋能

DevOps的兴起&#xff0c;得益于敏捷软件开发的普及与IT基础设施代码化管理的革新。敏捷宣言虽已解决了研发流程中的诸多挑战&#xff0c;但代码开发仅是漫长价值链的一环&#xff0c;开发前后的诸多问题仍亟待解决。与此同时&#xff0c;虚拟化和云计算技术的飞跃&#xff0c;…

微深节能 平板小车运动监测与控制系统 格雷母线

微深节能的平板小车运动监测与控制系统中的格雷母线&#xff0c;是一种高精度、非接触式的位移测量系统&#xff0c;在平板小车的运动监测与控制中发挥着核心作用。 一、系统组成 该系统主要由以下关键部件组成&#xff1a; 地面电气柜&#xff1a;包含地址jie码器等重要组件&a…

【Linux课程学习】:对操作系统(Operator System)的理解

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 操作系统&#xff08;Operator system&#xf…

使用Cursor和Claude AI打造你的第一个App

大家好&#xff0c;使用Cursor和Claude AI打造应用程序是一个结合智能代码辅助和人工智能对话的创新过程。Cursor是一个编程辅助工具&#xff0c;它通过智能代码补全、聊天式AI对话和代码生成等功能&#xff0c;帮助开发者提高编程效率。Claude AI则是一个强大的人工智能平台&a…