Привет, меня зовут Стивен.
Продолжая нашу серию статей на официальном сайте Apple, в этом сеансе будет представлен эффект скольжения построчно по мере прокрутки страницы на странице iPhone 12 Pro:
Видеоверсия этого урока находится по адресувооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооДобро пожаловать три подряд внимание!
Здесь также специально указано, что все графические материалы, используемые в этом обучении, получены с веб-сайта Apple, и авторские права на изображения принадлежат Apple.Они используются только в учебных демонстрационных целях.Пожалуйста, не используйте эти изображения в реальной сети. страницы. .
часть HTML
Откройте редактор CodePen и добавьте заголовок в раздел HTML. Поскольку у него есть подзаголовок, я бы использовал<p>
этикетка, чтобы держать его. затем добавьте<div>
,id
по имениiphone
, что добавляет два<div>
,id
соответственноhardware
а такжеui
;hardware
будет использоваться для отображения корпуса и рамок iPhone, аui
Отобразится содержимое экрана.
CSS-часть
Давайте сначала определим немного CSS, чтобы у нас было лучшее представление о том, что мы делаем. Присоединяйся:root
селектор, определите некоторые переменные и стили:
-
--device-width
да770px
-
--device-height
да1336px
-
--ui-width
да640px
- Базовый размер текста
15px
тогда присоединяйтесь#iphone
Селектор, наборposition
даrelative
, значения ширины и высоты получаются из переменных.
воссоединиться#hardware
селектор, установка ширины и высоты100%
, а затем фоновое изображение, загрузите изображение тела iPhone, чтобы поддерживать экран высокой четкости Retina Display, размер этого изображения в два раза больше, поэтому установитеbackground-size
, ширина и высота также равны установленному значению переменной.
Что ж, здесь я хочу представить свойство CSS маски изображения, вы обнаружите, что теперь за круглой рамкой вокруг iPhone есть черный фон:
И я обнаружил, что Apple специально подготовила изображение-маску, которая рисует внешний вид iPhone, заливает его белым цветом, а круглая рамка прозрачна:
мы можем пройтиmask-image
Это свойство применяет к нему изображение маски. Поскольку это свойство CSS все еще является экспериментальным, добавьте-webkit
Версия префикса, как и фоновое изображение, изображение в два раза больше, поэтому вам также нужно установить размер маски, установитьmask-size
установите значение переменной и добавьте-webkit
Префиксная версия.
Теперь вы можете видеть, что маска успешно применена и черный фон iPhone исчез. Что касается того, почему Apple напрямую не устанавливает фон изображений iPhone прозрачным? Я предполагаю, что это для оптимизации размера изображения, потому что прозрачное нижнее изображение должно использовать формат PNG, а емкость такого большого цветного изображения PNG будет намного больше, чем у JPG, поэтому Apple использует высокую степень сжатия. JPG как изображение iPhone, а затем подготовьте одноцветное изображение PNG для маскирования, что действительно может значительно сэкономить пропускную способность сети.
Ок, после введения этого атрибута можно добавитьbody
селектор, установите цвет фона на черный,margin
установить как0
, а затем отцентрируйте содержимое страницы вверх, вниз, влево и вправо:
-
display
установить какflex
-
flex-direction
установить какcolumn
-
justify-content
установить какcenter
-
align-items
установить какcenter
-
min-height
установить как100vh
шрифт установлен наHelvetica
, добавьте ещеpadding
, настроить и опустить, чтобы быть4rem
, слева и справа есть0
.
Затем установите стиль заголовка и добавьтеh2
селектор, цвет текста устанавливается на серый,text-align
установить какcenter
Отцентрируйте его и установите размер текста на4.5rem
, толщина текста600
. потомmargin
установить и опустить6rem
,о0
.
Присоединяйсяh2 p
селектор для стиля субтитров,margin
установить как0
, цвет текста может быть установлен на белый.
Размер кадра установлен, и следующим шагом является установка содержимого экрана iPhone.
существует#ui
Он добавил изображение, верхнюю часть экрана интернет-интерфейса, а затем каждая строка данных - это изображение, я бы использовал<ul>
список, чтобы построить его, добавьте<li>
, содержимое представляет собой изображение, всего 7 строк.
Вернитесь в раздел CSS и добавьте#ui
Селектор,position
установить какabsolute
,top
установить как0
. Затем центрировать его влево и вправо, первое местоleft
установить как50%
, а потомtransform
установить какtranslateX(-50%)
Вот и все.
Присоединяйся#ui .top-ui
Селектор для установки положения верхнего изображения пользовательского интерфейса.display
установить какblock
, ширина берется из переменной, а высотаauto
,Потомmargin
, указанный выше70px
, слева и справа естьauto
, ниже0
. добавить еще немногоpadding-bottom
, установить как30px
и нижняя граница.
перейти в раздел списка, добавить#ui ul
селектор, будетlist-style
установить какnone
, чтобы изменить стиль списка,margin
а такжеpadding
установить как0
.
Затем задайте стиль картинки внутри и добавьте#ui ul li img
селектор, наборdisplay
даblock
, ширина берется из переменной, а высотаauto
,margin
установить и опустить10px
,оauto
.padding-bottom
да10px
, а затем добавьте нижнюю границу.
Теперь, когда интерфейс в основном настроен, давайте займемся частью анимации.
часть анимации
Давайте сначала разберемся в принципе этой анимации.При прокрутке страницы она проскальзывает в список построчно от большего к меньшему.Попробуем сначала реализовать эффект в CSS.
Присоединяйся#ui ul li img:hover
селектор, наборtransform
дляscale(1.8)
,Потомopacity
установить как0
. существует#ui ul li img
добавить в селекторtransition: .25s transform ease-in-out;
, а теперь попробуйте подвести курсор к одной из строк, можно добиться эффекта приближения к уменьшению и возврату к списку.
добавить некоторое смещение, например.translateY()
установить как-60px
, эффект примерно такой:
Однако эта анимация не запускается курсором, она запускается при прокрутке страницы, а ходом анимации можно управлять прокруткой, поэтому я буду использовать JavaScript, чтобы вычислить, насколько прокручивается текущая страница, а затем установить соответствующее количество рядов.transform
а такжеopacity
.
Чтобы упростить настройку стилей CSS с помощью JavaScript, я хочу установить значение параметра на стороне CSS, чтобы контролировать ход выполнения строки анимации.
первыйhover
а такжеtransition
удаляются настройки, а затем внутри HTML, в первомli
присоединиться тамstyle
,настраивать--progress
да0.5
:
--progress
моя собственная переменная CSS, я хочу установить ее как0
когдаscale()
установить как1.8
,так же какopacity
установить как0
; в то время как его заданное значение равно1
когдаscale()
установить как1
,opacity
установить как1
. Сделайте это как анимированный переключатель, тогда мы на стороне JavaScript, просто нужно настроить это--progress
Вы можете управлять анимацией.
существует#ui ul li img
внутри, присоединяйтесьtransform
, первый наборscale()
,Буду1.8
минус0.8 * var(--progress)
, так что в--progress
для1
когда,scale
то есть1
;а также--progress
для0
когда,scale
то есть1.8
.
приходи ещеtranslateY()
,Буду-60px
умножить на1 - var(--progress)
, так что в--progress
для1
час,translateY
то есть0
;а также--progress
для0
когда,translateY
то есть-60px
.
опять такиopacity
установить прямо на--progress
значение ,0
будет скрывать это, когда1
он будет отображаться. попробуй настроить--progress
значение, вы можете увидеть специфический эффект этого значения параметра.
потом<li>
снято с установленного значения на#ui ul
генерал-лейтенант--progress
инициализирован как0
Вот и все.
часть JavaScript
Наконец, все дело в управлении анимацией с помощью JavaScript.
Сначала определитеrows
константы, будет каждый<li>
Верните его, а затем определите файл с именемhtml
постоянная, назначенная какdocument.documentElement
, так как позже будет несколько цитатdocument.documentElement
из.
Присоединяйсяdocument.addEventListener
, мониторscroll
Прокрутка страницы, определение переменной,scrolled
равныйhtml.scrollTop
Поделить наhtml.scrollHeight
минусhtml.clientHeight
.
Это приводит к0
к1
значение между, когда страница прокручивается вверх, это0
, при прокрутке вниз1
.
Далее каждый<li>
, один за другим будут--progress
установить как1
.
добавить одинfor of
петля назад, помещая каждый<li>
Получите это, потому что анимация идет одна за другой, и сколько прокруток страницы можно получить черезscrolled
fetch, поэтому мы хотим рассчитать каждый<li>
существует0
к1
интервал между ними.
определитьtotal
переменная, будет1
Поделить на<li>
, затем вычислите два значения, одно из которыхstart
,Будуtotal
умножить наindex
, другойend
,Будуtotal
умножить наindex
Добавить1
,пройти черезconsole.log()
, поставить каждый<li>
Посмотрите на вывод интервала.
Имея эту информацию, мы можем рассчитать каждый<li>
из--progress
стоимость. определить переменнуюprogress
,Будуscrolled
уменьшатьstart
Поделить наend
уменьшатьstart
; Тогда еслиprogress
больше или равно1
, будуprogress
установить как1
; меньше или равно0
установлен на0
.
Наконец, будетprogress
значение черезsetProperty
установлен в<li>
начальство.
Давайте посмотрим на завершенный эффект этого случая
Это все для этого эпизода.
Исходный код для этого случая находится накод спрей.IO/стивен класс/боюсь...
Ваша поддержка-моя мотивация, пожалуйста, обратите вниманиеМинимальный класс CodingStartup, давайте работать вместе!
- Станция Б:space.bilibili.com/451368848
- YouTube: YouTube.com/кодирование начало…
- Самородки:Талант /user/249773…