MDX позволяет интегрировать JSX в Markdown, что открывает возможность управлять контентом на уровне компонентов. Одной из ключевых задач современного веб-разработчика является правильная работа с изображениями, которые адаптируются под разные размеры экранов. В этой статье рассматриваются подходы к реализации responsive изображений с использованием MDX в экосистеме JavaScript.
<img>В MDX можно использовать стандартный HTML-тег
<img>:
<img
src="/images/example.jpg"
alt="Пример изображения"
width="800"
height="600"
style={{ maxWidth: '100%', height: 'auto' }}
/>
Ключевые моменты:
style={{ maxWidth: '100%', height: 'auto' }} позволяет
изображению адаптироваться под ширину контейнера.width и height в атрибутах
помогает браузеру заранее зарезервировать пространство, снижая сдвиги
контента при загрузке.alt обязателен для доступности и SEO.srcSet и sizesДля более гибкой адаптации под разные разрешения экрана необходимо
использовать srcSet и sizes:
<img
src="/images/example-800.jpg"
srcSet="/images/example-400.jpg 400w,
/images/example-800.jpg 800w,
/images/example-1200.jpg 1200w"
sizes="(max-width: 600px) 100vw,
(max-width: 1200px) 50vw,
800px"
alt="Пример responsive изображения"
/>
Объяснение:
srcSet содержит список изображений с указанием их
ширины (w), что позволяет браузеру выбирать оптимальный
вариант.sizes определяет, какую часть ширины экрана изображение
должно занимать. Например, 100vw означает 100% ширины окна
браузера.MDX часто используется совместно с React. В таких проектах можно
использовать специализированные компоненты для responsive изображений,
например, next/image в Next.js или GatsbyImage
в Gatsby.
Пример с next/image:
import Image from 'next/image'
<Image
src="/images/example.jpg"
alt="Пример изображения"
width={800}
height={600}
sizes="(max-width: 600px) 100vw,
(max-width: 1200px) 50vw,
800px"
style={{ borderRadius: '8px' }}
/>
Преимущества использования специализированных компонентов:
lazy loading) по умолчанию.Можно создать универсальный компонент для MDX, чтобы упростить повторное использование:
// components/ResponsiveImage.jsx
export default function ResponsiveImage({ src, alt, widths = [400, 800, 1200], ...props }) {
const srcSet = widths.map(w => `${src.replace(/(\.\w+)$/, `-${w}$1`)} ${w}w`).join(', ')
return (
<img
src={src}
srcSet={srcSet}
sizes="(max-width: 600px) 100vw,
(max-width: 1200px) 50vw,
800px"
alt={alt}
style={{ maxWidth: '100%', height: 'auto' }}
{...props}
/>
)
}
Использование в MDX:
import ResponsiveImage from './components/ResponsiveImage'
<ResponsiveImage src="/images/example.jpg" alt="Пример собственного компонента" />
Особенности подхода:
Для больших изображений и страниц с множеством медиа-контента важна отложенная загрузка:
<img
src="/images/example.jpg"
alt="Отложенная загрузка"
loading="lazy"
style={{ maxWidth: '100%', height: 'auto' }}
/>
Преимущества:
Responsive изображения не ограничиваются <img>.
Можно использовать MDX для вставки блоков с фоновыми изображениями:
<div
style={{
backgroundImage: 'url(/images/bg-800.jpg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
width: '100%',
height: '400px'
}}
></div>
Дополнительные техники:
Responsive изображения в MDX — это сочетание стандартных HTML-тегов,
возможностей JSX и мощных инструментов для оптимизации. Использование
srcSet, sizes, lazy loading и
специализированных компонентов обеспечивает гибкость, производительность
и улучшает опыт пользователей на всех устройствах.