一套代码如何同时适配移动端和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 还是移动端?

相关推荐
崔庆才丨静觅2 分钟前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅23 分钟前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅1 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment1 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅1 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊1 小时前
jwt介绍
前端
爱敲代码的小鱼1 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
Cobyte2 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
NEXT062 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
剪刀石头布啊2 小时前
生成随机数,Math.random的使用
前端