You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Tailwind CSS和Next JS创建可模拟不同屏幕尺寸的容器

如何用Tailwind CSS和Next JS创建可模拟不同屏幕尺寸的容器

嘿,这个需求太接地气了!我之前帮朋友做网站 builder 的时候也遇到过,每次开调试器拉尺寸真的烦得要死,用Tailwind + Next.js来做这个本地模拟器完全能解决,我给你一步步说清楚:

核心思路

我们要做一个可复用的ScreenSimulator组件,用React状态来切换不同的屏幕尺寸,再通过Tailwind的类来控制容器的宽高、边框样式,让它看起来像真实设备,同时你的页面内容会自动适配容器尺寸(只要你用了Tailwind的响应式类)。

第一步:创建屏幕模拟器组件

先在你的Next.js项目里新建一个客户端组件(因为要用到状态,所以必须加'use client'指令),代码直接拿过去用就行:

'use client';

import { useState } from 'react';

// 定义可选的屏幕尺寸类型
type ScreenSize = 'mobile' | 'tablet' | 'desktop';

export default function ScreenSimulator({ children }: { children: React.ReactNode }) {
  // 初始选中手机尺寸
  const [activeSize, setActiveSize] = useState<ScreenSize>('mobile');

  // 配置不同尺寸对应的Tailwind样式
  const sizeConfig = {
    mobile: {
      width: 'w-[360px]', // 模拟常规手机宽度
      borderRadius: 'rounded-3xl', // 手机圆角更明显
      height: 'min-h-[640px]', // 模拟手机高度
    },
    tablet: {
      width: 'w-[768px]', // 平板宽度
      borderRadius: 'rounded-xl',
      height: 'min-h-[1024px]',
    },
    desktop: {
      width: 'w-[1440px]', // 主流桌面宽度
      borderRadius: 'rounded-lg',
      height: 'min-h-[800px]',
    },
  };

  return (
    <div className="flex flex-col items-center gap-6 py-10 bg-gray-50 min-h-screen">
      {/* 尺寸切换按钮组 */}
      <div className="flex gap-3">
        {Object.entries(sizeConfig).map(([size, _]) => (
          <button
            key={size}
            onClick={() => setActiveSize(size as ScreenSize)}
            className={`px-5 py-2 rounded-md font-medium transition-all duration-200 ${
              activeSize === size
                ? 'bg-blue-600 text-white shadow-md'
                : 'bg-gray-200 hover:bg-gray-300'
            }`}
          >
            {size.charAt(0).toUpperCase() + size.slice(1)}
          </button>
        ))}
      </div>

      {/* 模拟屏幕容器 */}
      <div
        className={`${sizeConfig[activeSize].width} ${sizeConfig[activeSize].height} ${sizeConfig[activeSize].borderRadius} overflow-hidden shadow-2xl bg-white relative`}
      >
        {/* 可选:给手机加个顶部状态栏,更真实 */}
        {activeSize === 'mobile' && (
          <div className="h-5 bg-gray-900 rounded-t-3xl flex items-center justify-center gap-2 px-6">
            <div className="w-2 h-1.5 bg-gray-400 rounded-full"></div>
            <div className="w-12 h-1.5 bg-gray-400 rounded-full"></div>
            <div className="ml-auto flex gap-1">
              <div className="w-2 h-1.5 bg-gray-400 rounded-full"></div>
              <div className="w-3 h-1.5 bg-gray-400 rounded-full"></div>
            </div>
          </div>
        )}
        {/* 你的页面内容容器,加内边距避免贴边 */}
        <div className={`p-4 ${activeSize === 'mobile' ? 'pt-6' : ''}`}>
          {children}
        </div>
      </div>
    </div>
  );
}

第二步:在页面中使用这个组件

把你要预览的网站内容直接嵌套到ScreenSimulator里就行,比如在app/page.tsx里:

import ScreenSimulator from '@/components/ScreenSimulator';

export default function Home() {
  return (
    <ScreenSimulator>
      {/* 这里放你网站 builder 生成的页面内容,用Tailwind响应式类写的内容会自动适配 */}
      <div className="flex flex-col items-center justify-center h-full">
        <h1 className="text-xl md:text-3xl font-bold text-center text-gray-800">
          我的自定义网站预览
        </h1>
        <p className="mt-4 text-gray-600 md:text-lg text-center px-4">
          点击上方按钮切换尺寸,就能直接看到不同设备下的效果啦!
        </p>
        <div className="mt-8 grid grid-cols-1 md:grid-cols-2 gap-4 w-full max-w-md">
          <div className="p-4 bg-blue-50 rounded-lg shadow-sm">
            <h3 className="font-medium text-blue-800">模块1</h3>
            <p className="text-sm text-gray-600 mt-1">这是第一个内容模块</p>
          </div>
          <div className="p-4 bg-green-50 rounded-lg shadow-sm">
            <h3 className="font-medium text-green-800">模块2</h3>
            <p className="text-sm text-gray-600 mt-1">这是第二个内容模块</p>
          </div>
        </div>
      </div>
    </ScreenSimulator>
  );
}

几个实用的优化小技巧

  • 自定义设备尺寸:如果你要模拟特定设备(比如iPhone 15、iPad Pro),直接修改sizeConfig里的width和height值就行,比如iPhone 15是w-[393px] h-[852px]
  • 内容自适应:确保你的页面内容用了Tailwind的响应式前缀(比如md:、lg:),这样在不同尺寸的模拟容器里,内容会自动切换到对应尺寸的样式,完全和真实设备一致
  • 添加设备旋转功能:如果需要横屏预览,可以再加个切换按钮,用Tailwind的rotate-90类来旋转容器,同时交换宽高值

备注:内容来源于stack exchange,提问作者Caleb Gross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:49:34