Studi kasus Popover

Swetha Gopalakrishnan
Swetha Gopalakrishnan
Saurabh Rajpal
Saurabh Rajpal

Popover ada di mana-mana di web. Anda dapat melihatnya di menu, tips alat, dan dialog, yang digunakan untuk fitur seperti setelan akun, widget pengungkapan, dan pratinjau kartu produk. Meskipun komponen ini sangat umum, membangunnya di browser masih sangat rumit. Untuk mengatasi hal ini, serangkaian HTML API deklaratif baru untuk membangun popover akan hadir di browser, yang pertama adalah Popover API.

Popover sering kali disalahartikan sebagai dialog. Namun, ada beberapa perbedaan utama dalam perilaku mereka. Elemen dialog yang dibuka dengan dialog.showModal (dialog modal), adalah pengalaman yang memerlukan interaksi pengguna eksplisit untuk menutup modal. popover mendukung penutupan ringan. dialog modal tidak. Dialog modal membuat bagian halaman lainnya tidak aktif. popover tidak. Baca selengkapnya tentang perbedaannya.

Artikel ini adalah bagian dari seri yang membahas cara perusahaan e-commerce meningkatkan kualitas situs mereka menggunakan fitur CSS dan UI baru. Dalam artikel ini, temukan cara Tokopedia menerapkan dan mendapatkan manfaat dari Popover API.

Tokopedia

Penggunaan atribut popover mengurangi hingga 70% baris kode di React. Modal dapat dikontrol secara native oleh HTML, bukan memerlukan penanganan peristiwa di JavaScript dan menggunakan React.createPortal untuk memindahkan DOM modal ke akhir document.body. Kami juga dapat menggunakan @starting-style untuk menganimasikan pembukaan dan penutupan popover.— Andy Wihalim, Senior Software Engineer, Tokopedia.

Halaman Detail Produk (PDP) Tokopedia berisi beberapa gambar produk untuk setiap produk. Saat thumbnail produk diklik, modal akan dibuka untuk menampilkan gambar yang diperbesar. Ini adalah pola umum yang digunakan di situs e-commerce.

Kode

Tokopedia menggunakan React untuk pengembangan frontend. Sebelum menerapkan popover API untuk modal ini, mereka menggunakan modal DOM dan tombol. Tombol mengubah status React untuk membuka modal. Dengan popover API, mereka menentukan atribut popovertarget dalam elemen yang membuka popover dengan nilai yang sama dengan ID elemen popover.

Dengan penerapan dasar ini, popover berfungsi, tetapi muncul dan menghilang tanpa animasi apa pun. Untuk membuat animasi masuk dan keluar yang lancar untuk popover, gunakan :popover-open dan @starting-style, serta izinkan animasi properti diskrit. Dalam contoh kode berikut, popover menskalakan masuk dan keluar menggunakan properti transform: 'scale()'.

Contoh kode ini menunjukkan cara menerapkan animasi masuk dan keluar untuk popover API.

<Thumbnail popovertarget="medialightbox" />
<MediaLightbox popover id="medialightbox" />
export const cssModalWrapper = css({
  background: NN0,
  border: 'none',
  borderRadius: '.625rem',
  width: 1024,
  padding: 24,

  '&::backdrop': {
    opacity: 0,
    transitionProperty: 'opacity, display',
    transition: '.25s ease-out',
    transitionBehavior: 'allow-discrete',
  },

  transitionProperty: 'transform, opacity, display',
  transition: '.25s ease-out',
  transitionBehavior: 'allow-discrete',

  transform: 'scale(0.8)',
  opacity: 0,
  '@starting-style': {
    transform: 'scale(1)',
    opacity: 1,
  },

  '&:popover-open': {
    transform: 'scale(1)',
    opacity: 1,
    '@starting-style': {
      transform: 'scale(0.8)',
      opacity: 0,
    },
  },
});

Untuk mengakomodasi browser yang tidak mendukung popover API, Tokopedia menerapkan the popover-polyfill oleh oddbird, yang hanya berukuran 3,2 KB dengan kompresi gzip. Mereka puas dengan polyfill karena berfungsi dengan baik dan tidak menyebabkan regresi performa. Secara keseluruhan, mereka dapat mengurangi hingga 70% baris kode di React dengan popover API.

Hal yang perlu dipertimbangkan saat menggunakan Popover API

Tokopedia menggunakan React, dan tim mencapai pemisahan kode dengan menghapus komponen popover untuk halaman yang tidak menggunakannya, lalu melakukan pemisahan kode untuk konten popover. Dengan cara ini, mereka mengurangi ukuran permintaan awal.

Pertimbangkan untuk menggabungkan popover dengan penentuan posisi anchor CSS (segera hadir di Chrome) untuk memosisikannya relatif terhadap elemen lain. Hal ini berguna untuk menu dan tooltip, misalnya.

Resource

Jelajahi artikel lain dalam seri ini yang membahas manfaat yang diperoleh perusahaan e-commerce dari penggunaan fitur CSS dan UI baru seperti Animasi berbasis scroll, popover, kueri penampung, dan selektor has().