Responsive design adapts to different screen sizes.
CSS media queries:
1.container {2 display: grid;3 grid-template-columns: 1fr;4}56@media (min-width: 768px) {7 .container {8 grid-template-columns: repeat(2, 1fr);9 }10}1112@media (min-width: 1024px) {13 .container {14 grid-template-columns: repeat(3, 1fr);15 }16}
Tailwind CSS:
1function ResponsiveGrid({ children }) {2 return (3 <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">4 {children}5 </div>6 );7}
Media query hook:
1function useMediaQuery(query: string): boolean {2 const [matches, setMatches] = useState(false);34 useEffect(() => {5 const media = window.matchMedia(query);6 setMatches(media.matches);78 const listener = (e: MediaQueryListEvent) => setMatches(e.matches);9 media.addEventListener("change", listener);10 return () => media.removeEventListener("change", listener);11 }, [query]);1213 return matches;14}1516// Usage17function Component() {18 const isMobile = useMediaQuery("(max-width: 768px)");19 return isMobile ? <MobileLayout /> : <DesktopLayout />;20}
Responsive images:
1<picture>2 <source media="(min-width: 1024px)" srcSet="large.jpg" />3 <source media="(min-width: 768px)" srcSet="medium.jpg" />4 <img src="small.jpg" alt="Responsive" />5</picture>
Best practices: