Advertisement
  1. Web Design
  2. JavaScript

Transisi Halaman yang Halus dan Menyenangkan dengan History Web API

Scroll to top
Read Time: 10 min

() translation by (you can also view the original English article)

Di panduan ini kita akan membangun sebauh situs dengan transisi halaman yang halus dan indah tanpa penyegaran halaman yang biasanya agresif. Bernavigasilah di demo halaman untuk melihat apa yang saya maksud.

Untuk meraih efek ini kita akan menggunakan History Web API. Singkatnya, API ini digunakan untuk merubah riwayat browser. Dia mengizinkan kita untuk memuat sebuah URL baru, mengganti judul halaman, dan pada saat yang sama merekamnya sebagai sebuah kunjungan ke browser tanpa benar-benar memuat lamannya.

Ini terdengar membingungkan, tapi dia membuka beberapa kesempatan untuk menyajikan transisi laman secara lebih halus dan memberimu sensasi cepat yang meningkatkan pengalaman pengguna. Kamu mungkin telah menyaksikan aksi History Web API di beberapa situs ada aplikasi seperti Trello, Quartz, dan Privacy.

QuartzQuartzQuartz
Situs Quartz yang entah abstrak (entah bagus juga).

Sebelum kita pergi lebih jauh, mari lihat ke API yang akan kita luncurkan di situs.

History Web API Secara Singkat

Untuk mengakses Web History API, pertama kita menulis windows.history dan diikuti dengan salah satu API-nya; sebuah metode atau properti. Di panduan ini kita akan fokus pada metode pushState(), sehingga.

1
window.history.pushState( state, title, url );

Seperti yang bisa kamu lihat dari intipan di atas, metode pushStates() memiliki tiga parameter.

  1. Parameter pertama, state, akan menjadi objek yang mengandung data arbitrary. Data ini akan bisa diakses melalui window.history.state. Dalam aplikasi di dunia nyata, kita akan melewatkan data seperti page ID, URL, atau seri input yang didapat dari sebuah form.
  2. Dua parameter terakhir adalah title dan 
  3. url. Keduanya merubah URL dan judul dokumen di browser, dan juga merekam mereka sebagai entri baru di riwayat browser.

Mari bedah contoh berikut untuk memahami lebih baik cara kerja metode pushState().

1
(function( $ ){
2
3
  $( "a" ).on( "click", function( event ) {
4
5
		event.preventDefault();
6
7
		window.history.pushState( { ID: 9 }, "About - Acme", "about/" );
8
	} );
9
10
})( jQuery );

Pada kode di atas, sebuah tautan terlampir dengan event click lalu meluncurkan metode pushState(). Saat kita menekan tautan, kita berharap kode untuk merubah judul dan URL dokumen.

Browsers WindowBrowsers WindowBrowsers Window
Dari atas ke bawah: Chrome, Frefox, Opera.

DAn dia melakukannya; screenshot menunjukkan URL-nya berubah ke "about/" seperti yang didefinisikan metode pushState(). Dan karena motede pushStates() membuat rekaman baru di riwayat browser, kita bisa kembali ke halaman sebelumnya melalui tombol Back browser.

Namun, semua browser di contoh ini menolak parameter title. Kamu bisa melihat dari screenshot. Dokumennya tidak berubah menjadi About - Acme seperti yang dispesifikasikan. Lebih lanjut lagi, memanggil metode pushState() tidak akan memicu event popstate; sebuah event yang dikirim tiap kali riwayat berubah-terkadang kita butuh! Ada beberapa perbedaan cara browser menangani event ini, seperi yang dinyatakan di MDN.

"Broswer cenderung untuk menangani event popstate secara berbeda saat memuat laman. Chrome (sebelum v34) dan Safari selalu mengeluarkan event popstate saat memuat laman namun Firefox tidak.

Kita memerlukan sebuah pustaka sebagai posisi mundur untuk membuat History Web API bekerja secara konsisten di antara browser tanpa rintangan.

