برنامه نویسی

رابط کاربری تعاملی E-Com: نوار ارسال رایگان متحرک

در این مقاله، اولین مقاله از سری رابط کاربری تعاملی تجارت الکترونیک ما، هدف ما ایجاد یک نوار پیشرفت متحرک کوچک با استفاده از Framer Motion است. این نوار پیشرفت که برای استفاده در خلاصه سبد خرید در نظر گرفته شده است، به کاربر اطلاع می دهد که چقدر بیشتر باید برای واجد شرایط بودن برای حمل و نقل رایگان هزینه کند و با نمایش انیمیشن Lottie، موفقیت خود را هنگامی که به این هدف رسید جشن می گیرد.

به عنوان صاحب فروشگاه تجارت الکترونیکی که این را اجرا می کند، هدف اصلی نوار ارسال رایگان ما افزایش میانگین ارزش سفارش (AOV) و تشویق کاربران برای ادامه پرداخت است.

توضیحات تصویر

تنظیم صحنه

در چند سال گذشته، انیمیشن ها و ریز تعامل ها به طور فزاینده ای در برنامه های کاربردی وب محبوب شده اند. این روند که در ابتدا در برنامه های موبایل بومی ظهور کرد، به تدریج در حال یافتن جایگاه خود در برنامه های وب طراحی شده برای نمایش مرورگرها است. با وجود افزایش استفاده از تعاملات خرد، اجرای استراتژیک اغلب کوتاهی می کند. توسعه دهندگان اغلب این ویژگی ها را برای جذابیت زیبایی شناختی خود ادغام می کنند و از پتانسیل آنها در هدایت توجه کاربر و تأثیرگذاری بر رفتار کاربر ناتوان هستند.

برای سبد خرید باربری رایگان متحرک خود، از دو الگوی رفتاری آشنا استفاده می‌کنیم:

باز کردن قفل

اگر امکان دستیابی به چیزی که قبلاً غیرقابل دسترس بود وجود داشته باشد، مردم سعی می کنند به آن دسترسی پیدا کنند تا بتوانند از آن بهره مند شوند. از این اصل می توان برای ایجاد جذابیت بیشتر استفاده کرد.

تشویق کردن

دریافت بازخورد مثبت از قبل در طول یک کار و دیدن اینکه همه چیز به درستی انجام شده است انگیزه بخش است.

این الگوها اساس طراحی ما را تشکیل می دهند. اگر بخواهیم این را در یک سناریوی واقعی آزمایش کنیم، می‌توانیم از این الگوها برای فرمول‌بندی یک فرضیه آگاهانه درباره اینکه آیا نوار ارسال رایگان به طور موثر AOV ما را تقویت می‌کند و نرخ پرش از سبد خرید تا پرداخت را کاهش می‌دهد، استفاده کنیم.

پیاده سازی

برای پیاده سازی این، ما با فروشگاه استاندارد Shopify Hydrogen Demo Store کار خواهیم کرد. Hydrogen یک پشته تجاری بدون سرنشین مبتنی بر React Shopify است که از Framer Motion، یک کتابخانه React برای انیمیشن و حرکت پشتیبانی می کند.
در مورد ما، ابتدا با دنبال کردن مستندات، الگوی Shopify Hydrogen را نصب کردیم. اگر نوار حمل و نقل رایگان را در فروشگاه خودتان که ممکن است بر روی پلتفرم دیگری اجرا شود، اجرا می کنید، واضح است که می توانید از این مرحله رد شوید.

Shopify Hydrogen با Framer Motion خارج از جعبه عرضه می‌شود، اگر این را در معماری سیستم دیگری اجرا می‌کنید که این را ندارد، ابتدا باید وابستگی‌های خود را با اجرای زیر نصب کنید:

npm install framer-motion lottie-react
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد مولفه نوار ارسال رایگان

با نصب وابستگی ها، بیایید یک جزء جدید برای نوار ارسال رایگان خود ایجاد کنیم. در این کامپوننت، استفاده خواهیم کرد motion از Framer Motion برای متحرک سازی عرض نوار ارسال رایگان، و AnimatePresence برای مدیریت حضور انیمیشن Lottie.

ابتدا کتابخانه ها و اجزای لازم را وارد کنید. ما از حرکت و استفاده خواهیم کرد AnimatePresence از Framer Motion برای انیمیشن نوار ارسال رایگان و Lottie انیمیشن ما همچنین مولفه Lottie را از lottie-react بسته، و یک فایل JSON حاوی داده های انیمیشن confetti.

