Vue 和 uniApp 中 CSS 样式差别

news/2025/1/17 12:56:45/

        之前一直在做vue2的项目,最近开始uniapp的项目,发现两种项目之间css还是有亿点区别的。

一、布局单位

Vue 2 项目

  • 通常使用 px 作为主要的长度单位,这是一个绝对单位,在不同设备屏幕上显示的物理尺寸相同。例如:
css">.container {width: 300px;height: 200px;
}
  • 在响应式设计中,可能会使用 % 或 vwvh 等相对单位,以及媒体查询来适配不同的屏幕尺寸。例如:
css">@media (max-width: 768px) {
.container {width: 50%;}
}

UniApp

  • 推荐使用 rpx 作为长度单位,它是一个相对单位,会根据设备屏幕宽度自动调整元素大小,以实现跨设备的等比例缩放。例如:
css">.container {width: 750rpx;height: 100rpx;
}
  • 对于不同设备,如 iPhone 6 屏幕宽度为 750px,使用 750rpx 会占满整个屏幕宽度,在其他设备上会根据设备宽度自动缩放,保证布局比例一致。

二、样式隔离

Vue 2 项目

  • 一般情况下,全局样式会影响整个应用,除非使用了 CSS 模块化或 Scoped CSS 来限制样式的作用范围。
  • 使用 <style scoped> 可以将样式限制在当前组件内,但子组件的根元素仍然会受到父组件样式的影响。例如:
<template><div class="parent"><child-component></child-component></div>
</template><style scoped>
.parent {background-color: red;
}
</style>
  • 在上述例子中,.parent 类的样式仅作用于父组件,但 child-component 的根元素可能会继承 parent 的部分样式,如字体、颜色等。

UniApp

  • 具有更强的样式隔离机制,页面和组件的样式默认不会相互影响。
  • 页面和组件有各自独立的样式范围,确保样式的独立性和组件的可复用性。例如,在一个页面中定义的样式不会意外地影响其他页面或组件,除非使用 /deep/ 或 >>> 选择器(在 Vue 3 中使用 :deep())来穿透样式隔离。例如:
<template><view class="page-container"><custom-component></custom-component></view>
</template><style>
.page-container {background-color: red;
}
/* 穿透样式隔离,影响子组件 */
/deep/.child-element { color: blue;
}
</style>

三、平台相关的条件编译

UniApp

  • 支持条件编译,可以根据不同的平台应用不同的 CSS 样式。例如:
css">/* #ifdef H5 */
h1 {color: red;
}
/* #endif */
/* #ifdef MP-WEIXIN */
h1 {color: blue;
}
/* #endif */
  • 上述代码中,#ifdef H5 和 #endif 之间的样式仅在 H5 平台生效,#ifdef MP-WEIXIN 和 #endif 之间的样式仅在微信小程序平台生效,方便针对不同平台进行样式调整。

Vue 2 项目

  • 不支持类似 UniApp 的平台条件编译,需要通过 JavaScript 代码或其他方式(如 Vue 的动态绑定)来根据不同平台加载不同的样式。

四、全局样式处理

Vue 2 项目

  • 通常在 src/assets/css 或类似目录下定义全局 CSS 文件,然后在 main.js 或 App.vue 中导入,例如:
// main.js
import './assets/css/global.css';
  • 或者在 App.vue 中直接引入:
<template><div id="app"><router-view></router-view></div>
</template><style>
@import './assets/css/global.css';
</style>

UniApp

  • 可以在 App.vue 的 <style> 中定义全局样式,例如:
<template><view><router-view></router-view></view>
</template><style>
body {background-color: #f0f0f0;
}
</style>
  • 在 App.vue 中定义的样式会影响整个应用程序,适用于设置全局的背景颜色、字体样式等。

五、CSS 预处理器支持

Vue 2 项目

  • 可以使用各种 CSS 预处理器,如 Sass、Less 和 Stylus,需要通过相应的 Webpack 或 Vue CLI 配置。例如使用 Sass:
<template><div class="box">Hello, Vue 2</div>
</template><style lang="scss">
$primary-color: #333;
.box {background-color: $primary-color;border: 1px solid $primary-color;&:hover {background-color: #666;}
}
</style>

UniApp

  • 同样支持 CSS 预处理器,在 <style> 标签中使用 lang 属性指定,如 lang="scss"lang="less" 或 lang="stylus"。例如:
<template><view class="box">Hello, UniApp</view>
</template><style lang="scss">
$primary-color: #333;
.box {background-color: $primary-color;border: 1px solid $primary-color;&:hover {background-color: #666;}
}
</style>

六、CSS 框架的使用

Vue 2 项目

  • 可以使用 Bootstrap、Element UI、Vuetify 等 CSS 框架,通过 npm 安装和导入使用。例如使用 Element UI:
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';Vue.use(ElementUI);

UniApp

  • 可以使用一些专门为移动端开发的 UI 框架,如 uView、uni-ui 等。这些框架会考虑到移动端的特点和 UniApp 的特性。例如使用 uni-ui:
import Vue from 'vue';
import uniUI from 'uni-ui';
import 'uni-ui/lib/uni-ui.css';Vue.use(uniUI);

总结

        Vue 2 项目和 UniApp 在 CSS 基本语法和样式特性上有很多相似之处,都支持 CSS 预处理器、动态样式绑定等。

       但 UniApp 针对移动端开发,有独特的布局单位 rpx,更强的样式隔离机制,支持平台条件编译,更适合跨平台的移动应用开发。

       而 Vue 2 项目在开发 Web 应用时,更多使用 px 等传统单位,样式隔离相对较弱,更注重响应式布局和不同设备的适配,通常需要更多的自定义开发或使用 CSS 框架来实现跨设备的一致性。在实际开发中,根据项目类型和需求选择合适的开发框架和样式处理方式。


http://www.ppmy.cn/news/1563885.html

相关文章

备忘录清单工具:四款电脑桌面备忘录工具分享

在快节奏的现代生活中&#xff0c;无论是工作还是学习&#xff0c;我们每天都会面临各种各样的任务和待办事项。为了更好地管理这些繁杂的事务&#xff0c;一款好用的电脑桌面备忘录工具无疑是提升效率的关键。今天&#xff0c;就让我们一起来看看四款备受好评的备忘录工具。 …

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <5> 5分钟集成好caffeine并使用注解操作缓存

快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…

C语言预处理艺术:编译前的魔法之旅

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、预处理的作用与流程&#xf…

出差人员携带的电脑文件信息安全如何保障?

在数字化时代&#xff0c;企业数据已成为核心资产&#xff0c;而出差人员作为企业与外界交流的桥梁&#xff0c;其携带的数据安全更是重中之重。为了确保出差期间企业数据的安全&#xff0c;除了加强员工的安全意识培训外&#xff0c;还需采取一系列技术措施。 一方面&#xff…

算法【Java】—— 动态规划之子数组问题

最大子数组 https://leetcode.cn/problems/maximum-subarray 状态表示&#xff1a;dp 表每一个位置表示当前位置的最大子数组的和 状态转移方程推导&#xff1a;首先明确子数组是连续&#xff0c;那么当前位置的子数组最大的和要么是自己&#xff0c;要么是前一个位置的最大子…

【大数据】机器学习-----模型的评估方法

一、评估方法 留出法&#xff08;Holdout Method&#xff09;&#xff1a; 将数据集划分为训练集和测试集两部分&#xff0c;通常按照一定比例&#xff08;如 70% 训练集&#xff0c;30% 测试集&#xff09;。训练集用于训练模型&#xff0c;测试集用于评估模型性能。优点&…

nginx 配置域名前缀访问 react 项目

说明一下&#xff1a;我是使用域名转发访问的&#xff0c;访问流程如下&#xff1a; 浏览器 》 服务器1 》 服务器2 由于服务器1已经为 https 的访问方式做了 ssl 证书等相关配置&#xff0c;然后转发到服务器2&#xff0c; 所以在服务器2中不需要再配置 ssl 证书相关的东西了&…

什么是CDN,为什么他可以做缓存?

CDN是Content Delivery Network的缩写&#xff0c;翻译成内容分发网络(这个中文名我一直记不住)&#xff0c;它主要是通过将内容存储在全球各地的边缘节点上&#xff0c;以就近原则向用户提供内容。 CDN可以做缓存是因为它在全球范围内部署了多个边缘节点&#xff0c;这些节点…