Berkenalan Dengan History.js

Semenjak metode pushState() tidak bekerja sesuai potensinya, di panduan ini kita akan menggunakan History.js Seperti yang namanya implikasikan, pustaka JavaScript ini adalah sebuah polyfill, mereplika History API yang bekerja di browser berbeda. Sehingga juga mengekspos sekumpulan metode yang dimiliki API bawaan, meskipun dengan beberapa perbedaan.

Seperti yang disebutkan sebelumnya. API bawaan browser dipanggi melalui jendela history dengan huruf "h" kecil, sementara History.js API diakses melalui History dengan huruf "H" besar. Memberikan contoh sebelumnya dan berasumsi bahwa kita memiliki berkas history.js termuat. Kita bisa merevisi kodenya agar sesuai (perhatikan huruf "H" besar).

1
window.History.pushState( {}, title, url );

Saya harap penjelasan singkatnya mudah dipahami. Jika tidak, berikut adalah beberapa referensi lebih lanjut jika kamu ingin mempelajari lebih mengenai Web History API.

Membangun Situs Statis Kita

Di bagian ini kita tidak akan membahas tiap tahap yang dibutuhkan untuk membangun sebuah situs statis secara detil. Situs kita akan sederhana seperti yang tampakkan screenshot berikut:

Beranda Situs

Kamu tidak perlu membuat sebuah situs yang terlihat persis sama; kamu bebas menambahkan konten apapun dan membuat halaman sebanyak yang kamu ingin. Namun, ada beberapa poin penting yang kamu perlu pertimbangkan terkait struktur HTML dan penggunaan atribut id dan class untuk beberapa elemen.

  1. Muat jQuery dan History.js di dalam head dokumen. Kamu bisa memuatnya project dependency melalui Bower, atau sebuah CDN seperi CDNJS atau JSDelivr.
  2. Bungkus header, konten dan footer dalam div dengan id wrap; <div id="wrap"></div>
  3. Ada beberapa item navigasi di header situs dan footer. Tiap menu harus merujuk ke sebuah halaman. Pastikan halamannya tersedia dan memiliki konten.
  4. Tiap tautan menu diberikan class page-link yang akan kita gunakan untuk memilih menu.
  5. Terakhir, kita akan memberikan tiap tautan sebuah atribut title yang akan kita lewati pushStates() untuk menentukan judul dokumen.

Telah melakukannya semua, markup HTML kita akan tampak seperti berikut:

1
<head>
2
	<script src="jquery.js"></script>
3
	<script src="history.js"></script>
4
</head>
5
<body>
6
	<div id="wrap">
7
		<header>
8
			<nav>
9
				<ul>
10
					<li><a class="page-link" href="./" title="Acme">Home</a></li>
11
					<li><a class="page-link" href="./about.html" title="About Us">About</a></li>
12
					<!-- more menu -->
13
				</ul>
14
			</nav>
15
		</header>
16
		<div>
17
			<!-- content is here -->
18
		</div>
19
		<footer>
20
			<nav>
21
				<ul>
22
					<li><a href="tos.html" class="page-link" title="Terms of Service">Terms</a></li>
23
					<!-- more menu -->
24
				</ul>
25
			</nav>
26
			<!-- this is the footer -->
27
		</footer>
28
	</div>
29
</body>

Ketika kamu telah selesai membangun situs statismu kita bisa pindah ke bagian utama dari panduan ini.

Menerapkan History Web API

Sebelum kita mulai menulis kode apapun, kita perlu membuat sebuah berkas baru untuk menyimpan JavaScript; kita akan menamainya script.js dan memuat berkasnya ke dalam dokumen sebelum tag penutup body.

Mari tambahkan pecahan pertama dari kode untuk mengubah judul dokumen dan URL saat menekan navigasi menu:

1
// 1.

2
var $wrap = $( "#wrap" );
3
4
// 2.