import React from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import Lottie from 'lottie-react';
import ConfettiAnimation from '../../public/assets/7893-confetti-cannons.json'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بعد، تعریف کنید ProgressBar جزء. الف را دریافت می کند price prop که برای محاسبه پیشرفت نوار و پیام نمایش داده شده در بالای نوار استفاده می شود.

را freeShippingThreshold به عنوان 1500 تعریف می شود. این آستانه ای است که می خواهیم قیمت ما به آن برسد. مسلما این یک آستانه بسیار بالا برای ارسال رایگان است! از آنجایی که ما از راه‌اندازی استاندارد هیدروژن استفاده می‌کردیم که دارای یک فروشگاه اسنوبرد با قیمت‌های بسیار بالا است، آن را مطابق با این مثال تنظیم کردیم. این مقدار را بر اساس نیاز خود تنظیم کنید.

را progress به عنوان درصدی از قیمت در مقایسه با آستانه ارسال رایگان محاسبه می شود. اگر پیشرفت بیش از 100٪ باشد، آن را به 100٪ محدود می کنیم:

const ProgressBar: React.FC<ProgressBarProps> = ({ price }) => {
  // Define the threshold for free shipping
  const freeShippingThreshold = 1500;

  // Calculate the progress as a percentage
  let progress = (price / freeShippingThreshold) * 100;

  // Ensure the progress doesn't exceed 100%
  if (progress > 100) {
    progress = 100;
  }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مرحله بعد، مقدار باقیمانده مورد نیاز برای ارسال رایگان را محاسبه کرده و پیامی را که در بالای نوار ارسال رایگان نمایش داده می شود، تعریف می کنیم:

  // Calculate the remaining amount for free shipping
  const remaining = freeShippingThreshold - price;

  // Determine the message to display above the free shipping bar
  const message = progress === 100 
    ? 'Free shipping unlocked!' 
    : `You're missing $${remaining.toFixed(2)} for free shipping`;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در نهایت، TSX را برای کامپوننت خود برمی گردانیم. ما استفاده می کنیم motion.div کامپوننت برای ایجاد یک div متحرک که عرض و رنگ پس‌زمینه آن را بر اساس پیشرفت تغییر می‌دهد. ما نیز استفاده می کنیم AnimatePresence برای رندر مشروط انیمیشن Lottie زمانی که پیشرفت به 100٪ رسید.

  return (
    <div className="overflow-hidden bg-transparent">
      {/* Display the progress bar */}
      <div className="overflow-hidden h-3 w-full border border-gray-300 rounded-md">
        <motion.div
          className="h-full rounded-md"
          animate={{
            width: `${progress}%`,
            // Change the background colorcolor based on the progress
            backgroundColor: progress === 100 ? 'lightblue' : 'lightgrey'
          }}
          transition={{ duration: 0.5, ease: "easeOut" }}
        />
      </div>

      {/* Display the message */}
      <p className="mb-2 text-center text-sm mt-2">{message}</p>

      {/* Display the Lottie animation when progress is 100% */}
      <AnimatePresence>
        {progress === 100 && (
          <Lottie className="absolute bottom-0 left-0 pointer-events-none" animationData={ConfettiAnimation} loop={false} autoplay />
        )}
      </AnimatePresence>
    </div>
  );
};

export default ProgressBar;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به طور خلاصه، در TSX برگشتی، یک div کانتینری با یک نوار ارسال رایگان و یک پیام ایجاد می کنیم. نوار یک است motion.div که عرض و رنگ پس زمینه بر اساس متحرک می شوند progress ارزش. پیام یک پاراگراف است که متغیر پیام را که قبلا تعریف کرده بودیم نمایش می دهد.

ما نیز از AnimatePresence مولفه برای رندر مشروط یک انیمیشن Lottie زمانی که progress به 100% می رسد. این انیمیشن یک انیمیشن SVG است که یک بار پخش می شود و لوپ نمی شود. در پایین سمت چپ صفحه قرار گرفته است و به لطف وجود نشانگر تداخلی با رویدادهای نشانگر ندارد pointer-events-none کلاس

این کد را برای مؤلفه نوار ارسال رایگان به ما می‌دهد:

import React from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import Lottie from 'lottie-react';
import ConfettiAnimation from '../../public/assets/7893-confetti-cannons.json'

interface ProgressBarProps {
  price: number;
}

