AMP упрощает создание надёжных, адаптивных и производительных веб-страниц. AMP позволяет создавать стандартные элементы взаимодействия с сайтом без написания JavaScript. Сайт amp.dev включает готовые шаблоны для быстрого старта.
Что вы построите
В этой лабораторной работе вы создадите полностью адаптивную, интерактивную и красивую AMP-страницу, которая будет включать в себя множество функций AMP и расширенных компонентов:
|
Что вам понадобится
- Современный веб-браузер
- Node.js и текстовый редактор или доступ к CodePen или аналогичной онлайн-площадке
- Базовые знания HTML, CSS, JavaScript и инструментов разработчика Google Chrome
Инструменты для обслуживания контента
Мы будем использовать Node.js для запуска локального HTTP-сервера, обслуживающего нашу AMP-страницу. Инструкции по установке Node.js см. на сайте .
Для локального обслуживания контента мы выберем serve — сервер статического контента на базе Node.js. Чтобы установить его, выполните следующую команду:
npm install -g serve
Загрузите шаблон с amp.dev
AMP Templates — это репозиторий шаблонов и компонентов AMP для быстрого старта, которые помогут вам быстро создавать современные, адаптивные страницы AMP.
Посетите AMP Templates и загрузите код для шаблона «Простая статья» для «Лучших фотографий животных года».
Запуск кода шаблона
Извлеките содержимое ZIP-файла.
Выполните команду serve
внутри папки article
, чтобы обслужить файлы локально.
Откройте http://localhost:5000/templates/article.amp.html в браузере. (Порт может быть 3000 или другим в зависимости от версии serve
. Проверьте консоль, чтобы узнать точный адрес.)
Пока мы этим заняты, давайте откроем Chrome DevTools и переключим режим устройства.
Обрезать код шаблона
На этом этапе мы создали в основном функционирующую страницу AMP, но цель этой лабораторной работы — предоставить вам возможность учиться и практиковаться, поэтому...
Удалите все содержимое <body></body>
.
Теперь у нас осталась пустая страница, содержащая только шаблонный код:
В ходе этой лабораторной работы вы добавите множество компонентов на эту пустую страницу, частично воссоздав шаблон с еще большей функциональностью.
AMP-страница — это HTML-страница с дополнительными тегами и некоторыми ограничениями для надежной работы.
Хотя большинство тегов на странице AMP — это обычные HTML-теги, некоторые HTML-теги заменяются специфическими для AMP. Эти пользовательские элементы, называемые компонентами AMP HTML , упрощают реализацию распространённых шаблонов и повышают производительность.
Простейший HTML-файл AMP выглядит следующим образом (иногда его называют шаблоном AMP ):
<!doctype html>
<html ⚡>
<head>
<meta charset="utf-8">
<link rel="canonical" href="hello-world.html">
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
<style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
<script async src="https://cdn.ampproject.org/v0.js"></script>
</head>
<body>Hello World!</body>
</html>
Взгляните на код пустой страницы, созданной вами во время настройки, который включает этот шаблон и несколько дополнений — и, что важно, тег <style amp-custom>
, включающий много минимизированного CSS.
AMP не предъявляет особых требований к дизайну и не навязывает определённый набор стилей. Большинство компонентов AMP имеют очень простую стилистику. Разработчики страниц сами создают свой CSS. Именно здесь в игру вступает <style amp-custom>
.
Однако AMP Templates предоставляет собственные CSS-стили, которые отличаются красивым дизайном, кроссбраузерностью и адаптивностью, что поможет вам быстро создавать элегантные AMP-страницы. Скачанный вами код шаблона включает эти CSS-стили в теге <style amp-custom>.
Начнем с добавления некоторых компонентов, которые мы удалили из шаблона, чтобы создать оболочку для нашей страницы, включая навигационное меню, изображение заголовка страницы и заголовок.
Нам понадобится страница компонентов AMP Start UI , но мы не будем углубляться в детали их реализации. Дальнейшие шаги в этой лабораторной работе предоставят множество возможностей для этого.
Добавить адаптивную навигацию
Перейдите по адресу https://ampstart.com/components#navigation , скопируйте и вставьте HTML-код, предоставленный для RESPONSIVE MENUBAR, в body
вашей страницы.
Код, предоставленный AMP Start, включает необходимую структуру классов HTML и CSS для реализации адаптивной панели навигации на вашей странице.
Попробуйте: измените размер окна, чтобы увидеть, как оно реагирует на разные размеры экрана.
В этом коде используются медиа-запросы CSS и компоненты AMP amp-sidebar и amp-accordion .
Добавить изображение героя и заголовок
AMP Start также предоставляет готовые к использованию фрагменты для красивых, адаптивных главных изображений и заголовков.
Перейдите по адресу https://ampstart.com/components#media , скопируйте и вставьте HTML-код, предоставленный для Fullpage Hero, в свой код сразу после <!-- End Navbar --> comment
в body.
Давайте теперь обновим изображение и заголовок.
Как вы, возможно, заметили, в этом фрагменте кода есть два разных тега amp-img
. Один используется для изображений меньшей ширины и должен указывать на изображение с более низким разрешением, а другой — для изображений большего размера. Они переключаются автоматически в зависимости от атрибута media
, который AMP поддерживает для всех элементов AMP.
Обновите параметры src
, width
и height
для других изображений, а также заголовок на «Самые красивые походы на северо-западе Тихого океана», заменив существующий <figure>...</figure>
на:
<figure class="ampstart-image-fullpage-hero m0 relative mb4">
<amp-img width="600" height="900" layout="responsive" src="https://unsplash.it/600/900?image=1003" media="(max-width: 415px)"></amp-img>
<amp-img height="1800" layout="fixed-height" src="https://unsplash.it/1200/1800?image=1003" media="(min-width: 416px)"></amp-img>
<figcaption class="absolute top-0 right-0 bottom-0 left-0">
<header class="p3">
<h1 class="ampstart-fullpage-hero-heading mb3">
<span class="ampstart-fullpage-hero-heading-text">
Most Beautiful Hikes in the Pacific Northwest
</span>
</h1>
<span class="ampstart-image-credit h4">
By <a href="#" role="author" class="text-decoration-none">D.F. Roy</a>,<br> January 14, 2017
</span>
</header>
<footer class="absolute left-0 right-0 bottom-0">
<a class="ampstart-readmore py3 caps line-height-2 text-decoration-none center block h5" href="#content">Read more</a>
</footer>
</figcaption>
</figure>
Давайте теперь посмотрим на страницу:
Краткое содержание
- Вы создали оболочку для своей страницы, включая адаптивную навигацию, главное изображение и заголовок.
- Вы узнали больше о шаблонах AMP и использовали компоненты AMP Start UI для быстрого создания оболочки страницы.
Полный код этого раздела можно найти здесь: http://codepen.io/aghassemi/pen/RpRdzV
В этом разделе мы добавим на нашу страницу адаптивные изображения, видео, вставки и текст.
Давайте добавим main
элемент, в котором будет размещаться содержимое страницы. Добавим его в конец body:
<main id="content">
</main>
Добавить заголовки и абзацы
Добавьте следующее внутрь main
:
<h2 class="px3 pt2 mb2">Photo Gallery</h2>
<p class="ampstart-dropcap mb4 px3">Vivamus viverra augue libero, vitae dapibus lectus accumsan eget. Pellentesque eget ipsum purus. Maecenas leo odio, ornare nec ex id, suscipit porta ipsum. Ut fringilla semper cursus.</p>
Поскольку AMP — это всего лишь HTML, в этом коде нет ничего особенного, за исключением имён CSS-классов. Что такое px3
, mb2
и ampstart-dropcap
? Откуда они взялись?
Эти классы не являются частью AMP HTML. Шаблоны AMP Start используют Basscss для предоставления низкоуровневого CSS-инструментария и добавления классов, специфичных для AMP Start.
В этом фрагменте px3
и mb2
определены Basscss и преобразуются в padding-left-right и margin-bottom соответственно. ampstart-dropcap
предоставляется AMP Start и увеличивает первую букву абзаца.
Документацию по этим предопределенным классам CSS можно найти на сайтах http://basscss.com/ и https://ampstart.com/components .
Давайте посмотрим, как сейчас выглядит страница:
Добавить изображение
Создавать адаптивные страницы в AMP легко. Во многих случаях сделать компонент AMP адаптивным так же просто, как добавить атрибут layout="responsive"
. Подобно HTML-тегу img
, amp-img
также поддерживает srcset
для указания различных изображений для разной ширины области просмотра и плотности пикселей.
Добавьте amp-img
в main
:
<amp-img
layout="responsive" width="1080" height="720"
srcset="https://unsplash.it/1080/720?image=1043 1080w, https://unsplash.it/720/480?image=1043 720w"
alt="Photo of mountains and trees landscape">
</amp-img>
С помощью этого кода мы создаем адаптивное изображение, указывая layout="responsive"
и указывая width
и height.
Почему при использовании адаптивного макета необходимо указывать ширину и высоту?
Две причины:
- AMP использует ширину и высоту для расчета соотношения сторон и поддержания правильной высоты при изменении ширины в соответствии с родительским контейнером.
- AMP применяет статические размеры ко всем элементам, чтобы обеспечить удобство использования (отсутствие переключений на странице), а также определить размер и положение каждого элемента для компоновки страницы до загрузки ресурсов.
Давайте теперь посмотрим на страницу:
Добавить автовоспроизводящееся видео
AMP поддерживает множество видеоплееров, таких как YouTube и Vimeo. У AMP есть собственная версия элемента HTML5 video
в расширенном компоненте amp-video
. Некоторые из этих видеоплееров, включая amp-video
и amp-youtube
также поддерживают автовоспроизведение без звука на мобильных устройствах.
Подобно amp-img
, amp-video
может стать адаптивным, если добавить layout="responsive"
Давайте добавим на нашу страницу автоматически воспроизводимое видео.
Добавьте еще один абзац и следующий элемент amp-video
в main:
<p class="my2 px3">Vivamus viverra augue libero, vitae dapibus lectus accumsan eget. Pellentesque eget ipsum purus. Maecenas leo odio, ornare nec ex id, suscipit porta ipsum. Ut fringilla semper cursus.</p>
<amp-video
layout="responsive" width="1280" height="720"
autoplay controls loop
src="https://storage.googleapis.com/ampconf-76504.appspot.com/Bullfinch%20-%202797.mp4">
</amp-video>
Давайте посмотрим:
Добавить вставку
AMP предоставляет расширенные компоненты для многих сторонних встраиваемых приложений, таких как Twitter и Instagram . Для встраиваемых приложений, не имеющих компонента AMP, всегда есть amp-iframe .
Давайте добавим вставку Instagram на нашу страницу.
В отличие от amp-img
и amp-video
, amp-instagram
не является встроенным компонентом. Для его использования необходимо явно добавить тег импорта скрипта в head
AMP-страницы.
Используемый нами шаблон AMP Start включает несколько тегов скрипта импорта. Найдите их в начале тега head
и убедитесь, что включена следующая строка скрипта импорта:
<script custom-element="amp-instagram" src="https://cdn.ampproject.org/v0/amp-instagram-0.1.js" async></script>
Добавьте еще один абзац и следующий элемент amp-instagram
в main:
<p class="my2 px3">Vivamus viverra augue libero, vitae dapibus lectus accumsan eget. Pellentesque eget ipsum purus. Maecenas leo odio, ornare nec ex id, suscipit porta ipsum. Ut fringilla semper cursus.</p>
<amp-instagram
layout="responsive" width="566" height="708"
data-shortcode="BJ_sPxzAGyg">
</amp-instagram>
Давайте посмотрим:
Пожалуй, на этом пока достаточно контента.
Краткое содержание
- Вы узнали об адаптивных компонентах в AMP.
- Вы добавили различные типы медиа и текстового контента.
Полный код этого раздела можно найти здесь: http://codepen.io/aghassemi/pen/OpXGoa
Пока что мы создали только статический контент для нашей страницы. В этом разделе мы создадим интерактивную фотогалерею, используя такие компоненты, как карусель, лайтбокс и AMP-действия.
Хотя AMP не поддерживает пользовательский JavaScript, он по-прежнему предоставляет несколько стандартных блоков для получения и обработки действий пользователя.
Добавить фото-карусель
Если все изображения на нашей AMP-странице, ориентированной на фотографии, будут видны на ней, это не обеспечит хорошего пользовательского опыта. К счастью, мы можем использовать amp-carousel для создания горизонтально пролистываемых слайдов с фотографиями.
Во-первых, давайте убедимся, что тег скрипта для amp-carousel
включен в head
:
<script custom-element="amp-carousel" src="https://cdn.ampproject.org/v0/amp-carousel-0.1.js" async></script>
Теперь добавим на главную страницу amp-carousel
slides
с несколькими изображениями main:
<p class="my2 px3">Vivamus viverra augue libero, vitae dapibus lectus accumsan eget. Pellentesque eget ipsum purus. Maecenas leo odio, ornare nec ex id, suscipit porta ipsum. Ut fringilla semper cursus.</p>
<amp-carousel
layout="responsive" width="1080" height="720"
type="slides">
<amp-img src="https://unsplash.it/1080/720?image=1037" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1038" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1039" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1040" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1041" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1042" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1043" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1044" layout="fill"></amp-img>
</amp-carousel>
type="slides"
гарантирует, что одновременно будет видно только одно изображение, и позволяет пользователям пролистывать их.
Для изображений внутри карусели мы используем layout="fill"
, поскольку карусель слайдов всегда заполняет свой размер дочерним элементом, поэтому нет необходимости указывать другой макет, требующий ширины и высоты.
Давайте попробуем и посмотрим, как это выглядит:
Добавить карусель миниатюр
Теперь добавим горизонтально прокручиваемый контейнер для миниатюр этих изображений. Снова используем <amp-carousel>
, но без type="slides"
и с фиксированной высотой макета.
Добавьте следующее после предыдущего элемента amp-carousel
.
<amp-carousel layout="fixed-height" height="78" class="mt1">
<amp-img src="https://unsplash.it/108/72?image=1037" layout="fixed" width="108" height="72"></amp-img>
<amp-img src="https://unsplash.it/108/72?image=1038" layout="fixed" width="108" height="72"></amp-img>
<amp-img src="https://unsplash.it/108/72?image=1039" layout="fixed" width="108" height="72"></amp-img>
<amp-img src="https://unsplash.it/108/72?image=1040" layout="fixed" width="108" height="72"></amp-img>
<amp-img src="https://unsplash.it/108/72?image=1041" layout="fixed" width="108" height="72"></amp-img>
<amp-img src="https://unsplash.it/108/72?image=1042" layout="fixed" width="108" height="72"></amp-img>
<amp-img src="https://unsplash.it/108/72?image=1043" layout="fixed" width="108" height="72"></amp-img>
<amp-img src="https://unsplash.it/108/72?image=1044" layout="fixed" width="108" height="72"></amp-img>
</amp-carousel>
Обратите внимание, что для миниатюрных изображений мы просто использовали layout="fixed"
и версии тех же фотографий в низком разрешении.
Давайте посмотрим:
Изменить изображение, когда пользователь нажимает на миниатюру
Для этого нам нужно связать события, такие как tap
с действиями , такими как смена слайда.
Событие: мы можем использовать атрибут on
для установки обработчиков событий на элементе, а событие tap
поддерживается на всех элементах.
действие: amp-carousel
предоставляет действие goToSlide(index=INTEGER)
, которое мы можем вызвать из обработчика событий нажатия каждого миниатюрного изображения.
Теперь, когда мы знаем о событии и действии, давайте свяжем их вместе.
Сначала нам нужно присвоить карусели слайдов id
, чтобы мы могли ссылаться на нее из обработчика событий нажатия на миниатюры.
Измените существующий код, чтобы добавить атрибут id
к карусели слайдов (первый):
<amp-carousel
id="imageSlides"
type="slides"
....
Теперь давайте установим обработчик событий ( on="tap:imageSlides.goToSlide(index=<slideNumber>)")
на каждое миниатюрное изображение:
<amp-img on="tap:imageSlides.goToSlide(index=0)" role="button" tabindex="1" layout="fixed" ...
<amp-img on="tap:imageSlides.goToSlide(index=1)" role="button" tabindex="1" layout="fixed" ...
<amp-img on="tap:imageSlides.goToSlide(index=2)" role="button" tabindex="1" layout="fixed" ...
...
Обратите внимание, что мы также должны присвоить ему tabindex
и установить role
ARIA для доступности.
Вот и всё. Теперь при нажатии на каждую миниатюру отображается соответствующее изображение в карусели слайдов.
Подсвечивать миниатюру , когда пользователь нажимает на нее
Можно ли это сделать? Похоже, нет никаких действий для изменения CSS-классов элемента, вызываемых обработчиками событий нажатия. Как же нам выделить выбранную миниатюру?
<amp-selector>
спешит на помощь!
amp-selector отличается от компонентов, которые мы использовали до сих пор. Он не является компонентом представления, поскольку не влияет на макет страницы; это, скорее, строительный блок, позволяющий AMP-странице определить, какой вариант выбрал пользователь.
Функция amp-selector
довольно проста, но эффективна:
-
amp-selector
может содержать любые произвольные элементы HTML или компоненты AMP. - Любой элемент-потомок
amp-selector
может стать опцией, если у него есть атрибутoption=<value>
. - Когда пользователь нажимает на элемент, который является опцией,
amp-selector
просто добавляетselected
атрибут к этому элементу (и удаляет его из других элементов опций в режиме одиночного выбора). - Вы можете стилизовать выбранный элемент в своем пользовательском CSS, указав
selected
атрибут с помощью селектора атрибутов CSS.
Давайте посмотрим, как это поможет нам выполнить поставленную задачу.
Добавьте тег скрипта для amp-selector
в head
:
<script custom-element="amp-selector" src="https://cdn.ampproject.org/v0/amp-selector-0.1.js" async></script>
- Оберните карусель миниатюр в
amp-selector
- Сделайте каждую миниатюру опцией, добавив атрибут
option=<value>
. - Сделайте первую миниатюру выбранной по умолчанию, добавив атрибут
selected
.
<amp-selector>
<amp-carousel layout="fixed-height" height="78" class="mt1">
<amp-img option=0 selected on="tap:imageSlides.goToSlide(index=0)" ...
<amp-img option=1 on="tap:imageSlides.goToSlide(index=1)" ...
...
</amp-carousel>
</amp-selector>
Теперь нам нужно добавить стили, чтобы выделить выбранную миниатюру.
Добавьте следующий пользовательский CSS-код в <style amp-custom>
после минимизированного шаблона CSS из AMP Start:
<style amp-custom>
...
/* low opacity for non-selected thumbnails */
amp-selector amp-img[option] {
opacity: 0.4;
}
/* normal opacity for the selected thumbnail */
amp-selector amp-img[option][selected] {
opacity: 1;
}
</style>
Давайте посмотрим:
Выглядит хорошо, но вы заметили ошибку?
Если пользователь пролистывает карусель слайдов, выбранная миниатюра не обновляется. Как связать текущий слайд в карусели с выбранной миниатюрой?
В следующем разделе мы узнаем, как это сделать.
Краткое содержание
- Вы узнали о различных типах каруселей и о том, как их использовать.
- Вы использовали действия и события AMP для изменения видимого слайда в карусели изображений, когда пользователь нажимает на миниатюрное изображение.
- Вы узнали об
amp-selector
и о том, как его можно использовать в качестве строительного блока для реализации интересных вариантов использования.
Полный код этого раздела можно найти здесь: http://codepen.io/aghassemi/pen/gmMJMy
В этом разделе мы будем использовать amp-bind для улучшения интерактивности галереи изображений из предыдущего раздела.
Что такое amp-bind
?
Основной компонент AMP amp-bind
позволяет создавать пользовательские интерактивные возможности с помощью привязки данных и выражений.
amp-bind
состоит из трех ключевых частей:
- Состояние
- Связывание
- Мутация
Состояние — это переменная состояния приложения, содержащая как одно значение, так и сложную структуру данных. Все компоненты могут читать и записывать данные в эту общую переменную.
Привязка — это выражение, которое связывает состояние с атрибутом HTML или содержимым элемента.
Мутация — это действие по изменению значения состояния в результате какого-либо действия или события пользователя.
Эффективность amp-bind
проявляется, когда происходит мутация: все компоненты, имеющие привязку к этому состоянию, будут уведомлены и автоматически обновятся, чтобы отразить новое состояние.
Давайте посмотрим на это в действии!
Используйте amp-bind
для повторной реализации галереи изображений.
Ранее мы использовали действия AMP (например, goToSlide()
), чтобы связать карусель слайдов с полным изображением с событием tap
на миниатюры изображений, а также использовали amp-selector
для выделения выбранной миниатюры.
Давайте посмотрим, как можно полностью переписать этот код, используя подход amp-bind
к привязке данных.
Но прежде чем начать кодировать, давайте разработаем наш подход:
1. Каково наше состояние?
В нашем случае всё довольно просто: нас интересует только номер текущего слайда. Поэтому selectedSlide
— это наше состояние.
2. Какие у нас привязки?
Что нужно изменить при изменении selectedSlide
?
- Видимый
slide
карусели с полным изображением:
<amp-carousel [slide]="selectedSlide" ...
selected
элемент вamp-selector
также необходимо изменить. Это исправит ошибку, с которой мы столкнулись в предыдущем разделе.
<amp-selector [selected]="selectedSlide" ...
3. Каковы наши мутации?
Когда необходимо изменить selectedSlide
?
- Когда пользователь переходит на новый слайд в карусели изображений, проводя пальцем:
<amp-carousel on="slideChange:AMP.setState({selectedSlide:event.index})" ...
- Когда пользователь выбирает миниатюру:
<amp-selector on="select:AMP.setState({selectedSlide:event.targetOption})" ...
Давайте используем AMP.setState
для запуска мутации, что означает, что нам больше не нужен весь код on="tap:imageSlides.goToSlide(index=n)"
который был в миниатюре!
Давайте соберем все вместе:
Добавьте тег скрипта для amp-bind
в head
:
<script custom-element="amp-bind" src="https://cdn.ampproject.org/v0/amp-bind-0.1.js" async></script>
Замените существующий код галереи новым подходом:
<amp-carousel [slide]="selectedSlide" on="slideChange:AMP.setState({selectedSlide:event.index})" type="slides" id="imageSlides" layout="responsive" width="1080" height="720">
<amp-img src="https://unsplash.it/1080/720?image=1037" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1038" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1039" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1040" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1041" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1042" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1043" layout="fill"></amp-img>
<amp-img src="https://unsplash.it/1080/720?image=1044" layout="fill"></amp-img>
</amp-carousel>
<amp-selector [selected]="selectedSlide" on="select:AMP.setState({selectedSlide:event.targetOption})">
<amp-carousel layout="fixed-height" height="78" class="mt1">
<amp-img option=0 selected src="https://unsplash.it/108/72?image=1037" layout="fixed" width="108" height="72"></amp-img>
<amp-img option=1 src="https://unsplash.it/108/72?image=1038" layout="fixed" width="108" height="72"></amp-img>
<amp-img option=2 src="https://unsplash.it/108/72?image=1039" layout="fixed" width="108" height="72"></amp-img>
<amp-img option=3 src="https://unsplash.it/108/72?image=1040" layout="fixed" width="108" height="72"></amp-img>
<amp-img option=4 src="https://unsplash.it/108/72?image=1041" layout="fixed" width="108" height="72"></amp-img>
<amp-img option=5 src="https://unsplash.it/108/72?image=1042" layout="fixed" width="108" height="72"></amp-img>
<amp-img option=6 src="https://unsplash.it/108/72?image=1043" layout="fixed" width="108" height="72"></amp-img>
<amp-img option=7 src="https://unsplash.it/108/72?image=1044" layout="fixed" width="108" height="72"></amp-img>
</amp-carousel>
</amp-selector>
Давайте проверим. Коснитесь миниатюры, и слайды с изображениями будут меняться. Проведите пальцем по слайдам, и выделенная миниатюра изменится.
Добавить текст в галерею
Мы уже проделали сложную работу по определению и изменению состояния текущего слайда. Теперь мы можем легко добавить дополнительные привязки для обновления других данных в зависимости от текущего номера слайда.
Давайте добавим текст «Изображение x/y» в нашу галерею:
Добавьте следующий код над элементом карусели слайдов:
<div class="px3">Image <span [text]="1*selectedSlide + 1">1</span> of 8</div>
На этот раз мы привязываемся к внутреннему тексту элемента, используя [text]=
вместо привязки к атрибуту HTML.
Давайте попробуем:
Краткое содержание
- Вы узнали об
amp-bind
. - Вы использовали
amp-bind
для реализации улучшенной версии галереи изображений.
Полный код этого раздела можно найти здесь: http://codepen.io/aghassemi/pen/MpeMdL
В этом разделе мы будем использовать две новые функции для добавления анимации на нашу страницу.
Добавьте эффект параллакса к заголовку
amp-fx-collection — это расширение, предоставляющее коллекцию предустановленных визуальных эффектов, таких как параллакс, которые можно легко включить для любого элемента с атрибутами.
Благодаря эффекту параллакса, когда пользователь прокручивает страницу, элемент прокручивается быстрее или медленнее в зависимости от значения, присвоенного атрибуту.
Эффект параллакса можно включить, добавив атрибут amp-fx="parallax" data-parallax-factor="<a decimal factor>"
к любому элементу HTML или AMP.
- Значение коэффициента больше 1 заставляет элемент прокручиваться быстрее, когда пользователь прокручивает страницу вниз.
- Значение коэффициента меньше 1 замедляет прокрутку элемента, когда пользователь прокручивает страницу вниз.
Давайте добавим параллакс с коэффициентом 1,5 к заголовку нашей страницы и посмотрим, как это будет выглядеть!
Добавьте тег скрипта для amp-fx-collection
в head
:
<script custom-element="amp-fx-collection" src="https://cdn.ampproject.org/v0/amp-fx-collection-0.1.js" async></script>
Теперь найдите существующий элемент заголовка title в коде и добавьте к нему атрибуты amp-fx="parallax" and data-parallax-factor="1.5"
:
<header amp-fx="parallax" data-parallax-factor="1.5" class="p3">
<h1 class="ampstart-fullpage-hero-heading mb3">
<span class="ampstart-fullpage-hero-heading-text">
Most Beautiful Hikes in the Pacific Northwest
</span>
</h1>
<span class="ampstart-image-credit h4">
By <a href="#" role="author" class="text-decoration-none">D.F. Roy</a>,<br> January 14, 2017
</span>
</header>
Давайте посмотрим на результат:
Заголовок теперь прокручивается быстрее остальной страницы. Круто!
Добавить анимацию на страницу
amp-animation — это функция, которая привносит API веб-анимации на страницы AMP.
В этом разделе мы воспользуемся amp-animation для создания эффекта легкого увеличения изображения на обложке.
Добавьте тег script для amp-animation в head
:
<script custom-element="amp-animation" src="https://cdn.ampproject.org/v0/amp-animation-0.1.js" async></script>
Теперь нам нужно определить нашу анимацию и целевой элемент, к которому она применяется.
Анимации определяются как JSON внутри тега amp-animation
верхнего уровня.
Вставьте следующий код непосредственно под открывающим тегом body
на вашей странице.
<amp-animation trigger="visibility" layout="nodisplay">
<script type="application/json">
{
"target": "heroimage",
"duration": 30000,
"delay": 0,
"fill": "forwards",
"easing": "ease-out",
"keyframes": {"transform": "scale(1.3)"}
}
</script>
</amp-animation>
Этот код определяет анимацию, которая выполняется в течение 30 секунд без задержки и масштабирует изображение на 30%.
Мы определяем прямую fill
, чтобы изображение оставалось увеличенным после завершения анимации. target
— это HTML- id
элемента, к которому применяется анимация.
Давайте добавим id
к элементу изображения героя на нашей странице, чтобы amp-animation
мог воздействовать на него.
- Найдите существующее главное изображение (с высоким разрешением и
layout="fixed-height"
) в своем коде и добавьтеid="heroimage"
к тегуamp-img
. - Для простоты также удалите
media="(min-width: 416px)"
и удалите другойamp-img
с низким разрешением, чтобы нам пока не пришлось иметь дело с несколькими анимациями и медиазапросами в amp-animation.
<figure class="ampstart-image-fullpage-hero m0 relative mb4">
<amp-img id="heroimage" height="1800" layout="fixed-height" src="https://unsplash.it/1200/1800?image=1003"></amp-img>
<figcaption class="absolute top-0 right-0 bottom-0 left-0">
...
Как вы могли заметить, масштабирование изображения приведет к его переполнению родительским элементом, поэтому нам нужно исправить это, скрыв переполнение.
Добавьте следующее правило CSS в конец существующего <style amp-custom>
:
.ampstart-image-fullpage-hero {
overflow: hidden;
}
Давайте попробуем и посмотрим, как это выглядит:
Тонкий!
Но я бы и так мог это сделать с помощью CSS. В чём смысл amp-animation
?
В данном случае это верно, но amp-animation
предоставляет дополнительные функции, которые невозможно реализовать с помощью одного лишь CSS. Например, анимация может запускаться в зависимости от видимости (и приостанавливаться в зависимости от видимости) или запускаться действием AMP. amp-animation
также основан на API веб-анимации , который сам по себе обладает большим функционалом, чем CSS-анимация, особенно в плане компоновки.
Краткое содержание
- Вы узнали о создании эффектов параллакса с помощью
amp-fx-collection
. - Вы узнали об
amp-animation
.
Полный код этого раздела можно найти здесь: http://codepen.io/aghassemi/pen/OpXKzo
Вы только что закончили создание красивой интерактивной AMP-страницы.
Давайте отпразднуем это, еще раз взглянув на то, чего вы достигли сегодня.
Вот ссылка на готовую страницу: http://s.codepen.io/aghassemi/debug/OpXKzo
... и финальный код: http://codepen.io/aghassemi/pen/OpXKzo
Коллекцию записей CodePen для этой лабораторной работы можно найти здесь: https://codepen.io/collection/XzKmNB/
О, прежде чем мы уйдем...
Мы забыли проверить, как наша страница выглядит на других форм-факторах, например, на планшете в альбомной ориентации.
Давайте посмотрим:
Отличный!
Желаю вам прекрасного дня.
Что дальше?
Эта практическая работа лишь поверхностно демонстрирует возможности AMP. Существует множество ресурсов и практических работ, которые помогут вам создавать потрясающие AMP-страницы:
- https://amp.dev
- https://ampstart.com/components
- Практикум по основам AMP
- AMP продвинутые концепции codelab
Если у вас возникли вопросы или проблемы, найдите нас на канале AMP в Slack или создайте обсуждения, отчеты об ошибках или запросы функций на GitHub .