5
$wrap.on( "click", ".page-link", function( event ) {
6
	
7
	// 3.

8
	event.preventDefault();
9
	
10
	// 4.

11
	if ( window.location === this.href ) {
12
		return;
13
	}
14
	
15
	// 5.

16
	var pageTitle = ( this.title ) ? this.title : this.textContent;
17
		pageTitle = ( this.getAttribute( "rel" ) === "home" ) ? pageTitle : pageTitle + " — Acme";
18
	
19
	// 6.

20
	History.pushState( null, pageTitle, this.href );
21
} );

Saya telah membagi kodenya ke beberapa bagian. Ini akan membuatnya lebih mudah bagimu untuk menunjuk kode dengan referensi berikut:

  1. Di baris pertama, kita pilih elemen, <div id="wrap"></div>, yang membungkus seluruh konten situs kita.
  2. Kita melampirkan event click. Tapi, seperti yang bisa kamu lihat di atas, kita melampirkannya ke elemen #wrap ketimbang melampirkannya langsung ke event dari tiap menu navigasi. Praktik ini di kenal sebagai event delegation. Dengan kata lain, elemen #wrap kita bertanggung jawab untuk mendengarkan event klik terhadap .page-link.
  3. Kita juga telah menambahkan event.preventDefaut() sehingga pengguna tidak akan diarahkan ke halaman yang dipertanyakan.
  4. Jika URL menu yang diklik sama dengan jendela saat ini, kita tidak perlu memproses operasi selanjutnya, karena itu tidak perlu.
  5. variabel pageTitle mengandung format judul, yang didapat dari atribut judul tautan atau tautan teks. Tiap judul laman mengikuti konvensi {Page Title} - Acme, kecuali untuk beranda. "Acme" adalah nama perusahaan khayalan kita.
  6. Terakhir, kita melewatkan pageTitle dan URL laman ke metode pushState() History.js

Pada titik ini, ketika kita menekan menu navigasi, judul dan URL akan berubah sesuai yang ditunjukkan di bawah:

The browser window with updated URL and titleThe browser window with updated URL and titleThe browser window with updated URL and title
Judul dan URL halaman berubah

Bahkan jika konten halamannya tetap sama! Dia tidak diperbaharui agar cocok dengan judul dan URL baru.

Konten

Kita perlu menambah baris kode berikut untuk benar-beanr mengganti konten halaman.

1
// 1.

2
History.Adapter.bind( window, "statechange", function() {
3
	
4
	// 2.

5
	var state = History.getState();
6
	
7
	// 3.

8
	$.get( state.url, function( res ) {
9
10
		// 4.

11
		$.each( $( res ), function( index, elem ) {
12
			if ( $wrap.selector !== "#" + elem.id ) {
13
				return;
14
			}
15
			$wrap.html( $( elem ).html() );
16
		} );
17
18
	} );
19
} );

Sekali lagi, kode di sini di bagi ke beberapa bagian.

  1. Baris pertama dari kode akan mendengarkan ke perubahan riwayat yang terjadi melalui metode pushState() History.js dan menjalankan fungsi yang terlampir.
  2. Kita mendapatkan perubahan keadaan, termasuk aneka data seperti URL, judul, dan id.
  3. Melalui metode .get() jQuery kita mendapatkan konten dari URL yang ada.
  4. Terakhir, kita menyaring elemen dengan sebuah id bernama wrap dari data yang didapat, dan akhirnya mengganti konten halaman sekarang dengannya.

Setelah ditambahkan, kontennya harusnya sekarang diperbaharui saat kita menekan menu navigasi. Seperti yang disebutkan, kita juga bisa mengakses halaman yang terkunjungi kembali melalui tombol Back dan Forward browser.

The browser window now with the updated contentThe browser window now with the updated contentThe browser window now with the updated content

Situs kita dapat ditampilkan pada titik ini. Namun, kita ingin melangkah lebih jauh dengan menambahkan sedikit animasi untuk membuat halannya jadi hidup dan akhirnya situs kita terasa lebih menarik.

Menambahkan Animasi dan Transisi

