Next.js + Tailwind CSS 移动端适配方案

前言

在使用 Next.js + Tailwind CSS 开发移动端项目时,需要考虑移动端适配问题。本文将介绍一个优雅的解决方案,帮助你轻松实现移动端响应式设计。

背景

Tailwind CSS 默认使用 rem 单位,这给我们提供了一个很好的切入点。通过动态设置 HTML 根节点的 font-size,我们可以实现完美的移动端适配。

实现

js 复制代码
const UI_WIDTH = 375;
const baseFontSize = 16;

function setRootFontSize() {
  const width = document.documentElement?.clientWidth;
  const fontSize = ((width / UI_WIDTH) * baseFontSize).toFixed(4);
  document.documentElement.style.fontSize = `${fontSize}px`;
}
setRootFontSize();
window.addEventListener('resize', setRootFontSize);

优化:解决页面闪烁

上面方案中存在一个明显的问题:页面加载时会出现闪烁现象。 例如:

  • 设备宽度为 430px
  • 页面初始加载时使用默认的 16px 字体大小
  • JavaScript 执行后才会调整为计算后的字体大小
  • 这个过程会导致页面内容的突然变化,造成闪烁

如何解决呢? 我们可以在 Next.js 的 layout.tsx 中提前注入计算逻辑,这样子在页面加载时,html 会提前设置根节点的 font-size, 避免页面闪烁。

tsx 复制代码
// layout.tsx
<head>
    <script
        dangerouslySetInnerHTML={{
        __html: `
            (function() {
            const UI_WIDTH = 375;
            const baseFontSize = 16;
            function setRootFontSize() {
                const width = document.documentElement?.clientWidth;
                cosnt fontSize = ((width / UI_WIDTH) * baseFontSize).toFixed(4);
                document.documentElement.style.fontSize = fontSize + 'px';
            }
            setRootFontSize();
            window.addEventListener('resize', setRootFontSize);
            })();
        `,
        }}
    />
</head>

总结

这套移动端适配方案具有以下优点:

  • 实现简单,无需引入额外的库。
  • 与Tailwind CSS 完美配合

如果觉得文章有帮助,欢迎点赞转发!

相关推荐
liangshanbo12152 小时前
写好 React useEffect 的终极指南
前端·javascript·react.js
哆啦A梦15885 小时前
搜索页面布局
前端·vue.js·node.js
_院长大人_5 小时前
el-table-column show-overflow-tooltip 只能显示纯文本,无法渲染 <p> 标签
前端·javascript·vue.js
哆啦A梦15886 小时前
axios 的二次封装
前端·vue.js·node.js
阿珊和她的猫6 小时前
深入理解与手写发布订阅模式
开发语言·前端·javascript·vue.js·ecmascript·状态模式
yinuo6 小时前
一行 CSS 就能搞定!用 writing-mode 轻松实现文字竖排
前端
snow@li7 小时前
html5:拖放 / demo / 拖放事件(Drag Events)/ DataTransfer 对象方法
前端·html·拖放
浪裡遊8 小时前
Nivo图表库全面指南:配置与用法详解
前端·javascript·react.js·node.js·php
鸡吃丸子9 小时前
Next.js 入门指南
开发语言·javascript·next.js
漂流瓶jz9 小时前
快速定位源码问题:SourceMap的生成/使用/文件格式与历史
前端·javascript·前端工程化