uniapp 样式篇

1.全局变量

  • 项目根目录的 uni.scss 文件是uni-app内置的常用样式变量,这个文件会自动引入,开发者可直接引用这个变了
  • 文件默认已经定义了常用的变量,开发者也可以在此基础上继续添加
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;

/* 文字基本颜色 */
$uni-text-color:#333;//基本色
$uni-text-color-inverse:#fff;//反色
$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
$uni-text-color-placeholder: #808080;
$uni-text-color-disable:#c0c0c0;

/* 背景颜色 */
$uni-bg-color:#ffffff;
$uni-bg-color-grey:#f8f8f8;
$uni-bg-color-hover:#f1f1f1;//点击状态颜色
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色

/* 边框颜色 */
$uni-border-color:#c8c7cc;

/* 尺寸变量 */

/* 文字尺寸 */
$uni-font-size-sm:24rpx;
$uni-font-size-base:28rpx;
$uni-font-size-lg:32rpx;

/* 图片尺寸 */
$uni-img-size-sm:40rpx;
$uni-img-size-base:52rpx;
$uni-img-size-lg:80rpx;

/* Border Radius */
$uni-border-radius-sm: 4rpx;
$uni-border-radius-base: 6rpx;
$uni-border-radius-lg: 12rpx;
$uni-border-radius-circle: 50%;

/* 水平间距 */
$uni-spacing-row-sm: 10px;
$uni-spacing-row-base: 20rpx;
$uni-spacing-row-lg: 30rpx;

/* 垂直间距 */
$uni-spacing-col-sm: 8rpx;
$uni-spacing-col-base: 16rpx;
$uni-spacing-col-lg: 24rpx;

/* 透明度 */
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度

/* 文章场景相关 */
$uni-color-title: #2C405A; // 文章标题颜色
$uni-font-size-title:40rpx;
$uni-color-subtitle: #555555; // 二级标题颜色
$uni-font-size-subtitle:36rpx;
$uni-color-paragraph: #3F536E; // 文章段落颜色
$uni-font-size-paragraph:30rpx;


// light background
$light-bg-main: #f5f5f5;
$light-bg-gross: #fff;
$light-bg-menu: #f5f5f5;
// dark background
$dark-bg-main: #19223a;
$dark-bg-gross: #1d2742;
$dark-bg-menu: #2b3757;
// light font
$light-font-title: #666;
$light-font-gross: #666;
// dark font
$dark-font-title: rgba(255, 255, 255, 0.7);
$dark-font-gross: rgba(255, 255, 255, 0.7);
// light border
$light-border-divide: #dfdfdf;
// dark border
$dark-border-divide: #364364;

2.全局样式

  • 定义在 App.vue 中的样式为全局样式,作用于每一个页面
  • 一般将通用样式封装到css文件或者scss文件中,再通过 import 进行引入
  • 如果未使用nvue页面,引入前请使用条件编译,避免额外的麻烦
<style lang="scss">
	/*每个页面公共css */
	//#ifndef APP-PLUS-NVUE
    @import '@/common/common.scss';
    @import '@/static/style/iconfont.css';
    //#endif
</style>

3.页面高度和背景色

  • page标签是应用的根标签,其高度默认由内容撑开,用来放置页面,可以说他是所有页面的根标签
  • 在 H5 平台,page标签会被编译成 uni-page-body 标签,所有页面都放在这个 uni-page-body 标签下面
  • 官方pages.json -> globalStyle -> backgroundColor 节点配置无效,要设置全局背景色可以在page标签中设置
  • 要设置全局页面背景色,需要给page标签设定高度100%,不然看不到理想的效果,背景色可以在page标签中设定
//common.css 所有页面默认背景色
page{
    height: 100%;
    background-color: $uni-bg-color-grey;
}
  • 特定页面背景色:直接在页面中设定page标签的样式即可
<style>
	/* 覆盖全局样式 */
	page{
		background-color: azure;
	}
</style>

<style scoped lang="scss">
	//页面样式
	.page-wrap{
		
	}
