#<Image>
1 messages · Page 1 of 1 (latest)
Компонент <Image /> в Astro предназначен для оптимизации и отображения изображений. Он автоматически генерирует необходимые атрибуты (width, height, alt, loading, decoding), чтобы избежать Cumulative Layout Shift (CLS) и повысить производительность сайта. Вот основные сведения по использованию и синтаксису:
Использование
-
Импорт компонента и изображения:
--- import { Image } from 'astro:assets'; import myImage from '../assets/my_image.png'; // локальное изображение --- <Image src={myImage} alt="Описание изображения." />- Для локальных изображений из папки
src/требуется импортировать файл и передавать импорт какsrc<br> - Для изображений из
public/или удалённых — используйте путь или URL:<Image src="/images/my-public-image.png" alt="Описание" width="200" height="150" /> <Image src="<https://example.com/image.jpg"> alt="Описание" width="200" height="150" /> - Для изображений из
public/и удалённых обязательно указыватьwidthиheight, если не используется автоматическое определение размера для remote-изображений с помощьюinferSize<br>
Подробнее о свойствах
- Для локальных изображений из папки
-
Обязательные атрибуты:
src— путь к изображению (импорт, строка или URL)alt— альтернативный текст
-
Дополнительные возможности:
- Поддержка респонсивных изображений через свойство
layout(constrained,full-widthи др.) - Можно передавать любые стандартные атрибуты
<img>, например,class,styleи т.д.
- Поддержка респонсивных изображений через свойство
- Пример с респонсивным изображением:
Это автоматически сгенерирует атрибуты--- import { Image } from 'astro:assets'; import myImage from '../assets/my_image.png'; --- <Image src={myImage} alt="Описание" layout="constrained" width={800} height={600} />srcsetиsizesдля адаптивной загрузки изображений под разные устройства<br>
Подробнее о респонсивных свойствах
Особенности
<Image />работает только в.astroи.mdxфайлах, но не в компонентах UI-фреймворков (React, Vue и т.д.) — там используйте обычный<img />с импортированнымsrc<br>
Подробнее- Для Markdown-файлов используйте стандартный синтаксис
![](), который Astro тоже может оптимизировать<br>
Подробнее
Пример вывода
---
import { Image } from 'astro:assets';
import myImage from '../assets/my_image.png';
---
<Image src={myImage} alt="A description of my image." />
Результат:
<img src="/_astro/my_image.hash.webp" width="1600" height="900" decoding="async" loading="lazy" alt="A description of my image."/>
Документация: Astro компоненты для изображений
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa есть изображение hero.png. как использовать Image для ширины 1920, 1440, 768, 360. по умолчанию 1920
Let me check the knowledge base for you again. One moment! :books:
Чтобы использовать компонент <Image /> для генерации responsive-изображения hero.png с ширинами 1920, 1440, 768, 360 и сделать 1920px значением по умолчанию, укажите свойства widths и sizes:
---
import { Image } from 'astro:assets';
import hero from '../assets/hero.png';
---
<Image
src={hero}
alt="Hero image"
widths={[360, 768, 1440, 1920]}
sizes="(max-width: 360px) 360px, (max-width: 768px) 768px, (max-width: 1440px) 1440px, 1920px"
width={1920}
height={hero.height * (1920 / hero.width)}
/>
widths— список ширин, для которых будут сгенерированы версии изображения.sizes— описывает, какую ширину изображение будет занимать при разных размерах экрана. Последнее значение (1920px) будет использоваться по умолчанию для больших экранов.widthиheight— задают размеры по умолчанию (1920px ширина).
Важно: Если вы используете свойство widths, обязательно указывайте и sizes — иначе Astro не сможет корректно сгенерировать responsive-изображение Подробнее.
Этот подход гарантирует, что браузер загрузит оптимальный размер изображения для каждого устройства, а по умолчанию будет использоваться 1920px для больших экранов.
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa обязательно ли указывать sizes? если по умолчанию и так стоит max-width: 100%
Let me check the knowledge base for you again. One moment! :books:
Да, если вы явно указываете свойство widths для компонента <Image />, то свойство sizes обязательно — его нужно указывать вручную. Это требование Astro: если вы задаёте widths, вы должны также задать sizes, чтобы браузер понимал, при каких условиях использовать каждую из ширин. Если не указать sizes, Astro не сможет корректно сгенерировать responsive-изображение, даже если по стилям стоит max-width: 100% — эти стили не заменяют необходимость в sizes при ручном управлении ширинами через widths Документация: widths, Документация: sizes.
Если вы используете только свойство layout (например, layout="constrained"), то Astro сам сгенерирует и widths, и sizes, и указывать их вручную не нужно. Но при ручном указании widths — sizes обязателен.
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa расскажи про layout
Let me check the knowledge base for you again. One moment! :books:
Свойство layout в компоненте <Image /> Astro определяет, как изображение будет вести себя в адаптивной (responsive) верстке и как оно будет изменять размер в зависимости от контейнера.
Возможные значения:
'constrained'— изображение масштабируется, чтобы поместиться в контейнер, сохраняя пропорции, но не превышает заданные размеры или оригинальные размеры изображения. Это поведение по умолчанию для большинства случаев, когда изображение должно быть адаптивным, но не выходить за пределы контейнера.'full-width'— изображение растягивается на всю ширину контейнера, сохраняя пропорции.'fixed'— изображение сохраняет заданные размеры и не масштабируется. Генерируетсяsrcsetтолько для поддержки дисплеев с высокой плотностью пикселей, но не для разных размеров экрана.'none'— изображение не будет адаптивным, не будут генерироватьсяsrcsetиsizes, и не применяются специальные стили.
Пример использования:
---
import { Image } from 'astro:assets';
import myImage from '../assets/my_image.png';
---
<Image src={myImage} alt="Описание" layout="constrained" width={800} height={600} />
<Image src={myImage} alt="Описание" layout="full-width" />
<Image src={myImage} alt="Описание" layout="none" />
- Если указать
layout, Astro автоматически сгенерирует необходимые атрибутыsrcsetиsizesдля responsive-изображения, а также применит соответствующие стили для адаптивности изображения в зависимости от выбранного типа layout Подробнее в документации.
По умолчанию значение layout можно задать глобально через конфиг image.layout, либо переопределить для конкретного изображения через проп layout Подробнее.
Важно: Если не указать layout, изображение не будет адаптивным, и responsive-атрибуты не будут сгенерированы Источник.
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa а как добавить генерацию для retina дисплея?
Let me check the knowledge base for you again. One moment! :books:
Для генерации изображений для Retina-дисплеев (экраны с высокой плотностью пикселей) в Astro используйте свойство densities у компонента <Image />. Оно позволяет указать, какие варианты плотности пикселей (например, 1.5x, 2x) нужно сгенерировать. В результате Astro создаст srcset с нужными вариантами, и браузер автоматически выберет подходящее изображение для устройства пользователя.
Пример:
---
import { Image } from 'astro:assets';
import myImage from '../assets/my_image.png';
---
<Image
src={myImage}
width={myImage.width / 2}
densities={[1.5, 2]}
alt="Описание изображения для Retina"
/>
В этом примере будут сгенерированы изображения для обычных и Retina-дисплеев (1.5x и 2x) — браузер выберет нужный вариант автоматически.
Важно: Свойство densities не работает совместно с layout или widths — используйте только одно из них для генерации srcset Документация: densities.
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa и как быть? я хочу генерацию размеров + плотность. что делать!?
Let me check the knowledge base for you again. One moment! :books:
В Astro нельзя одновременно использовать свойства widths (или layout, который автоматически генерирует widths) и densities для одного изображения. Это ограничение связано с тем, что HTML-атрибут srcset не поддерживает одновременное использование дескрипторов ширины (w) и плотности пикселей (x). Если попытаться указать оба свойства, Astro выдаст ошибку IncompatibleDescriptorOptions: "Only one of densities or widths can be specified" Подробнее.
Что делать?
- Если вам нужны разные размеры изображения для разных ширин экрана — используйте только
widths(илиlayout). - Если вам нужны варианты для разных плотностей пикселей (Retina) — используйте только
densities. - Одновременная генерация и размеров, и плотностей для одного изображения невозможна из-за ограничений спецификации HTML и Astro.
Рекомендация:
Выберите тот вариант, который важнее для вашего кейса: либо адаптивные размеры (widths/layout), либо поддержка Retina через densities. Если нужно и то, и другое, рассмотрите возможность использования нескольких <Image /> с разными условиями отображения, но автоматического объединения этих подходов в одном компоненте Astro не поддерживает Источник, Ошибка IncompatibleDescriptorOptions.
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa чем <Picture> отличается от <Image>
Let me check the knowledge base for you again. One moment! :books:
Компонент <Picture /> в Astro отличается от <Image /> тем, что позволяет генерировать несколько форматов и/или размеров одного изображения и использовать их в теге <picture>. Это даёт браузеру возможность выбрать наиболее подходящий формат (например, avif, webp, png) в зависимости от поддержки и предпочтений пользователя.
Основные отличия:
-
<Image />генерирует один<img>с оптимизированным изображением и поддерживает responsive-режим (черезlayout,widthsи т.д.) — удобно для большинства случаев, когда нужен только один формат изображения. -
<Picture />генерирует тег<picture>, внутри которого создаются несколько<source>с разными форматами (например,avif,webp), а также fallback-элемент<img>. Это позволяет использовать современные форматы для поддерживаемых браузеров и автоматически подставлять fallback для остальных.
Пример:---import { Picture } from 'astro:assets';import myImage from '../assets/my_image.png';--- <Picture src={myImage} formats={['avif', 'webp']} alt="Описание" />Сгенерирует:
<picture> <source srcset="/_astro/my_image.hash.avif" type="image/avif" /> <source srcset="/_astro/my_image.hash.webp" type="image/webp" /> <img src="/_astro/my_image.hash.png" width="1600" height="900" decoding="async" loading="lazy" alt="Описание" /> </picture> -
<Picture />принимает все свойства<Image />, а также дополнительные, такие какformats,fallbackFormat,pictureAttributesИсточник.
Вывод:
Используйте <Image /> для простых случаев оптимизации, <Picture /> — когда нужно поддерживать несколько форматов изображений для разных браузеров.
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa а как можно использовать генерацию изображения в качестве background-image? как перенести логику
Let me check the knowledge base for you again. One moment! :books:
В Astro для генерации оптимизированного изображения и использования его в качестве background-image рекомендуется использовать функцию getImage() из пакета astro:assets. Эта функция позволяет получить путь к сгенерированному изображению, который затем можно подставить в CSS.
Пример использования:
---
import { getImage } from "astro:assets";
import myBackground from "../background.png";
const optimizedBackground = await getImage({ src: myBackground, format: 'avif' });
---
<div style={`background-image: url(${optimizedBackground.src});`}></div>
- Сначала импортируйте изображение и функцию
getImage. - Вызовите
getImage()с нужными параметрами (например, формат, размеры). - Используйте полученный путь (
optimizedBackground.src) в inline-стиле дляbackground-image.
Важно:
getImage() работает только на сервере и не предназначен для использования на клиенте. Используйте его в .astro-файлах или серверных эндпоинтах Подробнее в документации.
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa приведи пример
Let me check the knowledge base for you again. One moment! :books:
Вот пример использования генерации оптимизированного изображения для background-image с помощью функции getImage() в Astro:
---
import { getImage } from "astro:assets";
import myBackground from "../background.png";
const optimizedBackground = await getImage({ src: myBackground, format: 'avif' });
---
<div style={`background-image: url(${optimizedBackground.src});`}></div>
В этом примере:
- Импортируется изображение и функция
getImage. - С помощью
getImage()генерируется оптимизированная версия изображения. - Полученный путь (
optimizedBackground.src) используется в inline-стиле для свойстваbackground-image.
Этот подход рекомендован для случаев, когда изображение нужно использовать не в теге <img>, а, например, как фон блока Источник.
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa то есть получается только одно изображение? как сделать адаптивный background-image
Let me check the knowledge base for you again. One moment! :books:
Да, функция getImage() генерирует только одно изображение на каждый вызов. Для адаптивного (responsive) background-image, вам нужно самостоятельно сгенерировать несколько вариантов изображения с разными размерами с помощью нескольких вызовов getImage(), а затем использовать CSS media queries для подстановки нужного изображения в зависимости от ширины экрана.
Пример:
---
import { getImage } from "astro:assets";
import myBackground from "../background.png";
const bg360 = await getImage({ src: myBackground, width: 360, format: 'avif' });
const bg768 = await getImage({ src: myBackground, width: 768, format: 'avif' });
const bg1440 = await getImage({ src: myBackground, width: 1440, format: 'avif' });
const bg1920 = await getImage({ src: myBackground, width: 1920, format: 'avif' });
---
<style>
.hero-bg {
background-image: url({bg1920.src});
}
@media (max-width: 1440px) {
.hero-bg {
background-image: url({bg1440.src});
}
}
@media (max-width: 768px) {
.hero-bg {
background-image: url({bg768.src});
}
}
@media (max-width: 360px) {
.hero-bg {
background-image: url({bg360.src});
}
}
</style>
<div class="hero-bg"></div>
Таким образом, вы вручную реализуете адаптивную подгрузку фоновых изображений, используя несколько оптимизированных версий и CSS media queries Документация: getImage().
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa иными словами проще сделать элемент-слой с картинкой в качестве бэкграунда
Let me check the knowledge base for you again. One moment! :books:
Да, если вам нужен адаптивный фон с изображением, то действительно проще реализовать отдельный элемент-слой (div), которому через CSS задаётся background-image. Для этого вы можете сгенерировать несколько оптимизированных версий изображения с помощью функции getImage() и подставлять их через CSS media queries, как показано в предыдущем примере. Astro не предоставляет автоматической генерации responsive background-image, поэтому такой ручной подход — наиболее прямой и рекомендуемый способ Подробнее о getImage().
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
@vocal pollen Kapa.ai is still learning and improving, please let me know how I did by reacting below.
@reef mesa давай про стили поговорим.
import Section from "./shared/Section.astro";
import { Image } from "astro:assets";
import People01 from "@/assets/images/people01.jpg";
<Section class="people" title="Главное – люди">
<Image src={People01} alt=" " layout="constrained" />
<div class="_overlay" inert>
<svg
width="1920"
height="1077"
viewBox="0 0 1920 1077"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M736.067 282.186C933.69 197.632 1183.65 129.093 1467.32 78.7164C1703.46 40.3161 1914.44 13.9909 2240 5.19233V0H-320V1077H447C447 1077 272.131 949 272.131 746.577C272.131 618.03 397.021 435.632 736.067 282.186Z"
fill="#F2F6FF"></path>
</svg>
</div>
</Section>
<style>
.people {
position: relative;
padding-bottom: 0;
& ._section-header {
z-index: 1;
}
& ._overlay {
position: absolute;
inset: 0;
}
}
</style>
Как правильно применить стили к вложенному компоненту <Section>
класс передается. все ок. но скоуп... хромает
Let me check the knowledge base for you again. One moment! :books:
В Astro стили внутри <style> в компоненте по умолчанию scoped — они применяются только к элементам, определённым в этом же файле. Если вы передаёте класс (например, class="people") во вложенный компонент (<Section />), то стили из родительского компонента не применятся к разметке внутри <Section />, потому что scoping Astro этого не позволяет.
Как правильно применить стили к вложенному компоненту:
-
Использовать глобальные стили:
Добавьте атрибутis:globalк вашему<style>, чтобы стили применялись ко всему HTML, включая содержимое вложенных компонентов:<style is:global> .people { ... } .people ._section-header { ... } .people ._overlay { ... } </style>Это снимет ограничение scoping и позволит стилям применяться к разметке, созданной внутри
<Section />Подробнее. -
Вынести стили в отдельный CSS-файл и импортировать его глобально:
Например, создатьpeople.cssи импортировать его в нужных компонентах или в layout Подробнее. -
Передавать стили через props или slots:
Если вы хотите сохранить scoped-стили, можно передавать нужные классы или даже стили как props/slots и применять их внутри самого компонента<Section />— но это требует поддержки на уровне самого компонента.