Next.js 移动端适配

本文介绍了如何在Next.js14中配置viewport以实现响应式布局,包括使用layout.tsx中的自动渲染和两种适配方案:cssinjs配合vw单位,以及利用postcss-px-to-viewport-8-plugin进行CSS单位转换。
摘要由CSDN通过智能技术生成

场景:
next.js v14
适配方案:
viewport

前置:

设置meta标签 禁止缩放等

在根目录的layout.tsx里配置Meta标签;

import type { Viewport } from 'next';

...

export const viewport: Viewport = {
  width: 'device-width',
  initialScale: 1,
  maximumScale: 1,
  minimumScale: 1,
  userScalable: false,
};

这样就行了,next.js会自动渲染成meta标签。
在这里插入图片描述
当然你也可以手动写meta标签放到head里;

我这里适配方案有两种:

  1. css in js
    使用css in js的话不需要引入什么插件了,由于1vw = 当前屏幕宽度的1%,我们稍微封装下直接使用就ok了
  2. less/scss预处理
    借助postcss 我们可以用px2vw 自动将像素转成viewport;

css in js方案

我是用的是styled-components 这个库

  1. 先安装
    pnpm add styled-components
  2. 配置next.config.js
    配置config.js文件让其支持style component
const nextConfig = {
	...
	compiler: {
    	styledComponents: true,
  	},
  	...
}
  1. 封装一个方法处理px2vw

config.viewportWidth属性是适配设计稿的宽度 比如设计稿是375 这里就是375
config.unitPrecision属性是转换后的精度(小数点多少位)

import config from '@/static/config';

export const vw = (n: number) => {
  return `${+((n / config.viewportWidth) * 100).toFixed(config.unitPrecision)}vw`;
};
  1. 使用

直接引入styled和刚封装的vw方法

import styled from 'styled-components';

import { vw } from '@/utils';

...

const List = styled.div`
	width: ${vw(100)};
	...
`;

css预处理方法

由于next.js内置了postcss,所以我们不需要再安装postcss/postcss-loader
我这里借助的转换依赖是postcss-px-to-viewport-8-plugin

  1. 安装依赖
    pnpm add -D postcss-px-to-viewport-8-plugin
  2. 配置postcss.config.js文件(没有就自己创建这个文件,位于根目录)
    配置参数,我这里由于需要做h5到pc自适应,所以我H5的css使用的是rpx单位,经过postcss-px-to-viewport-8-plugin插件的转化,会转换成vw单位;
module.exports = {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
    'postcss-px-to-viewport-8-plugin': {
      unitToConvert: 'rpx',
      viewportWidth: 375,
      unitPrecision: 10,
      propList: ['*'],
      viewportUnit: 'vw',
      fontViewportUnit: 'vw',
      selectorBlackList: [],
      minPixelValue: 0,
      mediaQuery: false,
      replace: true,
      exclude: [],
      landscape: false,
      landscapeUnit: 'vw',
      landscapeWidth: 568,
    },
  },
};

tips: tailwindcss/autoprefixer是我安装的依赖,没安装的可以删除这两项,否则会报错!!!

  1. 在scss/less/css文件里直接使用配置的unitToConvert单位即可自动将其转换成vw单位;

以上就是我适配移动端的方案;

注意事项:
postcss-px-to-viewport-8-plugin是无法处理内联样式的,就是说你写在标签style里的属性是不会被转换的,要注意!如果非要用的话可以考虑使用vw方法转换。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值