Animasi pada situasi ini cukup sederhana, sehingga kita menulisnya dari awal daripada memuat animasi melalui pustakan seperi Animate.css, Motion UI dari ZURB, atau Effeckt.css. Kita akan menamakannya slideInUp, seperti berikut:

1
@keyframes slideInUp {
2
	from {
3
		transform: translate3d(0, 10px, 0);
4
		opacity: 0;
5
	}
6
	to {
7
		transform: translate3d(0, 0, 0);
8
		opacity: 1;
9
	}
10
}

Seperti yang diimplikasikan namanya, animasinya akan menggeser konten halaman dari bawah ke atas dengan elemen opacity. Terapkan animasinya ke elemen yang membungkus konten utama halaman seperti berikut.

1
.section {
2
	animation-duration: .38s;
3
	animation-fill-mode: both;
4
	animation-name: slideInUp;
5
}

Transisi dari satu halaman ke halaman lainnya akan terasa lebih harus saat animasinya diterapkan. Di sini, kamu bisa berhenti dan mengganpnya kerja seharian! Situs kita telah selesai dan kita siap meluncurkannya ke dunia untuk dilihat.

Namun, adalah satu hal lagi yang perlu kamu pertimbangkan, terutama bagi yang ingin mengawasi jumlah pengunjung dan perilaku pengunjung situsmu.

Kita perlu menambahkan pelacakkan Google Analytics ke tiap page view.

Google Analytics

Semenjak situs kita akan dimuat secara asinkron (kecuali untuk halaman yang dimuat di awal) melacak angka page view juga harus dilakukan secara asinkron.

Untuk memulainya, pastikan kamu memiliki standar Google Analytics terpasang di head dokumen. Kodenya biasanya terlihat seperti berikut:

1
<script>
2
		(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
3
			(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
4
			m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
5
		})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
6
7
		ga('create', 'UA-XXXXXX-XX', 'auto');
8
		ga('send', 'pageview');
9
10
	</script>

Lalu kita perlu mengatur kode JavaScript kita untuk memasukkan kode pelacakkan Google Analytics sehingga tiap halaman yang dimuat secara asinkron akan dihitung sebagai page view juga.

Kita memiliki beberapa pilihan. Pertama, kita bisa menghitung ketika pengguna menekan tautan navigasi, atau ketika mengganti judul dan URL halaman, atau ketika konten dari halaman telah sukses dimuat.

Kita akan memilih yang terakhir, yang tampak paling otentik, dan untuk melakukannya kita akan menggunakan metode promise() jQuery setelah merubah konten halaman seperti berikut:

1
$wrap.html( $( elem ).html() )
2
		.promise()
3
			.done( function( res ) {
4
5
			// Make sure the new content is added, and the 'ga()' method is available.

6
			if ( typeof ga === "function" && res.length !== 0 ) {
7
				ga('set', {
8
					page: window.location.pathname,
9
					title: state.title
10
				});
11
				ga('send', 'pageview');
12
		}
13
	});

Begitulah, sekarang kita telah membuat page view terhitung di Google Analytics.

Kesimpulan

Di Panduan ini kita telah meningkatkan sebuah situs statis sederhana menggunakan Web History API untuk membuat transisi halaman yang halus, memuatnya lebih cepat, dan secara keseluruhan membawa pengalaman yang lebh baik pada pengguna. Di akhir panduan ini, kita juga telah mengimplementasikan Google Analytics untuk merekam page view secara asinkron. Ditambah lagi, situs kita crawl-able secara sempurna oleh mesin pencari. Karena seperti yang disebutkan sebelumnya hanya situs HTML sederhana.

Ini adalah panduan yang berisi, menjelaskan banyak hal seperti animasi CSS, jQuery Ajax, dan jQuery Promise. Berikut adalah referensi berguna untuk kamu lihat, untuk memperkuat yang telah kamu pelajari.

Terakhir, jangan lupa untuk mengunjungi situs demo dari panduan ini dan juga sumber kode-nya di repositori.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.