const ProgressBar: React.FC<ProgressBarProps> = ({ price }) => {
  // Define the threshold for free shipping
  const freeShippingThreshold = 1500;

  // Calculate the progress as a percentage
  let progress = (price / freeShippingThreshold) * 100;

  // Ensure the progress doesn't exceed 100%
  if (progress > 100) {
    progress = 100;
  }

  // Calculate the remaining amount for free shipping
  const remaining = freeShippingThreshold - price;

  // Determine the message to display above the progress bar
  const message = progress === 100 
    ? 'Free shipping unlocked!' 
    : `You're missing $${remaining.toFixed(2)} for free shipping`;

  return (
    <div className="overflow-hidden bg-transparent">
      {/* Display the message */}
      <div className="overflow-hidden h-3 w-full border border-gray-300 rounded-md">
        <motion.div
          className="h-full rounded-md"
          animate={{
            width: `${progress}%`,
            // Change the background color based on the progress
            backgroundColor: progress === 100 ? 'lightblue' : 'lightgrey'
          }}
          transition={{ duration: 0.5, ease: "easeOut" }}
        />
      </div>
      <p className="mb-2 text-center text-sm mt-2">{message}</p>
      {/* Display the Lottie animation when progress is 100% */}
      <AnimatePresence>
        {progress === 100 && (
          <Lottie className="absolute bottom-0 left-0 pointer-events-none" animationData={ConfettiAnimation} loop={false} autoplay />
        )}
      </AnimatePresence>
    </div>
  );
};

export default ProgressBar;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بخش نوار حمل و نقل اکنون می تواند به عنوان یک جزء به سادگی با وارد کردن آن در فایل مورد نظر و قرار دادن آن در جایی که می خواهید ظاهر شود، استفاده شود. در مورد ما آن را در CartSummary عملکرد از Cart.tsx فایل زیر عناصر خلاصه سپس کل مبلغ موجود در سبد خرید را ارسال می کنیم تا نوار ارسال رایگان را بر این اساس ارائه کنیم.

function CartSummary({
  cost,
  layout,
  children = null,
}: {
  children?: React.ReactNode;
  cost: CartCost;
  layout: Layouts;
}) {
  const summary = {
    drawer: 'grid gap-4 p-6 border-t md:px-12',
    page: 'sticky top-nav grid gap-6 p-4 md:px-6 md:translate-y-4 bg-primary/5 rounded w-full',
  };

  // Retrieve the `totalAmount` from the `cost` object, convert it to a floating-point number, 
  // and assign it to `totalAmount`. If `cost`, `totalAmount`, or `amount` is not defined, default to 0.
  const totalAmount = parseFloat(cost?.totalAmount?.amount || '0');


  return (
    <section aria-labelledby="summary-heading overflow-hidden" className={summary[layout]}>
      <h2 id="summary-heading" className="sr-only">
        Order summary
      </h2>
      <dl className="grid">
        <div className="flex items-center justify-between font-medium">
          <Text as="dt">Subtotal</Text>
          <Text as="dd" data-test="subtotal">
            {cost?.subtotalAmount?.amount ? (
              <Money data={cost?.subtotalAmount} />
            ) : (
              '-'
            )}
          </Text>
        </div>
      </dl>
      {children}
        <div>
        <ProgressBar price={totalAmount} /> {/* Use the ProgressBar component here */}
      </div>
    </section>
  );
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بسته بندی

در نتیجه، یک سبد خرید باربری رایگان متحرک، که با اصول باز کردن قفل و تشویق طراحی شده است، می تواند تجربه کاربر را در فروشگاه های تجارت الکترونیک تا حد زیادی افزایش دهد. نه تنها یک عنصر جذاب بصری را فراهم می کند، بلکه به طرز نامحسوسی بر رفتار مشتری تأثیر می گذارد و آنها را به سمت اقدامات مفید برای فروشگاه هدایت می کند، مانند افزایش میانگین ارزش سفارش و کاهش نرخ پرش.

با استفاده از فناوری‌هایی مانند Hydrogen Shopify، Framer Motion برای انیمیشن‌ها، و بسته lottie-react برای جلوه‌های جشن، می‌توانیم یک رابط کاربری جذاب، واکنش‌گرا و تعاملی ایجاد کنیم که برای مشتریان مدرن جذاب باشد. به یاد داشته باشید، در حالی که مثال ما از یک پشته و راه‌اندازی خاص استفاده می‌کرد، این اصول را می‌توان با پلتفرم تجارت الکترونیک منحصر به فرد شما تطبیق داد.

منتظر مقالات بیشتر در سری رابط کاربری تعاملی تجارت الکترونیکی ما باشید، جایی که ما به کاوش در راه های هیجان انگیز برای غنی سازی تجربه کاربری ویترین فروشگاه دیجیتال شما ادامه خواهیم داد!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا