如何将 tailwindcss 的断点判断逻辑引入到 js 中

我们知道通过 className 增加 md: 等关键字可以让我们在 css 中判断小、中、大屏等。

针对场景的屏幕尺寸,tailwind 设计了 5 档断点:

Breakpoint prefix Minimum width CSS
sm 40rem (640px) @media (width >= 40rem) { ... }
md 48rem (768px) @media (width >= 48rem) { ... }
lg 64rem (1024px) @media (width >= 64rem) { ... }
xl 80rem (1280px) @media (width >= 80rem) { ... }
2xl 96rem (1536px) @media (width >= 96rem) { ... }

来自 tailwindcss Responsive design - Using responsive utility variants to build adaptive user interfaces

比如想让一个元素在小屏隐藏,但其他屏幕展示。可以如下:

tsx 复制代码
<div className='hidden md:block'> ...

页面出现大量的 hidden md:block、hidden md:inline、hidden md:flex ...?追求 DRY 的同学可以去看我的另一篇文章。

但是有时候仅仅通过 hidden className 即 display none CSS 方式隐藏还不够,比如 antd 的 Modal 虽然弹窗主体隐藏了,但是遮罩并未隐藏,表现的现象就是页面出现灰黑色的遮罩。某些情况下基于性能考虑,需要将 DOM 节点完成移除,这就要求我们通过 js 来实现断点逻辑。

基于 tailwindcss 的断点参数,实现 JS 版本

我们基于 ahooks 的 useResponsive,然后自定义断点以符合 tailwindcss 的要求。

tsx 复制代码
// src\hooks\useResponsive.ts
import { configResponsive, useResponsive as useResponsiveAhooks } from 'ahooks'

const config = {
  sm: 0,
  md: 768,
  lg: 1024,
} as const

configResponsive(config)

type IResponsive = {
  /** 📱 */
  mobile: boolean
  /** 📱 or iPad */
  mobileOrTablet: boolean
  /** iPad or 💻 */
  tabletAndUp: boolean
  /** 💻 */
  large: boolean
}

export function useResponsive(): IResponsive {
  // @ts-expect-error
  const responsive: Record<keyof typeof config, boolean> = useResponsiveAhooks()
  // console.log('responsive:', responsive)

  return {
    mobile: !responsive.md,
    mobileOrTablet: responsive.sm && responsive.md && !responsive.lg,
    tabletAndUp: responsive.sm && responsive.md,
    large: responsive.sm && responsive.md && responsive.lg,
  }
}

没有找到平板的 emoji 😅。

使用:

tsx 复制代码
const responsive = useResponsive()

if (responsive.mobile) {
  return <Drawer ...>
}

return <Modal ...>

通过 useResponsive 我们实现了在手机端用抽屉,其他大屏则用弹窗的需求。

还有哪些情况需要用到

总之需要根据屏幕尺寸动态移除元素的地方都可以用到。比如:flex 布局中如果存在 gap,子元素若仅 display none,gap 仍然存在,需要将隐藏的子元素移除出 DOM 才能消除多余的 gap。

相关推荐
Sane4 小时前
react函数组件怎么模拟类组件生命周期?一个 useEffect 搞定
前端·javascript·react.js
伍哥的传说6 小时前
StyleX:Meta推出的高性能零运行时CSS-in-JS解决方案
react.js·原子化css·零运行时css-in-js·meta样式解决方案·构建时css编译·react样式优化·高性能css方案
凉生阿新8 小时前
【React 插件】@uiw/react-md-editor 使用教程:从基础使用到自定义扩展
前端·react.js·前端框架
安心不心安8 小时前
React ahooks——副作用类hooks之useDebounceFn
前端·react.js·前端框架
Youyzq8 小时前
react 流式布局(图片宽高都不固定)的方案及思路
前端·react.js·前端框架
博客zhu虎康8 小时前
React18 严格模式下的双重渲染之谜
javascript·react.js·ecmascript
轻语呢喃9 小时前
Mock : 没有后端也能玩的虚拟数据
前端·javascript·react.js
薛定谔的算法10 小时前
React 项目骨架把“一万行灾难”拆成“百来个各司其职的小文件”
前端·react.js·前端框架
cainiao08060510 小时前
2025版React 20新特性深度解析:全栈革命的终极形态
前端·react.js·前端框架
这个昵称也不能用吗?12 小时前
react性能优化
javascript·react.js·性能优化