</style>

4.样式自适应

  • 通过rpx来实现自适应(750rpx刚好等于当前屏幕宽度),一般用于字体大小,padding,margin等
  • 是否做自适应要看应用的使用场景,还要看项目中用到的插件有没有做自适应,像uni-ui没有使用rpx,他的组件宽高是固定的,使用时要留意,避免比他地方使用rpx布局,而uni-ui没有使用导致样式不统一
  • 目前来说,手机端最小的屏幕是iPhone SE(375 * 667),大屏幕的有iPhone 14 Pro Max(430 * 392),还有一些手持设备(320 * 553),如果要兼容的设备分辨率跨度大,就一定要做自适应,跨度小可以不做
<style scoped>
	.page-wrap{
		font-size: 26rpx;
		padding: 16rpx;
	}
</style>

5.图标

  • 图标可以使用 uni-ui 中的 uni-icons,支持常见的图标类型,支持字体大小(像素)和颜色配置
<!-- 编辑图标 -->
<uni-icons type="compose" size="20"></uni-icons>
<!-- 删除图标 -->
<uni-icons type="trash-filled" size="20"></uni-icons>
<!-- 扫码图标 -->
<uni-icons type="scan" size="20"></uni-icons>
  • 更多图标推荐使用iconfont图标库

6.样式穿透

  • 应用场景:页面中调用组件,需要覆盖组件的原有样式

  • 为何会有样式穿透:为了防止页面样式污染全局,编译样式是会在选择器链条上的最后一个选择器上面挂在data属性选择器,以此来限制此选择器的作用域,但是组件内部的标签本身肯定没有这个动态的data属性,所以直接写样式无效

  • 解决办法:使用样式穿透,使其能正常覆盖组件的样式(原理:改变data属性选择器的位置,不再作用域最后一个选择器)

  • 注意:使用scss语法后,scoped属性一直生效,即使移除也没影响,不知道是不是框架的bug

  • 注意:样式穿透的原理得知,全局样式无需样式穿透

7.分页列表布局

  • 一个常见的分页列表布局:顶部搜索栏底部提交按钮固定不动,而中间放置列表,顶部和底部使用定位脱离文档流,为了不遮挡中间的内容,给页面容器设定padding-top和padding-bottom即可
  • 难点在于:需要手动计算顶部和底部占用的高度,以此来设置padding-top和padding-bottom,可以使用calc()进行计算
<template>
	<view class="page-wrap has-fixed-search has-fixed-btn">
		<!-- 顶部固定搜索 -->
		<view class="fixed-search-box">
			<uni-easyinput placeholder="请输入"></uni-easyinput>
		</view>
		<!-- 列表内容 -->
		<view></view>
		<!-- 底部固定搜索 -->
		<view class="fixed-btn-box">
			<button size="default" type="default">提交</button>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {}
		}
	}
</script>

<style scoped lang="scss">
	view{
		box-sizing: border-box;
	}
	.page-wrap{
		font-size: 26rpx;
		padding: 16rpx;
		.fixed-search-box{
			position: fixed;
			
			/* #ifndef H5 */
			top: 0px;
			/* #endif */
			
			/* #ifdef H5 */
			top: 44px;
			/* #endif */
			
			left:0;
			width: 100%;
			z-index: 99;
			padding: 16rpx;
			background-color: #fff;
		}
		.fixed-btn-box{
			position: fixed;
			bottom: 0;
			left: 0;
			width: 100%;
			padding: 16rpx;
			background-color: #fff;
		}
	}
	/* 防止顶部遮挡 */
	.page-wrap.has-fixed-search{
		/* 固定高度 36px padding 16rpx */
		padding-top: calc(36px + 16rpx);
	}
	/* 防止底部遮挡 */
	.page-wrap.has-fixed-btn{
		/* 固定高度 46px padding 16rpx */
		padding-bottom: calc(46px + 16rpx);
	}
</style>

posted @ 2024-09-11 17:06  ---空白---  阅读(172)  评论(0编辑  收藏  举报