1. Напишите это впереди 🚀
Дорогие друзья, давно не виделись. Недавно я использовал свое свободное время, чтобы открыть исходный код проекта электронной коммерции Vue, который представляет собой высокую имитацию известной платформы для покупок продуктов O2O. Весь проект по-прежнему весьма полезен. Вы можете отсканируйте QR-код ниже, чтобы испытать его.Эта статья представляет собой проектГлава о демонтаже основных знаний, в основном, представляет собой процесс реализации демонтажа и добавления продуктов в корзину.
нажмите на меня, чтобы испытать
🎉🎉 Адрес проекта с открытым исходным кодом Спасибо за звезду + подборку
Во-первых, позвольте мне кратко представить стек технологий, используемых в этом проекте:
Весь проект принимаетvue-cli3строительные леса,Ведро семейства Vue (vue, vuex, vue-router),Платформа пользовательского интерфейса ВантИ множество известных и полезных сторонних библиотек, таких как:axios,fastclick,better-scroll,twix.js,pubsub.js,moment.js,vue-amapи Т. Д. Выбор единицы измерения пикселяrem, интерфейс фоновых данных проходит черезEasy-MockПостроение, наиболее близкое к корпоративной разработке, модуляризация, высокая связность и низкая связанность в наибольшей степени, значительно улучшающие ремонтопригодность и масштабируемость каждого модуля, я считаю, что после прочтения исходного кода и серии статей по разборке, которые я написал, Какой ранг осадного льва вы будете вдохновлены!Открыть исходный код нелегко, ваши лайки - самая большая поддержка для меня 🎉🎉Спасибо~Спасибо♪(・ω・)ノ
2. Процесс добавления летящих товаров в корзину
Прежде всего, давайте посмотрим, как это будет выглядеть, не правда ли, круто?✈️✈️ Не стесняйтесь ставить лайки и поддерживать автора💓
Реализовать идеи
Прежде всего, давайте сосредоточимся на добавлении в корзину. Когда мы щелкаем значок корзины, в центре изображения продукта, по которому в данный момент щелкнули, сначала появляется круглая миниатюра продукта, а затем продукт уменьшается. Миниатюра постепенно становится меньше в виде кривой вдоль текущей позиции и летит в корзину.Когда товар летит в корзину, иконка с номером корзины будет увеличиваться, а корзина будет иметь пружинную анимацию.
С помощью приведенного выше народного анализа все этапы реализации можно кратко разделить на три этапа для завершения кодирования:
- Первый этап: нажмите на корзину, появится небольшой шарик с миниатюрами товаров.
- Второй этап: шарик миниатюры товара летит из текущей позиции в нижнюю позицию корзины в виде кривой
- Третий этап: когда шарик миниатюры продукта полностью исчезает в позиции корзины, значок количества корзины увеличивается на 1, и реализуется анимация пружины.
реализация кода первого этапа
Первый этап кодирования: нарисуйте круглый шар в средней части изделия.
Это очень просто, просто добавьте один в область изображения продукта.div
,настраиватьposition:fixed
и ширина и высота и т.д., а что?
Давайте сначала закопаем вопрос, как сделать так, чтобы шарик появлялся в диапазоне нажатия на текущий товар?
Этап 1 наступая на яму
Сначала я прошелся по списку продуктов, вычислив атрибут, добавив шарики миниатюр продукта ко всем представлениям продукта, а затем добавив логический атрибут к каждому списку продуктов.show
, щелкнув значок корзины, чтобы управлять отображением и скрытием только что созданного шарика, а затем я зашел в тупик, долго жалел, и данные вычисляемого атрибута прошлиset
После смены метода Дом стал непослушным, то есть не играл в карты по рутине (потому что в вычисляемом атрибуте есть кеш данных), поэтому от этого корявого метода пришлось отказаться.
Окончательный план реализации этапа 1
Причина наступить на яму выше - из-за жадности, хотите быть на месте в одно время, загрузить миниатюры всех продуктов заранее, а затем управлять отображением и скрытием миниатюр текущих продуктов, нажав на кнопку тележка для покупок, тогда мы должны изменить наш образ мышления и создать только миниатюрный мяч, черезboolean
Для управления его отображением и скрытием, позиция меняется динамически, и какой товар нажимается, он будет отображаться в пределах диапазона какого товара, и каждый раз, когда на него нажимают, ему устанавливается атрибут true и выбрасывается в массив. , давайте сначала поместим его в данные.Атрибуты, которые определяют, отображается ли мяч, и массив отображаемых мячей
data () {
return {
showMoveDot: [], //控制下落的小圆点显示隐藏
}
Затем мы даем, когда мы нажимаем на корзинуshowMoveDot
Массив динамически добавляет свойства, затем проходит через массив в Dom, привязывается в обоих направлениях и, наконец, проходитv-if
Управлять отображением и прятаться, разве это не прекрасно~~
Нажмите на корзину, чтобы датьshowMoveDot
Увеличиватьtrue
свойства
methods: {
addToCart (product, num) {
this.showMoveDot = [...this.showMoveDot, true];
}
}
Путешествие по ДомуshowMoveDot
, и черезv-if
для управления отображением эскизов продуктов
<div
v-for="(item,index) in showMoveDot"
:key="index">
<div class="move_dot"
ref="ball"
v-if="item">
</div>
</div>
На этом этапе при нажатии на значок корзины покупок в текущем продукте отображается небольшой шарик с миниатюрами. На этом этап завершен ✿✿ヽ(°▽°)ノ✿ ~
Реализация кода второго этапа
На этом этапе требуются знания в области анимации, поэтому первое, что приходит на ум, — это Vue.transitionатрибут, сначала оберните слой шарика миниатюрыtransition
и увеличитьappear
анимировать и реализоватьbeforeEnter
,afterEnter
Метод события, поэтому измените код Dom в это время.
<transition appear
@before-appear="beforeEnter"
@after-appear='afterEnter'
v-for="(item,index) in showMoveDot"
:key="index.id">
<div class="move_dot"
ref="ball"
v-if="item">
</div>
</transition>
Два метода приведенного выше кода DombeforeEnter
иafterEnter
Методы используются до первого рендеринга анимации и после рендеринга анимации, тогда мы должны сосредоточить внимание на этих двух состояниях.
В первом рендеринге мы определяем положение шара, далее будем использовать метод в это времяgetBoundingClientRect, этот метод возвращает набор прямоугольников, вот и все, вы можете использовать этот метод для определения положения элемента на экране 😊~
Это хорошо, тогда мы будем горячим железом в это время.С помощью этого метода мы сначала определяем расстояние между маленькой иконкой корзины и слева и сверху относительно экрана при нажатии на иконку корзины.
определить дваdata
чтобы принять значение, полученное при нажатии на значок добавления в корзину.
data () {
return {
showMoveDot: [], //控制下落的小圆点显示隐藏
elLeft: 0, //当前点击购物车按钮在网页中的绝对top值
elTop: 0, //当前点击购物车按钮在网页中的绝对left值
}
Затем мы получаем местоположение методом нажатия «Добавить в корзину».
methods: {
addToCart () {
this.showMoveDot = [...this.showMoveDot, true];
this.elLeft = event.target.getBoundingClientRect().left;
this.elTop = event.target.getBoundingClientRect().top;
}
}
В этот момент у меня появилась возможность нажать на иконку, чтобы добавить в корзину✌️На данный момент мы на полпути к успеху~
После получения расстояния для увеличения значка корзины относительное положение используется для определения положения шарика миниатюры продукта, поэтому перед рендерингом анимации мы устанавливаем егоtransform
Значение, значение x, y можно отрегулировать само по себе, и пусть его прозрачность будет 0, временно не отображается.
beforeEnter (el) {
// 设置transform值
el.style.transform = `translate3d(${this.elLeft - 30}px,${this.elTop - 100}px , 0)`;
// 设置透明度
el.style.opacity = 0;
},
Далее ключ, как заставить мяч двигаться из текущей позиции внизTabbar
в корзине? Таким же образом проходимgetBoundingClientRect
метод определения логотипа корзины нижней вкладкиleft
иtop
value, после получения этого значения позвольте шарику двигаться в направлениях x и y тележки для покупок по кривой Безье в текущем положении.showMoveDot
свойство установлено наfalse
И прозрачность 1.
В методе после того, как мяч нарисован:
afterEnter (el) {
// 获取底部购物车徽标
const badgePosition = document
.getElementById("buycar")
.getBoundingClientRect();
// 设置小球移动的位移
el.style.transform = `translate3d(${badgePosition.left + 30}px,${badgePosition.top - 30}px,0)`
// 增加贝塞尔曲线
el.style.transition = 'transform .88s cubic-bezier(0.3, -0.25, 0.7, -0.15)';
el.style.transition = 'transform .88s linear';
this.showMoveDot = this.showMoveDot.map(item => false);
// 设置透明度
el.style.opacity = 1;
}
На этом все готово! Нажмите кнопку «Добавить корзину», мяч может изогнуться и полететь в корзину, давайте покрасуемся с помощью Gif ✿✿ヽ(°▽°)ノ✿
Копаем друзья, пожалуйста, оставайтесь (╥╯^╰╥) Как вы думаете, это сделано? Для гика🐵 этот эффект просто слишком низок, поэтому давайте продолжим делать оптимизацию вместе~
Этап 3 Оптимизация опыта
Оптимизация 1. Превратите шарик в изображение щелчка по текущему продукту.
В начале я был реально в тупике.Столько картинок,кто знает какую отобразить?Позднее у меня возникла мысль,а не просто ли это динамически подгружаемая картинка,когда я нажимаю добавить в корзину, текущий товарный объект уже получен, вы боитесь Что, только бери сразу и все!
- 1. Добавить один к данным
dropImage
Атрибуты.
data () {
return {
showMoveDot: [], //控制下落的小圆点显示隐藏
elLeft: 0, //当前点击购物车按钮在网页中的绝对top值
elTop: 0, //当前点击购物车按钮在网页中的绝对left值
dropImage: '' // 小球图片
}
- 2. Получено динамической привязкой в Доме
dropImage
<transition appear
@after-appear='afterEnter'
@before-appear="beforeEnter"
v-for="(item,index) in showMoveDot"
:key="index.id">
<div class="move_dot"
ref="ball"
v-if="item">
<!-- 小球图片 -->
<img :src="dropImage"
alt="">
</div>
</transition>
- 3. Динамическая отдача
dropImage
назначать
addToCart (product) {
// 取出商品的图片
this.dropImage = product.small_image;
// 将商品添加到购物车中
this.ADD_TO_CART(product);
// 购物车左边的
this.elLeft = event.target.getBoundingClientRect().left;
this.elTop = event.target.getBoundingClientRect().top;
this.showMoveDot = [...this.showMoveDot, true];
},
Хорошо! На этом мы завершили динамическую загрузку изображения маленького шарика, давайте сделаем Gif-изображение, чтобы похвастаться ✿✿ヽ(°▽°)ノ✿
Но есть проблема, которую я обнаружил, картинка пролетает очень резко, прямо-прямо, недостаточно дружелюбно, так что продолжим оптимизацию~~
Оптимизация 2: миниатюры товаров, которые летят в корзину, постепенно становятся меньше
Ха-ха~ Пусть товары постепенно становятся меньше, когда они прилетают, подумай об этом или используйcss3
изkeyframes
Лучше сделать это, не нести чушь и перейти сразу к коду.
- 1. Настройки
keyframes
значение
@keyframes mymove {
0% {
transform: scale(1);
}
25% {
transform: scale(0.8);
}
50% {
transform: scale(0.6);
}
75% {
transform: scale(0.4);
}
100% {
transform: scale(0.2);
}
}
- 2. Добавьте миниатюры продуктов
animation
и присоединитьсяkeyframes
img {
animation: 0.88s mymove ease-in-out;
width: 3rem;
height: 3rem;
border-radius: 50%;
}
Хорошо, готово! Давайте сделаем Gif, чтобы похвастаться ✿✿ヽ(°▽°)ノ✿
Почему мне до сих пор кажется, что это немного неловко, никак, Дева, его надо сделать более совершенным🙈
Оптимизация 3: Эффект пружины после добавления товаров в корзину
Продукт сжимается, а шарик постепенно становится меньше и падает в корзину.В это время тележка имеет эффект пружины, что более красиво.Это все еще старый метод.css3
изkeyframes
Это как нельзя более уместно~
Поскольку Tabbar используетсяVant
Компоненты пользовательского интерфейса, отдельноDashboard.vue
файл, так что вDashboard.vue
Установить иконку для корзины в файлеkeyframes
ценность.
@keyframes carmove {
0% {
transform: scale(1);
}
25% {
transform: scale(0.8);
}
50% {
transform: scale(1.1);
}
75% {
transform: scale(0.9);
}
100% {
transform: scale(1);
}
}
и поставь этоkeyframes
установить значение на значок корзины
.moveToCart {
animation: mymove 0.5s ease-in-out;
}
Добавлена анимация корзины, но как управлять шариком, чтобы он перемещался в корзину, чтобы анимация работала? Итак, во-первых, я нашел способ закончить анимацию шарика, и нашел его. путем проверки информации.transitionend
иwebkitAnimationEnd
Есть два метода, поэтому я отслеживал их, и когда шарик исчез, я динамически увеличивал корзину внизу Tabbar в этих двух методах.keyframes
ценность.
afterEnter (el) {
// 监听小球动画结束方法
el.addEventListener('transitionend', () => {
el.style.display = 'none';
this.listenInCart();
})
// 监听小球动画结束方法
el.addEventListener('webkitAnimationEnd', () => {
el.style.display = 'none';
this.listenInCart();
})
},
this.listenInCart()
Метод заключается в управлении анимацией значка корзины на нижней вкладке Tabbar, мы определили классmoveToCart
, я использую хитрый метод, когда анимация заканчивается, добавляю класс в корзину ТаббараmoveToCart
, а затем позвольте ему удалить этот класс через 500 мс, что гарантирует, что каждый раз при добавлении корзины будет выполняться нижняя вкладка.keyframs
анимация.
listenInCart () {
// 拿到底部Tabbar购物车的DOM元素添加class
document.getElementById("buycar").classList.add('moveToCart');
setTimeout(() => {
// 500毫秒后移除底部Tabbar购物车的DOM元素class
document.getElementById("buycar").classList.remove('moveToCart');
}, 500);
}
На данный момент это действительно сделано 🌸, давайте покрасуемся Gif ✿✿ヽ(°▽°)ノ✿
Я тут все это видел, не нравится и поддержу😄, поощрите автора~
В-третьих, точка приближается🚀🚀
Я знаю, что друзьям-копателям не терпится увидеть исходный код~ Конечно, эта точка знаний — лишь вершина айсберга всего проекта, есть много новых технологий, которые просты в использовании и забавны, такие какBetter-scroll
В этом проекте есть почти все основные технологии, такие как скользящее использование, интеграция карт Gaode, водопад изображений, адаптация мобильного терминала и т. д. ~ ставьте подключение к GitHub, и друзья, не скупитесь на звездочки в свои руки ✿✿ヽ(° ▽°)ノ✿
В-четвертых, подружитесь 👭
Я надеюсь, что мой обмен может помочь вам, распространять знания, делиться счастьем и добиваться прогресса вместе с вами ~
Отсканируйте QR-код ниже, чтобы подписаться на мою личную общедоступную учетную запись WeChat.передний конец пончик, Вы также можете отсканировать мой приват WeChat, чтобы вытащить вас в группу.В группе есть старшие фронтенд-большие шишки, которые время от времени будут делиться интересными и полезными новыми знаниями в области фронтенда, ожидая, пока вы поиграете ~~