指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

1.基于tailwind(配合nuxt3框架使用)

个人总结一下,目前感觉如果没有设计稿约束的话,可以直接用响应式布局的框架,如tailwind
但是如果严格按照设计稿来做的话,tailwind的样式可能不够用,所以要自定义很样式,这个可能是tailwind的一大弊端吧
tailwind弊端:
Tailwind CSS虽然好用,但是它有一个非常大的缺点,就是它自身提供的类名是非常有限的,并且它的默认单位是rem,这就导致如果一个项目要严格按照设计稿的尺寸来编写,它需要你手动添加大量的样式,也就是如果一个盒子的宽是375px,虽然你可以使用蓝湖这一类的工具将设计稿转换为rem为单位,375px如果按照16px的基准来转换就是23.4375rem。如果你需要严格参照设计稿,那么你就必须手动在tailwind.config.js文件中添加93.75: "23.4375rem"这一类的参数,如果你每次都要这么进行计算的话,那会是一个非常麻烦的事情,这个时候你会想:直接在tailwind.config.js文件中将1px~2000px全部添加进去不就好了嘛!

事实上是不行,tailwind.config.js文件中,你预设的样式越多,你项目启动的速度就会越慢,因为它会通过postcss进行大量的计算,我尝试过将1px~2000px全部填入配置文件中,每次启动项目的时间大概是在2~3分钟左右。

我在项目中直接没有使用tailwind的样式类库,只用了基本的几个,如:container 其他的都直接写到vue页面的 scope 范围内。基于scss语法 rem 单位。

2.普通网站处理

if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
    window.location.href = "";     //手机 m站
 } else {
    window.location.href = "";     //电脑 www站
 }

3.如何在Nuxt3中检测用户设备并加载相应的用户界面? 上面说了,如果严格按照设计稿来做的话,就需要www 和 m 站各处一套设计稿,对应的样式可能就有两套,页面也有两套,就需要根据用户当前设备来加载相应的界面了 这里使用:mobile-detect 这个js包

安装(基于:https://github.com/hgoebl/mobile-detect.js):

npm i mobile-detect / yarn add mobile-detect

使用: plugins/device.ts 中import 报错: can only be default-imported using the 'esModuleInterop' flag

import {defineNuxtPlugin, useRequestHeaders} from '#app';
import * as  MobileDetect from 'mobile-detect'; // 这样import就不会有问题了

export default defineNuxtPlugin(() => {
    let headers = useRequestHeaders()

    const md = process.server ? new MobileDetect(headers['user-agent']) : new MobileDetect(navigator.userAgent)
    const isMobile = md.phone() !== null || md.mobile() === 'UnknownMobile'
    const isTablet = md.tablet() !== null || md.mobile() === 'UnknownTablet'
    const isDesktop = !isMobile && !isTablet

    return {
        provide: {
            isMobile: () => isMobile,
            isTablet: () => isTablet,
            isDesktop: () => isDesktop
        },
    };
})

但是上面的代码运行以后会报:vite_ssr_import_1 is not a constructor 所以还是改为 plugins/device.js 格式:

import {defineNuxtPlugin, useRequestHeaders} from '#app';
import MobileDetect from 'mobile-detect';

export default defineNuxtPlugin(() => {
    let headers = useRequestHeaders()

    const md = process.server ? new MobileDetect(headers['user-agent']) : new MobileDetect(navigator.userAgent)
    const isMobile = md.phone() !== null || md.mobile() === 'UnknownMobile'
    const isTablet = md.tablet() !== null || md.mobile() === 'UnknownTablet'
    const isDesktop = !isMobile && !isTablet

    return {
        provide: {
            isMobile: () => isMobile,
            isTablet: () => isTablet,
            isDesktop: () => isDesktop
        },
    };
})

4.项目中使用(判断了$isMobile,就可以加载不同的页面了)

<template>
  <div v-if="$isMobile()" > show on mobile </div>
  <div v-else > show on pc </div>
</template>