一套代码如何同时适配移动端和pc端

1. 媒体查询(Media Query)+ CSS Flex/Grid(适用于简单布局)

利用 CSS 的 @media 进行响应式设计,使页面在不同设备上适配。例如:

css 复制代码
/* 默认 PC 端样式 */
.container {
  width: 1200px;
  margin: 0 auto;
}

/* 移动端适配 */
@media screen and (max-width: 768px) {
  .container {
    width: 100%;
    padding: 0 16px;
  }
}

适用于:

✅ 结构简单、仅靠 CSS 即可完成适配的项目。

❌ 需要手动写多个 @media 规则,维护成本较高。


2. rem / vw+vh 适配(适用于移动端为主的场景)

  • rem 方案:根据 htmlfont-size 变化来调整页面比例。常与 postcss-pxtorem 配合使用。
  • vw / vh 方案:使用视口单位 vw(相对于视口宽度的 1%)进行布局。

示例(rem 方案):

css 复制代码
html {
  font-size: calc(100vw / 375 * 16); /* 以 375px 设计稿为基准 */
}
.container {
  width: 20rem; /* 根据设计稿换算成 rem */
}

适用于:

✅ 主要针对移动端,兼容 PC。

❌ 适配 PC 时可能会遇到一些尺寸问题。


3. 使用 useMediaQuery 监听设备类型(更灵活的方式)

可以用 Vue3 的 refcomputed 结合 window.matchMedia 来监听屏幕尺寸,动态切换组件或布局:

javascript 复制代码
import { ref, onMounted, onUnmounted } from "vue";

export function useDeviceType() {
  const isMobile = ref(window.matchMedia("(max-width: 768px)").matches);

  const updateDeviceType = () => {
    isMobile.value = window.matchMedia("(max-width: 768px)").matches;
  };

  onMounted(() => {
    window.addEventListener("resize", updateDeviceType);
  });

  onUnmounted(() => {
    window.removeEventListener("resize", updateDeviceType);
  });

  return { isMobile };
}

在组件中使用:

xml 复制代码
<script setup>
  import { useDeviceType } from "@/hooks/useDeviceType";

  const { isMobile } = useDeviceType();
</script>

<template>
  <div v-if="isMobile">移动端界面</div>
  <div v-else>PC 端界面</div>
</template>

适用于:

✅ 适配不同设备时可以动态渲染不同组件,减少无效的 DOM。

❌ 需要写额外的逻辑,稍微增加代码复杂度。


4. 基于 vite-plugin-style-import 按需加载不同端的样式

如果 UI 组件库支持不同端(如 Vant 针对移动端,Ant Design Vue 针对 PC 端),可以按需加载:

javascript 复制代码
import styleImport from 'vite-plugin-style-import'

export default defineConfig({
  plugins: [
    styleImport({
      libs: [
        {
          libraryName: 'vant',
          esModule: true,
          resolveStyle: (name) => `vant/es/${name}/style/index`,
        },
        {
          libraryName: 'ant-design-vue',
          esModule: true,
          resolveStyle: (name) => `ant-design-vue/es/${name}/style/index`,
        },
      ],
    }),
  ],
});

适用于:

✅ 需要在 PC 端和移动端使用不同 UI 组件库的情况。

❌ 不能解决布局适配问题。


5. 自动适配的 lib-flexible + postcss-pxtorem

如果项目主要是移动端,同时希望在 PC 端也适配,可以用 lib-flexible + postcss-pxtorem 来自动转换 px:

  1. 安装:
css 复制代码
npm install amfe-flexible postcss-pxtorem --save
  1. main.ts 引入:
arduino 复制代码
import 'amfe-flexible'
  1. postcss.config.js 配置:
java 复制代码
module.exports = {
  plugins: {
    "postcss-pxtorem": {
      rootValue: 37.5, // 设计稿是 375px
      propList: ["*"], // 需要转换的属性
    },
  },
};

适用于:

✅ 主要是移动端项目,同时希望 PC 端也能展示。

❌ 依赖 amfe-flexible,部分 UI 组件库可能不兼容。


6. Vue3 + Tailwind CSS(推荐)

如果不想写一堆 @media,可以用 Tailwind CSS 的 smmdlg 进行适配:

xml 复制代码
<template>
  <div class="w-full p-4 text-center sm:bg-blue-200 md:bg-green-200 lg:bg-red-200">
    <p class="text-sm md:text-lg lg:text-2xl">不同屏幕尺寸显示不同颜色</p>
  </div>
</template>

适用于:

✅ 开箱即用,开发速度快。

❌ 需要学习 Tailwind 语法。


7. 使用 VueUse useWindowSize 进行监听

VueUse 提供了 useWindowSize 来动态适配:

arduino 复制代码
import { useWindowSize } from '@vueuse/core';

const { width } = useWindowSize();
const isMobile = computed(() => width.value < 768);

适用于:

✅ 需要动态判断设备类型的场景。

❌ 需要引入 VueUse 依赖。


8. 双端组件(PC / Mobile 组件分开管理)

可以维护两个独立的组件,在 App.vue 里按条件渲染:

xml 复制代码
<template>
  <MobileLayout v-if="isMobile" />
  <PCLayout v-else />
</template>

适用于:

✅ 适配复杂项目,PC 和移动端 UI 差异较大时。

❌ 代码量增加,维护成本高。


总结

方案 适用场景 维护成本 适配能力
Media Query 适用于简单布局 ⭐⭐⭐
rem/vw 适配 主要移动端 ⭐⭐⭐⭐
useMediaQuery 监听 组件级适配 ⭐⭐⭐⭐
vite-plugin-style-import UI 组件按需加载 ⭐⭐⭐
lib-flexible + pxtorem H5 项目 ⭐⭐⭐⭐
Tailwind CSS 快速开发 ⭐⭐⭐⭐
useWindowSize 监听 动态调整 ⭐⭐⭐⭐
双端组件 复杂项目 ⭐⭐⭐⭐⭐

推荐方案

  • 移动端为主rem + vw/vhlib-flexible
  • PC & 移动端共存useMediaQuery + Tailwind CSS
  • PC & 移动端布局差异大双端组件

结论: 取决你的项目主要是 PC 还是移动端?

相关推荐
anyup1 分钟前
🔥 🔥 为什么我建议你使用 uView Pro 来开发 uni-app 项目?
前端·vue.js·uni-app
Skelanimals1 分钟前
Elpis全栈框架开发总结
前端
蓝胖子的小叮当5 分钟前
JavaScript基础(十三)函数柯里化curry
前端·javascript
孪创启航营9 分钟前
数字孪生二维热力图制作,看这篇文章就够了!
前端·three.js·cesium
宫水三叶的刷题日记12 分钟前
真的会玩,钉钉前脚辟谣高管凌晨巡查工位,小编随后深夜发文
前端·后端·面试
zzywxc78721 分钟前
AI 行业应用:金融、医疗、教育、制造业领域的落地案例与技术实现
android·前端·人工智能·chrome·金融·rxjava
Juchecar28 分钟前
Vue 3 + Naive UI 调用useMessage的方法(在Naive UI 2.42.0实测有效)
前端
前端Hardy43 分钟前
HTML&CSS:超酷炫的3D动态卡片
前端·javascript·css
RaidenLiu1 小时前
从 Provider 迈向 Riverpod 3:核心架构与迁移指南
前端·flutter
前端进阶者1 小时前
electron-vite_18Less和Sass共用样式指定
前端