Showing posts with label Layar. Show all posts
Showing posts with label Layar. Show all posts

Membuat Posting Layar Penuh

Mode layar penuh.
Mode layar penuh.

Saya membuat sebuah aplikasi/widget kecil untuk membuat posting di blog menjadi memiliki alternatif tampilan “layar penuh”. Tidak benar-benar layar penuh sebenarnya, karena widget ini hanya bekerja dengan cara menyisipkan tabir baru berisi duplikat judul dan konten posting. Kalau Anda ingin membuat fitur full screen sungguhan yang bisa memenuhi seluruh layar, Anda bisa mempelajari API JavaScript ini ⇒ MDN - Using Full Screen Mode

Untuk memasang widget ini, masuklah ke halaman editor HTML Templat, lalu letakkan kode ini di atas </body>:

<b:if cond='data:blog.pageType == &quot;item&quot;'>
<script src='http://dte-project.googlecode.com/svn/trunk/full-screen.min.js'/>
<script>
//<![CDATA[
postFullScreen({
titleSource: document.querySelector('.post-title'),
contentSource: document.querySelector('.post-body'),
background: "#fff",
color: "inherit",
fontSize: "120%",
padding: 50,
maxWidth: 750,
openText: "Full Screen Mode",
closeText: "Exit full screen mode",
appendButtonTo: null,
beforeInit: null,
afterInit: null
});
//]]>
</script>
</b:if>

Atau Saya sarankan lebih baik letakkan kode di atas sedekat mungkin dengan posting. Lebih tepatnya di bagian paling bawah dari posting:

<b:section class='main' id='main' showaddelement='no'>
<b:widget id='Blog1' locked='true' title='Posting Blog' type='Blog'> … </b:section>
</b:section>
<!-- Letakkan di sini -->

Klik Simpan Templat.

Konfigurasi

OpsiKeterangan
titleSourceSelektor elemen HTML dimana di dalamnya berisi teks judul. Di atas Saya menggunakan selektor document.querySelector('.post-title') untuk memperoleh teks judul dari dalam elemen <h3 class='post-title'></h3>. Sebagai alternatif, Anda bisa mencoba untuk menggunakan selektor document.title untuk memperoleh judul dari address bar.
contentSourceSelektor elemen HTML dimana di dalamnya terdapat konten artikel/posting. Pengaturannya sama persis dengan opsi titleSource.
backgroundDigunakan untuk menentukan warna latar tabir layar penuh.
colorDigunakan untuk menentukan warna teks mode layar penuh. inherit artinya warna menyesuaikan dengan warna teks posting.
fontSizeDigunakan untuk menentukan besar teks di artikel layar penuh.
paddingDigunakan untuk menentukan padding tabir layar penuh.
maxWidthDigunakan untuk menentukan lebar maksimal area artikel layar penuh.
openTextDigunakan untuk menentukan teks tombol pemicu layar penuh.
closeTextDigunakan untuk menentukan teks tombol penutup tampilan layar penuh.
createButtonDigunakan untuk membuat tombol kustom. Lihat penjelasan di bawah.
appendButtonToNilai berupa selektor elemen HTML. Jika nilainya null, tombol akan secara otomatis disisipkan di bawah posting. Jika nilainya false, tombol tidak akan disisipkan secara otomatis (bermanfaat jika Anda ingin membuat tombol pemicu tersendiri secara terpisah).
beforeInitLihat penjelasan di bawah.
afterInitLihat penjelasan di bawah.

Penjelasan Ekstra

createButton

Opsi ini digunakan sebagai alternatif jika Anda tidak suka dengan tampilan tombol pemicu layar penuh secara normal. Anda bisa memanfaatkan opsi ini untuk menentukan/membuat elemen tombol kustom. Sebagai contoh di sini Saya menggunakan elemen tautan sebagai tombol:

var buttonMarkup = document.createElement('a');
buttonMarkup.className = "custom-button";
buttonMarkup.style.display = "block";
buttonMarkup.style.marginTop = "20px";

postFullScreen({
openText: "Layar Penuh!",
createButton: buttonMarkup
});

/*

akan menghasilkan ini:

<a class="custom-button" style="display:block;margin-top:20px;">Layar Penuh!</a>

*/

Atau Anda juga bisa menentukan nilainya sebagai objek yang sudah ada. Sebagai contoh Anda membuat tombol pemicu secara manual di tempat tertentu, misalnya di sidebar:

<aside>
...
<button id="full-screen-button">Layar Penuh</button>
...
...
</aside>

Kemudian Anda bisa melakukan ini untuk membuat tombol tersebut menjadi aktif:

postFullScreen({
createButton: document.getElementById('full-screen-button'),
appendButtonTo: false
});

Jangan lupa untuk mengatur opsi appendButtonTo menjadi false karena jika tidak tombol tersebut mungkin akan berpindah tempat. Secara umum akan berpindah ke bagian akhir posting:

appendButtonTo

Opsi ini digunakan untuk menentukan ke mana tombol pemicu tampilan layar penuh akan disisipkan. Berikut ini adalah sebuah contoh jika Anda ingin menyisipkan tombol pemicu layar penuh di dalam elemen #button-container:

<div id="button-container"></div>
postFullScreen({
...
appendButtonTo: document.getElementById('button-container')
});

beforeInit dan afterInit

Ini adalah opsi untuk membuat fungsi bebas yang akan tereksekusi sebelum (untuk beforeInit) dan sesudah (untuk afterInit) markup tabir tersisip ke blog. Yang paling berguna adalah beforeInit. Fungsi ini bisa Anda gunakan untuk memastikan bahwa manipulasi konten posting yang dilakukan oleh JavaScript telah dilakukan sebelum widget ini tereksekusi. Misalnya mengenai Syntax Highlighter atau JavaScript emotikon. Jika Syntax Highlighter atau JavaScript emotikon tidak diaktifkan sebelum widget ini aktif, maka kemungkinannya posting-posting kode yang berada di dalam artikel layar penuh tidak akan berwarna, dan emotikon-emotikon di dalam artikel tidak akan berubah menjadi gambar:

postFullScreen({
beforeInit: function() {
repText('post-12345');
hljs.initHighlighting();
},
afterInit: function() {
alert('OK!');
}
});

Pengguna JQuery

Jangan lupa untuk menambahkan indeks [0] setelah selektor jika Anda menggunakan API selektor elemen JQuery:

postFullScreen({
titleSource: $('.post-title')[0],
contentSource: $('.post-body')[0]
});

Mendapatkan Tinggi dan Lebar Layar Monitor

Versi JQuery

var x = $(window).width(),
y = $(window).height();

// Tampilkan lebar dan tinggi layar dalam kotak pesan
alert('Lebar layar: ' + x + '; Tinggi layar: ' + y);

Versi JavaScript Murni

var w = window,
d = document,
e = d.documentElement,
g = d.body,
x = w.innerWidth || e.clientWidth || g.clientWidth, // x = Lebar layar
y = w.innerHeight || e.clientHeight || g.clientHeight; // y = Tinggi layar

// Tampilkan lebar dan tinggi layar dalam kotak pesan
alert('Lebar layar: ' + x + '; Tinggi layar: ' + y);

Membangun Layout Paralaks dengan JQuery

JQuery Parallax layout

Membuat layout paralaks, jika Anda masih kesulitan untuk memahami bagaimana cara kerja dan cara membuatnya, di sini Saya akan menjelaskannya dengan rinci mengenai bagaimana layout tersebut tercipta. Pada dasarnya, sebuah layout paralaks hanyalah elemen HTML dengan beberapa tumpukan layer di dalamnya, dimana setiap layer tersebut akan dianimasikan posisinya dengan kecepatan yang sama namun dengan jarak yang berbeda untuk menciptakan efek tiga dimensi saat layer-layer tersebut bergerak.

Membuat Latar Paralaks

Kita mulai dengan elemen HTML seperti ini:

<div id="parallax-wrapper" class="parallax-wrapper">
<div class="layer layer-1"></div>
<div class="layer layer-2"></div>
<div class="layer layer-3"></div>
...
...
</div>

Saya membuat sebuah elemen HTML sebagai kontainer dengan beberapa layer di dalamnya. Elemen utamanya adalah #parallax-wrapper. Elemen ini berfungsi sebagai wadah dari semua elemen paralaks di dalamnya. Sedangkan elemen-elemen .layer nantinya akan kita gunakan sebagai penampil latar. Kita akan memposisikan layer-layer tersebut menjadi bertumpukan layaknya tumpukan kaca. Jadi kita memerlukan ini untuk mengatur dimensi paralaks yang kita buat:

.parallax-wrapper {
border:1px solid black;
height:200px; /* Tentukan tinggi area paralaks, ukuran lebar tidak begitu penting */
position:relative; /* Penting! Posisi absolut pada elemen induk */
overflow:hidden;
}

/* Buat semua layer paralaks sebagai elemen absolut,
sehingga tampilannya akan bertumpuk satu sama lainnya */
.parallax-wrapper .layer {
position:absolute;
top:0;
right:0;
bottom:0;
left:0;
/* set beberapa pengaturan latar di sini,
sebelum kita mendefinisikan latar gambar secara sepihak
pada masing-masing layer */
background-position:0 0;
background-color:transparent;
background-repeat:repeat-x;
}

Setelah itu, gambar-gambar bisa diterapkan pada masing-masing layer:

.parallax-wrapper .layer-1 {background-image:url('img/parallax-bg-1.png')}
.parallax-wrapper .layer-2 {background-image:url('img/parallax-bg-2.png')}
.parallax-wrapper .layer-3 {background-image:url('img/parallax-bg-3.png')}

Navigasi Paralaks

Navigasi ini digunakan untuk menggerakkan latar paralaks —dan konten di dalamnya tentunya, agar paralaks tidak hanya berfungsi sebagai hiasan. Navigasi terdiri dari elemen <span> dengan beberapa tautan di dalamnya. Anda bisa membuatnya menggunakan elemen apa saja, tapi di sini Saya mencoba untuk membuatnya seminimalis mungkin:

<span id="parallax-navigation" class="parallax-navigation">
<a href="#1">1</a>
<a href="#2">2</a>
<a href="#3">3</a>
<a href="#4">4</a>
...
...
</span>

CSS untuk navigasinya:

.parallax-navigation {
display:block;
height:30px;
line-height:30px;
position:relative;
text-align:right;
font-size:11px;
font-weight:bold;
}

.parallax-navigation a {
text-decoration:none;
color:black;
background-color:#eee;
padding:5px 10px;
}

/* set latar dan warna yang berbeda untuk item navigasi yang sedang aktif */
.parallax-navigation a.active {
background-color:#529834;
color:white;
}

Selesai sampai di sini, sekarang kita akan mengerjakan fungsi dasar untuk menggerakkan layer:

Efek Paralaks

Beberapa mungkin akan membuat efek paralaks dengan cara menganimasikan properti left pada elemen relatif untuk menggerakkan elemen ke kiri atau ke kanan. Tapi kekurangannya adalah, mengubah jarak left terlalu jauh akan membuat posisi layer berubah dan pada akhirnya akan menghilang dari pandangan jika jaraknya sudah terlalu jauh. Di sini Saya lebih menyarankan untuk menganimasikan posisi latar dibandingkan posisi layer itu sendiri, sehingga layer tidak akan bergerak, hanya latarnya saja yang bergerak.

Namun tidak mendukung properti animasi background-position dengan baik, jadi kita membutuhkan sebuah plugin untuk itu. Anda akan menemukan begitu banyak plugin JQuery yang berfungsi untuk menganimasikan posisi latar jika Anda mencarinya, dan Saya memilih untuk menggunakan plugin animasi posisi latar dari Keith Wood. Saya tidak kenal dengan orang itu, tapi pluginnya bagus ⇒ http://keith-wood.name/backgroundPos.html

<!-- Muat JQuery di awal -->
<script type="text/javascript" src="js/jquery.js"></script>
<!-- Sertakan plugin JQuery BackgroundPos -->
<script type="text/javascript" src="js/jquery.backgroundpos.min.js"></script>
<script type="text/javascript">
// Pekerjaan kita di sini...
</script>

Definisikan beberapa variabel untuk mempermudah kita dalam menyeleksi elemen dan sekaligus juga memperbaiki performa. Seperti biasa:

var $parallax = $('#parallax-wrapper'),
$layer = $parallax.find('.layer'),
$nav = $('#parallax-navigation');

Setelah itu kita kumpulkan semua item navigasi dan layer di dalam paralaks. Kita akan cenderung menggunakan JQuery .each() di sini, karena ini adalah cara yang paling mudah untuk mendapatkan indeks/urutan masing-masing elemen. Kita akan menganimasikan elemen dengan parameter dari indeks elemen (urutan elemen):

$nav.find('a').each(function() {
// Saat pengguna mengeklik item navigasi...
$(this).on("click", function() {
var step = $(this).index(); // Dapatkan indeks dari setiap item navigasi
// Kumpulkan layer...
$layer.each(function() {
// Definisikan jarak animasi latar pada setiap layer berdasarkan indeksnya
var distance = ($(this).index()+1) * 200; // Kalikan dengan 200
});
return false;
});
}).first().addClass('active'); // Tambahkan kelas `active` pada item navigasi pertama sebagai awalan

Setelah itu, buat fungsi untuk menambah dan melepas kelas active pada setiap item navigasi. Dulu Saya sudah pernah menuliskan kodenya di sini

$nav.find('a').each(function() {
// Saat pengguna mengeklik item navigasi...
$(this).on("click", function() {
var step = $(this).index(); // Dapatkan indeks dari setiap item navigasi
$nav.find('.active').removeClass('active'); // Singkirkan kelas `active` pada item navigasi
$(this).addClass('active'); // Tambahkan kelas `active` pada item navigasi yang diklik
// Kumpulkan layer...
$layer.each(function() {
// Definisikan jarak animasi latar pada setiap layer berdasarkan indeksnya
var distance = ($(this).index()+1) * 200; // Kalikan dengan 200
});
return false;
});
}).first().addClass('active'); // Tambahkan kelas `active` pada item navigasi pertama sebagai awalan

Animasikan posisi latar pada masing-masing layer dengan parameter berupa urutan layer, sehingga jarak perubahan posisi akan berbeda-beda pada masing-masing layer (lebih tepatnya: jarak animasi akan meningkat berdasarkan urutan layer):

$nav.find('a').each(function() {
// Saat pengguna mengeklik item navigasi...
$(this).on("click", function() {
var step = $(this).index(); // Dapatkan indeks dari setiap item navigasi
$nav.find('.active').removeClass('active'); // Singkirkan kelas `active` pada item navigasi
$(this).addClass('active'); // Tambahkan kelas `active` pada item navigasi yang diklik
// Kumpulkan layer...
$layer.each(function() {
// Definisikan jarak animasi latar pada setiap layer berdasarkan indeksnya
var distance = ($(this).index()+1) * 200; // Kalikan dengan 200
// Animasikan posisi latar
$(this).stop().animate({backgroundPosition: '-' + (step*distance) + 'px 0px'}, 1500);
});
return false;
});
}).first().addClass('active'); // Tambahkan kelas `active` pada item navigasi pertama sebagai awalan

Dan beginilah hasil akhir sementara kita. Baru latarnya saja yang dianimasikan, belum ada konten:

Langkah Akhir: Menambahkan Konten

Animasi paralaks sudah berhasil dibuat, sekarang tinggal membuat konten paralaks saja. Setiap konten merupakan item yang bisa Anda isi dengan tulisan dan/atau gambar layaknya slideshow:

HTML

<div id="parallax-wrapper" class="parallax-wrapper">
<div class="layer layer-1"></div>
<div class="layer layer-2"></div>
<div class="layer layer-3"></div>
<div class="box-item-wrapper">
<div class="box-item"> ... </div>
<div class="box-item"> ... </div>
<div class="box-item"> ... </div>
<div class="box-item"> ... </div>
...
...
</div>
</div>

CSS

.box-item-wrapper {
position:relative;
overflow:hidden;
}

.box-item-wrapper .box-item {
float:left; /* posisikan `.box-item` sebagai layout mendatar */
width:100%;
margin:7em 0;
padding:1.5em 2em;
}

Fungsi selanjutnya ditujukan untuk mengeset ukuran kontainer item dan lebar item, serta menganimasikan kontainer item menuju ke kiri dengan jarak tertentu berdasarkan indeks item navigasi. Pertama-tama kita atur ukuran lebar .box-item-wrapper dan .box-item:

var $window = $(window),
$wrap = $parallax.find('.box-item-wrapper'),
width, totalWidth; // Variabel kosong

$window.on("resize", function() {

width = $parallax.width(); // Mendapatkan lebar `#parallax-wrapper`
totalWidth = width * $wrap.find('.box-item').length; // Lebar total = lebar `#parallax-wrapper` dikalikan jumlah `.box-item`

// Set lebar `.box-item-wrapper` selebar `totalWidth`
$wrap.width(totalWidth)
// Set lebar `.box-item` selebar `#parallax-wrapper`
.find('.box-item').width(width);

}).trigger("resize");

Saya menuliskan variabel width dan totalWidth kosong, kemudian menyatakan nilainya di dalam $window.on("resize", function() {}) agar lebar elemen bisa diperbaharui setiap kali ukuran layar diubah. Saya juga menyatakan lebar elemen di dalam event tersebut.

Terakhir, gabungkan animasi properti left di dalam event klik item navigasi untuk menganimasikan posisi .box-item-wrapper:

$nav.find('a').each(function() {
// Saat pengguna mengeklik item navigasi...
$(this).on("click", function() {
var step = $(this).index(); // Dapatkan indeks dari setiap item navigasi
$nav.find('.active').removeClass('active'); // Singkirkan kelas `active` pada item navigasi
$(this).addClass('active'); // Tambahkan kelas `active` pada item navigasi yang diklik
// Kumpulkan layer...
$layer.each(function() {
// Definisikan jarak animasi latar pada setiap layer berdasarkan indeksnya
var distance = ($(this).index()+1) * 200; // Kalikan dengan 200
// Animasikan posisi latar
$(this).stop().animate({backgroundPosition: '-' + (step*distance) + 'px 0px'}, 1500);
});
// Animasikan `.box-item-wrapper` ke kiri untuk menggerakkan `.box-item`
$wrap.stop().animate({'left': -(step*width)}, 1500);
return false;
});
}).first().addClass('active'); // Tambahkan kelas `active` pada item navigasi pertama sebagai awalan

Produk Final

HTML

<div id="parallax-wrapper" class="parallax-wrapper">
<div class="layer layer-1"></div>
<div class="layer layer-2"></div>
<div class="layer layer-3"></div>
<div class="box-item-wrapper">
<div class="box-item"> ... </div>
<div class="box-item"> ... </div>
<div class="box-item"> ... </div>
<div class="box-item"> ... </div>
</div>
</div>

<span id="parallax-navigation" class="parallax-navigation">
<a href="#1">1</a>
<a href="#2">2</a>
<a href="#3">3</a>
<a href="#4">4</a>
</span>

CSS

.parallax-wrapper {
border:1px solid black;
height:200px;
position:relative;
overflow:hidden;
}

.parallax-wrapper .layer {
position:absolute;
top:0;
right:0;
bottom:0;
left:0;
background-position:0 0;
background-color:transparent;
background-repeat:repeat-x;
}

.parallax-wrapper .layer-1 {background-image:url('img/parallax-bg-1.png')}
.parallax-wrapper .layer-2 {background-image:url('img/parallax-bg-2.png')}
.parallax-wrapper .layer-3 {background-image:url('img/parallax-bg-3.png')}

.box-item-wrapper {
position:relative;
overflow:hidden;
}

.box-item-wrapper .box-item {
float:left;
width:100%;
margin:5em 0 0;
padding:1.5em 2em;
}

.parallax-navigation {
display:block;
height:30px;
line-height:30px;
position:relative;
text-align:right;
font-size:11px;
font-weight:bold;
}

.parallax-navigation a {
text-decoration:none;
color:black;
background-color:#eee;
padding:5px 10px;
}

.parallax-navigation a.active {
background-color:#529834;
color:white;
}

JQuery

(function($) {

// Cache some elements
var $window = $(window),
$parallax = $('#parallax-wrapper'),
$layer = $parallax.find('.layer'),
$wrap = $parallax.find('.box-item-wrapper'),
$nav = $('#parallax-navigation'), width, totalWidth;

// Set the parallax content & item width in window resize ...
// ... so we can be sure that when the window is resized, the size of the elements will be updated too
$window.on("resize", function() {
width = $parallax.width(); // get the parallax wrapper width
totalWidth = width * $wrap.find('.box-item').length; // total width = (parallax wrapper width * box item length)
$wrap.width(totalWidth).find('.box-item').outerWidth(width);
}).trigger("resize");

// Collect all navigation item inside parallax navigation, then get their index to set the animation distance
$nav.find('a').each(function() {
// when user click on the navigation item
$(this).on("click", function() {
var step = $(this).index(); // get the index (0, 1, 2, 3, ...)
$nav.find('.active').removeClass('active'); // remove the active class from navigation item
$(this).addClass('active'); // add the active class to the clicked navigation item
$layer.each(function() {
// set the background-position per-animation distance of each layer ...
// ... based on its index
var distance = ($(this).index()+1) * 200; // multiplied by 200
$(this).stop().animate({backgroundPosition: '-' + (step*distance) + 'px 0px'}, 1500); // (jQuery background position plugin required)
});
// also, animate the `.box-item-wrapper` to the left to move the `.box-item`
$wrap.stop().animate({'left': -(step*width)}, 1500);
return false;
});
}).first().addClass('active'); // add active class to the first navigation item on initiation

})(jQuery);

Demo

Memperbaharui Pemuatan JSON berdasarkan Event Scroll

Sebuah kumpulan data dalam daftar akan menampilkan indikator sedang memuat dan akan memulai pemuatan data baru saat jarak gulungan telah mencapai titik maksimal
Sebuah kumpulan data dalam daftar akan menampilkan indikator sedang memuat dan akan memulai pemuatan data baru saat jarak gulungan telah mencapai titik maksimal

Metode ini masih sama dengan metode-metode penundaan pemuatan JSON yang biasa Saya lakukan untuk widget-widget Saya yaitu dengan cara menyisipkan script callback secara tidak langsung ke dalam area <head> dengan ID tertentu. Kemudian, jika Saya ingin memperbaharui muatan JSON yang sudah ada, Saya tinggal menyingkirkan script callback yang lama kemudian menggantinya dengan duplikat baru dengan parameter yang sudah diperbaharui.

Bayangkan saja bahwa sudah terdapat sebuah script callback dengan ID foo di dalam area <head> seperti ini:

...
...
<script id="foo" src="../feeds/posts/summary?alt=json-in-script&callback=functionName" type="text/javascript"></script>
</head>

Kemudian Saya akan menyingkirkannya dengan cara menangkap ID elemen tersebut sebagai awalan untuk menyeleksi node induknya:

var a = document.getElementById('foo');
var parent = a.parentNode; // Mendapatkan elemen induk dari `foo`

Kemudian, dari induk tersebut Saya akan menyingkirkan elemen itu sendiri:

var a = document.getElementById('foo');
var parent = a.parentNode; // Mendapatkan elemen induk dari `foo`
parent.removeChild(a); // Singkirkan `foo` dari `parent`

Di sini, kita akan melakukan pekerjaan di atas berdasarkan event onscroll dengan batasan akhir berupa jarak gulungan maksimal kontainer. Kode di bawah ini akan menjalankan fungsi bernama myFunction() berdasarkan event onscroll dengan syarat jarak gulungan telah mencapai titk maksimal:

elem.onscroll = function() {
if ((this.scrollTop + this.offsetHeight) == inner.offsetHeight) {
myFunction();
}
};

Dimana elem adalah objek berupa kontainer.

Memulai Pekerjaan

Markup HTML

Kita mulai dengan pembuatan markup HTML sederhana seperti ini:

<div id="result-container" style="width:400px;height:400px;overflow:auto;">
<ol></ol>
<span class="loading">Memuat...</span>
</div>

Elemen #result-container digunakan sebagai area scroll, elemen ol digunakan sebagai kontainer data yang nantinya akan dihasilkan dari JSON, dan elemen span.loading digunakan sebagai indikator sedang memuat.

Membangun JavaScript

Pertama-tama kita buat script untuk memparse data JSON menjadi elemen HTML. Sederhana, seperti script recent post biasa yang Saya beri nama grabList(), dan hanya akan menghasilkan elemen <li> dengan tautan dan judul posting di dalamnya:

var elem = document.getElementById('result-container'), // Mendapatkan elemen `#result-container`
inner = elem.getElementsByTagName('ol')[0], // Mendapatkan elemen `ol` pertama
loading = elem.getElementsByTagName('span')[0]; // Mendapatkan elemen `span` pertama (dalam hal ini adalah elemen indikator sedang memuat)

// Bangun sebuah script untuk menampilkan daftar posting
function grabList(json) {

var list = json.feed.entry, link, skeleton = "";

// Jalankan loop hanya jika data JSON masih ada/dapat didefinisikan
if (list !== undefined) {
for (var i = 0; i < list.length; i++) {
for (var j = 0; j < list[i].link.length; j++) {
if (list[i].link[j].rel == "alternate") {
link = list[i].link[j].href; // Mendapatkan URL posting
}
}

// Bangun beberapa elemen `<li>` yang berisi tautan dan judul posting...
skeleton += '<li><a href="' + link + '">' + list[i].title.$t + '</a></li>';

}

// ... kemudian sisipkan elemen tersebut ke dalam elemen `<ol>`
inner.innerHTML += skeleton;

// dan sembunyikan indikator sedang memuat.
loading.style.display = "none";

} else {

// Jika data JSON sudah tidak ada (list == undefined), tambahkan kelas baru kepada elemen indikator sedang memuat dengan nilai `the-end`
loading.className += ' the-end';

// kemudian ganti teks indikator sedang memuat dengan kata `Habis`
loading.textContent = 'Habis';

}
}

Setelah itu buat sebuah fungsi untuk memuat script callback secara tidak langsung. Tambahkan dua buah parameter untuk menangani start-index dan max-results:

function updateScript(i, max) {
var head = document.getElementsByTagName('head')[0],
script = document.createElement('script');
script.type = 'text/javascript';
script.id = 'load-on-scroll-end';
script.src = 'http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&start-index=' + i + '&max-results=' + max + '&callback=grabList';
head.appendChild(script);
}

// Jalankan fungsi!
updateScript(1, 25);

Fungsi di atas akan menyisipkan sebuah script callback JSON Blogger dengan nilai parameter start-index berupa 1 dan max-results berupa 25, sehingga sebuah elemen <script> dengan parameter yang sudah diatur akan disipkan ke dalam area <head> secara tidak langsung seperti ini:

...
...
...
<script id="load-on-scroll-end" src="http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&start-index=1&max-results=25&callback=grabList" type="text/javascript"></script>
</head>

Memperbaharui JSON Berdasarkan Jarak Maksimal Gulungan Area

Setelah itu kita tambahkan sebuah kondisional untuk menyingkirkan script callback lama jika script tersebut ada. Tidak perlu membuat fungsi baru, cukup gunakan fungsi tadi agar kita bisa menggunakannya untuk dua hal sekaligus, yaitu menyisipkan script baru dan/atau menyingkirkan script lama (jika ada):

function updateScript(i, max) {
var head = document.getElementsByTagName('head')[0],
script = document.createElement('script');
script.type = 'text/javascript';
script.id = 'load-on-scroll-end';
script.src = 'http://nama_blog.blogspot.com/feeds/posts/summary?alt=json-in-script&start-index=' + i + '&max-results=' + max + '&callback=grabList';
if (document.getElementById('load-on-scroll-end')) {
var oldScript = document.getElementById('load-on-scroll-end');
oldScript.parentNode.removeScript(oldScript);
}

head.appendChild(script);
}

updateScript(1, 25); // Jalankan fungsi!

Karena kita juga akan menjalankan fungsi updateScript() berdasarkan event onscroll, maka kita juga harus memasukkan updateScript() ke dalam event yang Saya tuliskan pertama kali:

elem.onscroll = function() {
if ((this.scrollTop + this.offsetHeight) == inner.offsetHeight) {
// Muat ulang JSON Blogger dengan `start-index` yang baru melalui parameter `i`
updateScript(i, 25);
// Kemudian tampilkan indikator sedang memuat
loading.style.display = "block";
}
};

Parameter i haru dinamis, dan harus bisa bertambah setiap kali gulungan kontainer berakhir. Untuk membuatnya menjadi dinamis, kita akan menggunakan variabel awalan dengan nilai 0, kemudian kita tingkatkan nilainya di dalam event onscroll setiap kali jarak gulungan telah mencapai titik maksimal:

var start = 0;
elem.onscroll = function() {
if ((this.scrollTop + this.offsetHeight) == inner.offsetHeight) {

// Tingkatkan nilai `start` dengan 1 (dari `start = 0` menjadi `start = 1`, `start = 2`, dst...)
start++;

// Muat ulang JSON Blogger dengan `start-index` yang telah diperbaharui...
// ... melalui `start` yang nilainya dikalikan dengan 25
updateScript(start*25, 25); // => dari `(1, 25)` menjadi `(25, 25)`, `(50, 25)`, `(75, 25)`, dst...

// Kemudian tampilkan indikator sedang memuat
loading.style.display = "block";

}
};

Produk Final

HTML

<div id="result-container">
<ol></ol>
<span class="loading">Memuat...</span>
</div>

CSS

#result-container {
height:400px;
width:400px;
overflow:auto;
margin:50px auto;
font:normal normal 12px 'Trebuchet MS',Trebuchet,Geneva,Arial,Sans-Serif;
}

#result-container ol {
margin:0 0;
padding:0 0;
background-color:#B5D68C;
}

#result-container li {
margin:0 0;
padding:0 0;
list-style:none;
}

#result-container li:nth-child(even) {background-color:#A2C179}

#result-container li a {
display:block;
padding:5px 10px;
font-weight:bold;
color:#396B18;
text-decoration:none;
}

#result-container li a:hover {
background-color:#396B18;
color:white;
text-decoration:none;
}

#result-container .loading {
display:block;
height:26px;
font:normal bold 11px/26px Arial,Sans-Serif;
color:white;
text-align:center;
background-color:#B75A6F;
border-top:2px solid #222;
}

#result-container .loading.the-end {background-color:#666}

JavaScript

var widget_config = {
home_page: 'http://nama_blog.blogspot.com', // Your blog homepage
container_id: 'result-container', // ID of the result container
script_id: 'load-on-scroll-end-script', // ID of the asynchronous script
max_result: 25, // Max result post at once script loading
end_text: 'Habis' // End text if all posts has been loaded
};

var elem = document.getElementById(widget_config.container_id),
inner = elem.getElementsByTagName('ol')[0],
loading = elem.getElementsByTagName('span')[0],
start = 0, // Dynamic start-index
max = widget_config.max_result;

function grabList(json) {
var list = json.feed.entry, link, skeleton = "";
if (list !== undefined) {
for (var i = 0; i < list.length; i++) {
for (var j = 0; j < list[i].link.length; j++) {
if (list[i].link[j].rel == "alternate") {
link = list[i].link[j].href;
}
}
skeleton += '<li><a href="' + link + '">' + list[i].title.$t + '</a></li>';
}
inner.innerHTML += skeleton; // Insert the list to the container
loading.style.display = "none"; // Hide the loading indicator
} else {
// If the JSON is empty (list == undefined),
// add a new class to the loading indicator called `the-end`
loading.className += ' the-end';
// Replace the loading indicator text into `fully loaded!` for the example
loading.textContent = widget_config.end_text;
}
}

// Make an indirect script loader with two parameters: start-index and max-result post
function updateScript(a, b) {
var head = document.getElementsByTagName('head')[0],
script = document.createElement('script');
script.type = 'text/javascript';
script.id = widget_config.script_id;
script.src = widget_config.home_page + '/feeds/posts/summary?alt=json-in-script&start-index=' + a + '&max-results=' + b + '&callback=grabList';
// If there is an old script in the document...
if (document.getElementById(widget_config.script_id)) {
var oldScript = document.getElementById(widget_config.script_id);
// Remove the old script, and replace with the new one that has an updated start-index value
oldScript.parentNode.removeChild(oldScript);
}
head.appendChild(script);
}

// Start loading the callback script with start-index of 1
updateScript(1, max);

// When the container is being scrolled...
elem.onscroll = function() {
// ... check the scroll distance
if ((this.scrollTop + this.offsetHeight) == inner.offsetHeight) {
// If the distance equal to the height of the inner container...
start++; // Increase the start value by one
// then load the new script with an updated start-index
updateScript(start*max, max);
// and show the loading indicator
loading.style.display = "block";
}
};

JavaScript untuk Mengecek Batas Akhir Gulungan Layar

Kode ini digunakan untuk mengecek apakah pengguna telah mencapai bagian akhir halaman atau tidak saat mereka sedang menggulung layar. Jika ya, lakukan sesuatu:

JavaScript

window.onscroll = function() {
if (navigator.userAgent.toLowerCase().indexOf("chrome") > -1 || navigator.userAgent.toLowerCase().indexOf("safari") > -1) {
if (document.documentElement.scrollHeight == (document.body.scrollTop + document.documentElement.clientHeight)) {
alert("End of the page!"); // for demonstration
}
} else {
if (document.documentElement.scrollHeight == (document.documentElement.scrollTop + document.documentElement.clientHeight)) {
alert("End of the page!"); // for demonstration
}
}
};

Demo

Catatan: Deklarasi <!DOCTYPE html> pada dokumen HTML harus dinyatakan.

Jump Link/Hash Tag Link dengan Jarak

Jump Link/Hash Tag Link dengan Jarak
h2[id]:before {
display:block;
content:"";
height:50px;
margin:-50px 0 0;
visibility:hidden;
}

Pembaharuan

Ternyata lebih efektif dan praktis yang ini, meskipun efeknya tidak begitu bagus jika Anda menambahkan warna latar pada setiap elemen heading:

/* Jarak atas diatur menjadi 30 piksel terhadap batas atas layar */
h1,h2,h3,h4,h5,h6 {
padding-top:30px;
margin-top:-30px;
}

Apa Itu Sticky Footer?

Non Sticky Footer
Efek yang timbul pada ujung halaman jika tinggi halaman lebih pendek dari tinggi layar.

Karena Saya lihat masih banyak yang salah paham dengan istilah Sticky Footer, jadi Saya akan membahasnya. Kebanyakan orang menganggap bahwa sticky footer itu artinya footer menempel di bawah layar dan akan tetap berada pada posisinya meskipun layar digulung.

Baiklah, memang bisa dibilang begitu, mengingat kata 'stick' juga berarti 'menempel'. Tapi bukan seperti itu pengertian sticky footer yang sebenarnya. Sticky Footer maksudnya adalah footer akan tetap berada di bawah layar meskipun tinggi halaman/dokumen lebih pendek dari tinggi layar. Sticky Footer digunakan untuk memastikan agar tampilan halaman yang rendah tidak tampak jelek saat berada pada device yang ukuran layarnya lebih tinggi dari ukuran halaman.

Berikut ini adalah sebuah demonstrasi footer biasa dimana di atasnya hanya terdapat beberapa teks, sehingga tinggi halaman tidak mampu meraih bagian bawah:

Bisa Anda lihat bahwa footer tampak menggantung di atas dan menjadikannya tidak menarik. Nah, Sticky Footer berguna untuk mengatasi masalah ini, untuk memastikan agar footer tetap berada di bawah meskipun tinggi halaman lebih rendah dari tinggi layar. Ini adalah contoh sticky footer:

Anda lihat bahwa meskipun tinggi halaman/dokumen lebih pendek dari tinggi layar, CSS Sticky Footer tetap menjaga agar halaman menekan ke sisi atas dan sisi bawah (dengan menggunakan ukuran tinggi dominan sebesar 100% pada masing-masing elemen) sehingga tidak akan ada ruang kosong yang tersisa di bagian bawah.

Masih Belum Yakin dengan Istilah Sticky Footer?

Cek situs ini ⇒ http://www.cssstickyfooter.com/

Pada bagian prolog sudah jelas tertulis, "It Sticks to the Bottom of the Page!", bukan "It Sticks to the Bottom of the Window!"

Dan ini adalah halaman demonstrasi tampilan footer biasa beserta masalahnya, yang juga terdapat pada sub-halaman dari situs tersebut: http://www.cssstickyfooter.com/non-stick-footer.html

Sticky Footer bukan berarti bahwa footer melayang di bawah layar. Sticky Footer lebih tepat dikatakan sebagai metode untuk memastikan footer tetap berada di bawah halaman meskipun tinggi halaman lebih pendek dari tinggi layar.
Sticky Footer hanya akan terlihat efeknya jika tinggi halaman lebih pendek dari tinggi layar. Jika tinggi halaman tidak lebih pendek dari tinggi layar (atau katakanlah: Jika Anda bisa memastikan bahwa halaman situs Anda tidak pernah lebih pendek dari tinggi layar), maka Anda tidak perlu menggunakan Sticky Footer.

Saat tinggi halaman sudah melebihi tinggi layar, maka efek Sticky Footer akan menghilang. Dan CSS Sticky Footer sudah tidak ada gunanya lagi saat itu:


CSS & HTML Sticky Footer

HTML

<div id="wrap">
<section id="main"> ... </section>
</div>
<footer id="footer"></footer>

CSS

/**  
* Sticky Footer Solution
* by Steve Hatcher
* http://stever.ca
* http://www.cssstickyfooter.com
*/

* {margin:0;padding:0;}

/* Must declare 0 margins on everything, also for main layout components use padding, not vertical margins (top and bottom) to add spacing, else those margins get added to total height and your footer gets pushed down a bit more, creating vertical scroll bars in the browser */

html, body {
height:100%;
}

#wrap {
min-height:100%;
}

#main {
overflow:auto;
padding-bottom:180px; /* must be same height as the footer */
}

#footer {
position:relative;
margin-top:-180px; /* negative value of footer height */
height:180px;
clear:both;
}

/* Opera Fix */
body:before { /* thanks to Maleika (Kohoutec)*/
content:"";
height:100%;
float:left;
width:0;
margin-top:-32767px; /* thank you Erik J - negate effect of float */
}

Tambahan Untuk Internet Explorer

<!--
You also need to include this conditional style in the <head> of your HTML file
to feed this style to IE 6 and lower and 8 and higher...
-->

<!--[if !IE 7]>
<style type="text/css">
#wrap {display:table;height:100%}
</style>
<![endif]-->

StickyBar JQuery Plugin

StickyBar is a JQuery plugin to make the element keep stayed in the visible area when the page is being scrolled.

StickyBar JQuery Plugin
StickyBar JQuery Plugin

StickyBar adalah plugin JQuery untuk membuat elemen selalu berada pada tempat yang terlihat. Anda mungkin pernah melihat plugin semacam ini di luar sana. Jenisnya memang ada banyak, tapi mereka memiliki beberapa keterbatasan dalam segi opsi dan keamanan. Di sini Saya telah memberikan opsi-opsi penting tambahan yang lebih lengkap dan juga mencoba untuk menerapkan metode yang lebih aman:

Sebagian besar plugin sejenis hanya menerapkan posisi fixed pada elemen ketika elemen telah mencapai batas akhir area terlihat pada layar dan melepaskan posisinya jika elemen telah berada pada posisi awal. Bisa dilihat pada salah satu potongan kode yang pernah Saya catat di sini.
Padahal, menerapkan posisi fixed secara mendadak pada elemen bisa menyebabkan struktur elemen di sekelilingnya menjadi rusak/berantakan disebabkan ruangan tempat elemen yang menjadi target telah kosong.

Ini terjadi karena perpindahan posisi elemen termanipulasi secara mendadak dari posisi static yang memakan ruang menjadi posisi fixed yang tidak memakan ruang.

Saat elemen termanipulasi berubah menjadi fixed, maka elemen-elemen di sekelilingnya akan berloncatan berusaha menutupi kekosongan. Selain itu, posisi elemen static yang berubah menjadi fixed juga akan mengalami perubahan posisi dalam segi koordinat (terutama posisi atas dan kiri) sehingga kita akan membutuhkan lebih banyak perhitungan untuk itu. Intinya: terlalu rumit!

Lalu bagaimana kita bisa mengubah posisi elemen menjadi melayang tanpa harus menghilangkan ruang asal elemen? Caranya adalah dengan memperbaharui nilai top secara terus-menerus berdasarkan jarak gulungan layar. Cara ini akan membuat elemen seolah-olah melayang:

Metode yang sama juga Saya pakai untuk menciptakan plugin ini. Keuntungannya, kita tidak perlu khawatir dengan keadaan posisi elemen di sekitar target jika target telah mengalami manipulasi, karena di sini plugin akan memanipulasi posisi elemen dengan tetap menjaga jenis posisinya sebagai posisi relative, sehingga betatapun jauh elemen berpindah dari elemen-elemen lain, dia tidak akan mengganggu posisi elemen yang lain dan tidak akan mengosongkan ruang asalnya. (Ingat: top, right, bottom dan left berbeda dengan margin-top, margin-right, margin-bottom dan margin-left).

Pembaharuan: Saya memutuskan untuk menggunakan posisi fixed asli pada plugin ini karena beberapa kekurangan yang terjadi, namun tetap mempertahankan posisi fixed palsu untuk opsi StickyBar dengan efek animasi.


Konfigurasi Plugin StickyBar

Letakkan JQuery, plugin StickyBar dan kode eksekusi di atas </head> dengan susunan seperti ini, dan selesai sudah:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="http://hompimpa.googlecode.com/svn/trunk/StickyBar/js/jquery.stickybar.min.js"></script>
<script type="text/javascript">
$(function() {
$('#sidebar').stickyBar();
});
</script>

Opsi Lanjutan

Terdapat beberapa opsi lanjutan pada plugin ini:

$('#sidebar').stickyBar({
animated: false,
speed: 400,
easing: null,
top: 0,
bottom: 0,
until: "",
fixedClass: 'isFixed',
stoppedClass: 'isStopped',
onFixed: function() {},
onStatic: function() {},
onStopped: function() {}
});
OpsiKeterangan
topDigunakan untuk menentukan jarak atas elemen melayang (sticky element)
bottomDigunakan untuk menentukan jarak bawah elemen termanipulasi terhadap elemen penghenti. Secara umum tidak terlalu penting, jadi abaikan saja jika tidak perlu.
animatedJika bernilai true, elemen akan melayang dengan efek animasi. Demonya bisa dilihat di sini
speedDigunakan untuk menentukan kecepatan animasi jika opsi animated bernilai true
easingDigunakan untuk menentukan tipe easing JQuery. Demonya bisa dilihat di sini. Saya memakai tipe easing "easeOutElastic"
untilDigunakan untuk menentukan elemen penghenti posisi melayang pada elemen termanipulasi. Sehingga jika elemen melayang telah menyentuh elemen penghenti, maka elemen tersebut akan berhenti melayang. Jika bingung Anda bisa melihat contoh penerapannya di sini
fixedClassDigunakan untuk menentukan nama kelas elemen termanipulasi saat elemen tersebut berada dalam kondisi fixed.
stoppedClassDigunakan untuk menentukan nama kelas elemen termanipulasi saat elemen tersebut terhenti karena suatu elemen penghenti di bawahnya.
onFixedCallback fungsi yang akan dijalankan jika elemen termanipulasi berada dalam kondisi fixed.
onStaticCallback fungsi yang akan dijalankan jika elemen termanipulasi kembali pada posisi normal.
onStoppedCallback fungsi yang akan dijalankan jika elemen termanipulasi terhenti karena suatu elemen penghenti di bawahnya.

Dua Macam Kelas Baru

Dua macam kelas baru akan diterapkan pada elemen yang dimanipulasi berdasarkan keadaannya, yaitu kelas isFixed dan isStopped. Anda bisa menggunakan kelas-kelas tersebut untuk membedakan tampilan elemen saat berada dalam keadaan normal, keadaan melayang atau dalam keadaan terhenti oleh elemen penghenti melalui CSS:

.isFixed {
/* Kode CSS tampilan elemen melayang... */
}
.isStopped {
/* Kode CSS tampilan elemen terhenti... */
}

Atau, Anda juga bisa menentukan sendiri nama kelas-kelas tersebut melalui opsi fixedClass dan stoppedClass:

$('#sidebar').stickyBar({
fixedClass: 'my-fixed-class',
stoppedClass: 'my-stopped-class'
});

Efek pembedaan tanda berdasarkan keadaan elemen bisa Anda lihat dengan mudah pada demo StickyBar - Limit

Demo Lain

Lakukan Sesuatu Jika Elemen Mencapai Area Terlihat

JavaScript/JQuery, do something if the element reaches the visible area on the window.

Kode ini digunakan untuk mengeksekusi suatu perintah jika elemen telah mencapai area terlihat pada layar. Semacam prinsip yang biasanya digunakan pada plugin-plugin lazyLoader gambar dan infiniteScroll:

function isScrolledIntoView(elem) {
var $window = $(window),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $(elem).offset().top,
elemBottom = elemTop + $(elem).outerHeight();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}

Sampel Penggunaan

Umumnya digunakan dalam peraturan kondisi seperti ini:

if (isScrolledIntoView('#element')) {
$('#element').addClass('here-it-is');
}

Penggunaan pada Elemen Banyak

$('div').each(function() {
if (isScrolledIntoView(this)) {
$(this).addClass('here-it-is');
} else {
$(this).removeClass('here-it-is');
}
});

Contoh Lain: Image Lazy Loader

HTML

<img src="" alt="Loading..." data-src="images/image-1.jpg">
<img src="" alt="Loading..." data-src="images/image-2.jpg">
<img src="" alt="Loading..." data-src="images/image-3.jpg">
<img src="" alt="Loading..." data-src="images/image-4.jpg">

JQuery

$(window).on("scroll", function() {
$('img').each(function() {
if (isScrolledIntoView(this)) {
$(this).attr('src', $(this).data('src')).removeAttr('data-src');
}
});
});

Modifikasi Tombol Back-to-Top menjadi Auto-Hide

Gambar Tombol Back to Top

Seseorang pernah menanyakan tentang bagaimana cara membuat tombol smooth scroll back to top yang bisa tersembunyi saat halaman belum digulung, dan saat halaman mulai digulung, tombol tersebut akan muncul.

Kita tahu bahwa dasar pembuatan tombol back-to-top adalah dengan cara menganimasikan properti scrollTop menuju 0 seperti ini:

$('#top-nav').click(function() {
$('html, body').animate({scrollTop:0}, 1000);
return false;
});

Pada dasarnya elemen tombol/navigasi kembali-ke-atas tersebut sudah bisa berfungsi, hanya saja mungkin beberapa dari kalian tidak suka atau merasa terganggu dengan gambar aneh yang selalu melayang-layang di sebelah bawah.
Di sini kita akan membuatnya menjadi AutoHide. Sehingga navigasi tersebut hanya akan tampil jika dibutuhkan, sedangkan saat tidak dibutuhkan, maka dia akan bersembunyi (Seperti pahlawan super).

Dengan menggunakan JQuery .scrollTop() kita akan menciptakan kodisi yang kira-kira berbunyi seperti ini:

Jika jarak gulungan layar telah mencapai titik N, tampilkan navigasi kembali-ke-atas, namun jika gulungan layar tidak mencapai pada titik N, sembunyikan navigasi.

if($(window).scrollTop() > 200) {
$('#top-nav').show();
} else {
$('#top-nav').hide();
}

Dan agar kondisi tersebut bisa terus diperbaharui seiring berjalannya aktivitas penggulungan viewport, maka kita harus memasukkannya ke dalam event .scroll() seperti ini

$(window).scroll(function() {
if($(this).scrollTop() > 200) {
$('#top-nav').show();
} else {
$('#top-nav').hide();
}
});

Proses identifikasi kondisi di atas akan selalu bekerja setiap kali layar digulung. Saat layar sedang digulung, cek apakah jarak gulungan layar sudah mencapai lebih dari 200 atau belum. Jika nilainya sudah melebihi 200, tampilkan navigasi kembali-ke-atas. Namun jika sebaliknya, sembunyikan navigasi kembali-ke-atas:

// Saat layar sedang digulung, cek apakah jarak gulungan layar sudah mencapai lebih dari 200 atau belum.
// Jika nilainya sudah melebihi 200, tampilkan tombol #top-nav
// Namun jika sebaliknya, sembunyikan tombol #top-nav
$(window).scroll(function() {
if($(this).scrollTop() > 200) {
$('#top-nav').show();
} else {
$('#top-nav').hide();
}
});

// Sembunyikan penampilan tombol pada saat keadaan masih normal dengan JQuery .hide()
// Saat tombol kembali-ke-atas diklik, animasikan nilai scrollTop menuju 0 dengan durasi selama 1000ms
$('#top-nav').hide().click(function() {
$('html, body').animate({scrollTop:0}, 1000);
return false;
});

Untuk mempercantik efek, Anda bisa menggunakan kombinasi efek-efek umum JQuery seperti fadeIn() dan .fadeOut(), .slideDown() dan .slideUp() atau bahkan kalau mau Anda juga bisa menciptakan efek animasi sendiri. Di sini Saya memberikan contoh menggunakan efek .fadeIn() dan .fadeOut():

HTML

<a href='#' id='top-nav' title='Kembali ke atas!'>
<img src='back-to-top.png' />
</a>

CSS

#top-nav {
position:fixed !important;
position:absolute; /* IE6 Fallback */
bottom:10px;
right:10px;
z-index:999;
}

JQuery

$(window).scroll(function() {
if($(this).scrollTop() > 200) {
$('#top-nav').fadeIn();
} else {
$('#top-nav').fadeOut();
}
});

$('#top-nav').hide().click(function() {
$('html, body').animate({scrollTop:0}, 1000);
return false;
});

Menyembunyikan Scroll Bar dengan CSS, namun Tetap Mempertahankan Fungsi Scroll

sidebar

Ini adalah teknik sederhana untuk menyembunyikan scrollbar tanpa membuat area menjadi tidak bisa digulung. Dengan mendeklarasikan margin negatif pada sisi kanan area, maka scrollbar secara otomatis akan tersembunyi jauh di sebelah kanan sana. Dan kita masih bisa menggulung area dengan mouse wheel atau... layar sentuh mungkin?

HTML

<div class='hidden-scrollbar'>
<div class='inner'>
Teks atau sesuatu yang panjang di sini...
</div>
</div>

CSS

.hidden-scrollbar {
background-color:black;
border:2px solid #666;
color:white;
overflow:hidden;
text-align:justify;
}

.hidden-scrollbar .inner {
height:200px;
overflow:auto;
margin:15px -300px 15px 15px;
padding-right:300px; /* Samakan dengan besar margin negatif */
}

Set Ukuran Elemen Satu Layar Penuh dengan JQuery

$('#overlay').css({
width: $(window).width(),
height: $(window).height()
});

Lebar Mengikuti Ukuran Layar Saat Layar Berubah Ukuran

function elasticWidth() {
$('#overlay').css({
width: $(window).width(),
height: $(window).height()
});
} elasticWidth();

$(window).resize(function() {
elasticWidth();
});

JQuery .scrollTop() dan .scrollLeft()

JQuery .scrollTop() dan .scrollLeft()

.scrollTop() digunakan untuk mengambil data mengenai seberapa jauh Anda telah menggulung layar ke bawah.
.scrollLeft() digunakan untuk mengambil data mengenai seberapa jauh Anda telah menggulung layar ke kanan.
Selain mengambil data, fungsi tersebut juga dapat digunakan untuk memposisikan halaman pada jarak gulungan tertentu.


Dasar Penggunaan

Kode di bawah ini akan mengambil data mengenai seberapa jauh elemen <div> telah tergeser ke atas oleh scroll bar dan menyimpannya ke dalam variabel scrTop:

var scrTop = $('div').scrollTop();

Kode di bawah ini akan mengambil data mengenai seberapa jauh elemen <div> telah tergeser ke samping oleh scroll bar dan menyimpannya ke dalam variabel scrLeft:

var scrLeft = $('div').scrollLeft();

Pada umumnya, metode ini digunakan untuk menjalankan perintah apabila sebuah halaman telah discroll sampai pada titik tertentu. Seperti halnya navigasi back to top (baca di sini), saat Anda telah menggulung layar sampai pada titik tertentu, maka navigasi back to top akan ditampilkan dengan efek .fadeIn():

Navigasi Back to Top
Navigasi Back to Top


Di sini Saya akan memberikan contoh bagaimana sebuah perintah dijalankan apabila sebuah area telah discroll sampai pada titik tertentu:

HTML

<h2 id='indc' style='display:none;'>Hai! Nama Saya Taufik Nurrohman.</h2>
<div id='area'>
<div style='width:1000px;height:1000px;'></div>
</div>

CSS

#area {
background-color:black;
width:300px;
height:400px;
overflow:auto;
}

JQuery

$(function() {
$('#area').scroll(function() {
// Jika posisi scroll bar vertikal #area telah lebih besar dari 200...
if($(this).scrollTop() > 200) {
// tampilkan elemen <h2 id='indc'>Hai! Nama Saya Taufik Nurrohman.</h2>
// dengan efek .slideDown()
$('h2#indc').slideDown();
// Dan jika posisi scroll bar horizontal #area sama dengan 200...
} else if($(this).scrollLeft() == 200) {
// Tampilkan peringatan "Hai! Nama Saya Taufik Nurrohman!"
alert("Hai! Nama Saya Taufik Nurrohman.");
} else {
// Jika yang terjadi adalah selain kondisi diatas,
// hilangkan elemen <h2 id='indc'>Hai! Nama Saya Taufik Nurrohman.</h2>
// dengan efek .slideUp()
$('h2#indc').slideUp();
}
});
});



Menerapkan Nilai Secara Langsung

Fungsi .scrollTop() dan .scrollLeft() juga bisa diterapkan untuk memposisikan area pada jarak scroll tertentu. Kode di bawah ini akan menggulung #area pada jarak gulungan vertikal sebesar 300 pada saat halaman diakses:

$(function() {
$('#area').scrollTop(300);
});

Satu Halaman Website Statis dengan Efek Sliding

One Page Dynamic Website

Setelah sukses mengeset ukuran elemen berdasarkan ukuran layar, sekarang adalah saatnya untuk menciptakan efek smooth scrolling pada halaman. Saya menggunakan plugin JQuery scrollTo untuk mempermudah pengerjaan. Ya, itu benar, karena cukup dengan plugin tersebut, menciptakan efek smooth scrolling dapat dilakukan hanya dengan menuliskannya seperti ini:

$('a').click(function() {
$('html, body').scrollTo($(this).attr('href'), 1000);
return false;
});

HTML

Buat sebuah berkas HTML dimana JQuery, JQuery scrollTo dan CSS eksternal telah disertakan di dalamnya:

<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Demo</title>
<link rel='stylesheet' href='style.css' type='text/css'>
<script src='jquery-1.7.1.min.js' type='text/javascript'></script>
<script src='scrollTo.js' type='text/javascript'></script>
<script type='text/javascript'>
$(function() {
// Pekerjaan kita di sini...
});
</script>
</head>
<body>

<!-- halaman -->
<div id='wrap'>
<div class='box' id='home'>
<h3>Home</h3>
</div>
<div class='box' id='contact'>
<h3>Contact</h3>
</div>
<div class='box' id='fun'>
<h3>For Fun</h3>
</div>
<div class='box' id='about'>
<h3>About</h3>
</div>
<div class='box' id='website'>
<h3>Website</h3>
</div>
<div class='box' id='skill'>
<h3>Skills</h3>
</div>
</div>

<!-- navigasi -->
<ul id='nav'>
<li><a class='active' href='#home'>Home</a></li>
<li><a href='#website'>Website</a></li>
<li><a href='#fun'>For Fun</a></li>
<li><a href='#about'>About</a></li>
<li><a href='#skill'>Skills</a></li>
<li><a href='#contact'>Contact</a></li>
</ul>
</body>
</html>

Penerapan JQuery ScrollTo

Melanjutkan dari kode pada tutorial sebelumnya, di sini Saya telah mengubah script ini:

$('#nav a').click(function() {
$('#nav a.active').removeClass('active');
$(this).addClass('active');
});

Menjadi seperti ini untuk menjalankan animasi .scrollTo():

$('#nav a').click(function() {
$('#nav a.active').removeClass('active');
$(this).addClass('active');
$('html, body').scrollTo($(this).attr('href'), 1000);
return false;
});

Lebih Lengkap:

$(function() {

// Hilangkan scrollbar
$('html, body').css('overflow', 'hidden');

function updateSize() {
var winWidth = $(window).width(),
winHeight = $(window).height(),
wrapSum = $('.box').siblings().length;
$('#wrap').css({
width:winWidth*(wrapSum/2),
height:winHeight*(wrapSum/3)
});
$('.box').css({
width:winWidth,
height:winHeight
});
} updateSize();

$(window).resize(function() {
updateSize();
});

// Gunakan plugin JQuery scrollTo untuk menciptakan efek smooth scrolling
$('#nav a').click(function() {
$('a.active').removeClass('active');
$(this).addClass('active');
$('html, body').scrollTo($(this).attr('href'), 1000);

// Cegah link mengakses halaman dari atributnya
return false;
});

});

Tanpa plugin scrollTo, menu masih dapat berfungsi dengan baik untuk meloncatkan halaman/seksi pada pandangan user dengan tepat. Hanya saja, efek animasi tidak akan terjadi.
Saya tidak tahu banyak mengenai Mootools. Tapi pada intinya, Mootools dan JQuery adalah dua konsep yang sama:

Mootools = JavaScript Library = JQuery

Lebar dan Tinggi Elemen Dinamis berdasarkan Perubahan Ukuran Layar


Set Ukuran Lebar dan Tinggi Elemen secara Dinamis berdasarkan Ukuran Layar

Mengeset ukuran lebar dan tinggi elemen sesuai dengan ukuran layar memang mudah, namun menciptakan ukuran elemen berjumlah banyak dengan ukuran lebar dan tinggi masing-masing yang sama dengan layar tidak akan semudah itu. Kita membutuhkan elemen pembungkus dengan ukuran yang disesuaikan dengan jumlah elemen dan beberapa pembagian yang telah ditentukan untuk menciptakan kolom-kolom yang tepat.
Di sini Saya akan menunjukkan bagaimana cara Melissa Hie menciptakan kolom-kolom dengan ukuran yang cukup proporsional dengan lebar dan tinggi layar browser. Meskipun ia bilang bahwa situs yang ia buat diciptakan dengan Motools, tapi Saya bisa membuat konsep tipografinya dengan JQuery. Yang kita butuhkan pada dasarnya hanyalah mengambil data lebar dan tinggi layar, serta jumlah elemen .box untuk kalkulasi ukuran #wrap:


HTML

<div id='wrap'>
<div class='box' id='home'>
<h3>Home</h3>
</div>
<div class='box' id='contact'>
<h3>Contact</h3>
</div>
<div class='box' id='fun'>
<h3>For Fun</h3>
</div>
<div class='box' id='about'>
<h3>About</h3>
</div>
<div class='box' id='website'>
<h3>Website</h3>
</div>
<div class='box' id='skill'>
<h3>Skills</h3>
</div>
</div>

<ul id='nav'>
<li><a class='active' href='#home'>Home</a></li>
<li><a href='#website'>Website</a></li>
<li><a href='#fun'>For Fun</a></li>
<li><a href='#about'>About</a></li>
<li><a href='#skill'>Skills</a></li>
<li><a href='#contact'>Contact</a></li>
</ul>

CSS

#wrap {
position:absolute;
top:0px;
left:0px;
}

h3 {
margin:70px 30px;
font:normal 22px Arial,Sans-Serif;
color:#fff;
color:rgba(255,255,255,0.7);
}

.box {
width:50%;
height:50%;
float:left;
background-color:#ccc;
}

#home {background-color:#2f2f2f;}
#website {background-color:#00A7E2;}
#fun {background-color:#EE9A10;}
#about {background-color:#DD1F8E;}
#skill {background-color:#620294;}
#contact {background-color:#84C922;}

ul#nav {
width:100%;
height:30px;
background:#000;
position:fixed;
top:0px;
left:0px;
}

ul#nav li {
display:inline;
float:left;
}

ul#nav li a {
font:bold 10px Arial,Sans-Serif;
text-decoration:none;
color:#999;
display:block;
padding:8px 15px;
}

ul#nav li a:hover, ul#nav li a.active {
color:#fff;
}

JQuery

$(function() {
// Hilangkan scrollbar dengan JQuery.
// Jika JQuery gagal terpanggil, halaman masih bisa digeser dengan scrollbar seperti biasa
$('html, body').css('overflow', 'hidden');

function updateSize() {
var winWidth = $(window).width(), // Ambil data lebar layar
winHeight = $(window).height(), // Ambil data tinggi layar
wrapSum = $('.box').siblings().length; // Hitung semua elemen .box (hasilnya: wrapSum=6)

// Set ukuran .box agar sama dengan ukuran layar
$('.box').css({
width:winWidth,
height:winHeight
});

// Set lebar #wrap sebesar tiga kali lebar .box (tiga kali lebar layar) dan tinggi sebesar dua kali tinggi .box (dua kali tinggi layar)
// Saya membaginya jumlahnya (wrapSum) menjadi dua dan tiga,
// karena Saya ingin hanya ada tiga .box dalam satu baris dan dua .box dalam satu kolom
$('#wrap').css({
width:winWidth*(wrapSum/2),
height:winHeight*(wrapSum/3)
});
}
// Jalankan fungsi secara default
updateSize();

$(window).resize(function() {
// Saat ukuran layar diubah, jalankan fungsi kembali
// untuk memastikan bahwa ukuran elemen akan terus ter-update/diperbaharui
updateSize();
});

// Menambahkan class 'active' pada menu yang diklik
$('ul#nav a').click(function() {
$('ul#nav a.active').removeClass('active');
$(this).addClass('active');
});
});

Ini baru dasarnya saja, yaitu tentang bagaimana cara mengeset ukuran lebar dan tinggi elemen berdasarkan ukuran layar. Untuk selanjutnya, efek smooth scrolling bisa dibuat dengan menerapkan plugin JQuery scrollTo:

Mengecek Ukuran Viewport dengan JQuery

Mengetahui lebar dan tinggi layar browser

Hal ini tentunya sangat bermanfaat bagi para pemakai template dengan tema responsif. Setidaknya, dengan cara ini Anda bisa mengetahui lebar dan tinggi viewport dengan cepat. Tutorial ini sekaligus juga untuk menjelaskan secara singkat tentang event .resize() yang belum sempat Saya tuliskan di artikel event-event dasar JQuery:

HTML

Letakkan kode ini di atas </body>:

<div id='viewport-checker'>
<ul>
<li id='width'></li>
<li id='height'></li>
</ul>
</div>

CSS

Letakkan kode ini di atas kode ]]></b:skin> atau </style>:

#viewport-checker {
width:200px;
height:auto;
text-align:left;
background-color:#333;
padding:0;
border:2px solid #e6e6e6;
font:italic bold 16px/1.4 Cambria,Georgia,Serif;
color:#eee;
text-shadow:0 1px 1px #000;
position:fixed !important;
position:absolute;
top:-100px;
left:50%;
margin:0 0 0 -108px;
-webkit-box-shadow:0 1px 3px rgba(0,0,0,.7);
-moz-box-shadow:0 1px 3px rgba(0,0,0,.7);
box-shadow:0 1px 3px rgba(0,0,0,.7);
z-index:1000;
display:none;
}

#viewport-checker ul,
#viewport-checker li {
margin:0;
padding:0;
border:none;
list-style:none;
}

#viewport-checker li {
border-top:1px solid #444;
border-bottom:1px solid #222;
padding:10px 15px;
list-style:none;
}

#viewport-checker li b {color:#74AE3D}

JQuery

Pastikan bahwa template Anda sudah dilengkapi dengan JQuery. Setelah itu letakkan script ini di bawahnya:

<script type='text/javascript'>
$(document).ready(function() {
$(window).resize(function() {
var vPortWidth = $(window).width(), //mengambil data lebar layar
vPortHeight = $(window).height(); //mengambil data tinggi layar

//menampilkan keterangan lebar dan tinggi layar saat ukuran layar diubah
$('#viewport-checker').animate({opacity:"show", top:"50px"}, 600);
$('#viewport-checker #width').html('Lebar: ' + vPortWidth);
$('#viewport-checker #height').html('Tinggi: ' + vPortHeight);
});

//menyembunyikan keterangan lebar dan tinggi layar saat pointer meninggalkan kotak keterangan
$('#viewport-checker').mouseleave(function() {
$(this).animate({opacity:"hide", top:"-100px"}, 100);
});
});
</script>

Simpan perubahan.

CSS Media Queries

CSS Media Queries

Bagaimana Media Queries Bekerja

Mungkin beberapa dari Anda masih belum mengenal tentang media queries, jadi mari kita mulai dengan sesuatu yang sangat sederhana. Kunjungi halaman di bawah ini lalu perkecil ukuran layar browser sedikit demi sedikit dan perhatikan!

Seperti yang telah Anda lihat bahwa ukuran layar dapat mengubah warna halaman. Itulah fungsi media queries, yaitu untuk memanipulasi CSS sesuai dengan kondisi layar peramban. Namun, bukan itu fungsi utama dari media queries. Media queries tidak hanya dapat mengubah warna halaman, tetapi juga dapat mengubah layout sebuah website. Dan itu artinya, Anda dapat menciptakan tampilan website sesuka hati Anda dengan mempertimbangkan ukuran viewport yang mungkin akan pengunjung gunakan. Hal ini memungkinkan Anda untuk menciptakan tampilan website yang dinamis, yang dapat menyesuaikan diri dengan tempat dimana website tersebut dibuka. Apakah itu dari komputer, smartphone, tablet, apapun itu:

Contoh Nyata Media Queries

Memulai Konsep

Hal pertama yang harus Anda lakukan adalah membuat konsep sebuah website. Tidak perlu terlalu rumit, pastikan saja Anda menciptakan template yang lengkap dan umum, yang terdiri dari sebuah header, navigasi, artikel, sidebar dan footer. Misalnya seperti ini:

HTML

<div id='outer-wrapper'>

<div id='header-wrapper'>
<h1>HEADER WEBSITE</h1>
</div>

<div id='nav'>
<ul>
<li><a href='#'>Home</a></li>
<li><a href='#'>Archive</a></li>
<li><a href='#'>About</a></li>
<li><a href='#'>Contact</a></li>
</ul>
</div>

<div id='content'>
<div id='main-wrapper'>
ARTIKEL DI SINI...
</div>

<div id='sidebar-wrapper'>
WIDGET DI SINI...
</div>
<div class='clear'></div>
</div> <!-- end content -->

<div id='footer-wrapper'>
Copyright 2011 - Taufik Nurrohman
</div>

</div> <!-- end outer-wrapper -->

CSS

h1,h2,h3,h4,h5,h6,ul,ol,li {
margin:0 0 0 0;
padding:0 0 0 0;
border:none;
}

body {
background:#fff;
margin:0;padding:0;
text-align:center;
font:normal normal 70% Arial,Sans-Serif;
}

#outer-wrapper {
width:1030px;
margin:0 auto 0;
text-align:left;
background:#ddd;
}

#header-wrapper {
padding:2%;
margin:0;
display:block;
background:#666;
}

#nav {
background:#999;
font:normal normal 1em Arial,Sans-Serif;
overflow:hidden;
}

#nav ul {
margin:0;
padding:0;
height:auto;
}

#nav ul li {
margin:0;
float:left;
display:inline;
list-style:none;
}

#nav ul li a {
display:block;
padding:5px 10px;
background:#999;
color:#fff;
}

#nav ul li a:hover {
background:#888;
text-decoration:none;
}

#content {
clear:both;
display:block;
}

#main-wrapper {
width:71%;
padding:2%;
word-wrap:break-word;
overflow:hidden;
float:left;
display:inline;
background:#eee;
}

#sidebar-wrapper {
width:21%;
padding:2%;
word-wrap:break-word;
overflow:hidden;
float:right;
display:inline;
background:#ddd;
}

#footer-wrapper {
padding:2%;
clear:both;
display:block;
background:#666;
}

.clear {clear:both}

Di sini saya mengeset lebar #outer-wrapper sebesar 1030px lalu mengeset ukuran #sidebar-wrapper dan #main-wrapper menggunakan persentase. Perhitungan persentase sebuah tampilan website yang ideal dapat Anda pelajari di sini.

Menerapkan Media Queries

Buatlah beberapa peraturan yang tegas:

  • Saat ukuran layar telah mencapai 1030 piksel, set lebar #outer-wrapper menjadi 100%. Hal ini akan membuat template menjadi mudah beradaptasi dengan viewport yang lebih sempit dari 1030 piksel.
  • Saat lebar viewport lebih kecil dari 600 piksel, set posisi #main-wrapper dan #sidebar-wrapper menjadi elemen blok dalam satu kolom.

Menuliskan lebar sebesar 100% akan mempermudah template dalam beradaptasi, karena persentase tidak diukur berdasarkan keadaan elemen, melainkan berdasarkan tempat dimana elemen tersebut berada. Harap diingat pula beberapa deklarasi penting yang harus Anda terapkan saat menciptakan layout satu kolom.
Seperti yang kita tahu, bahwa untuk menciptakan kolom, deklarasi yang umum digunakan adalah float:left atau float:right, display:inline dan width:N. Maka saat Anda ingin menciptakan layout satu kolom dari elemen yang tadinya berupa dua kolom, hal yang terpenting yang harus Anda lakukan pertama kali adalah netralisasi float dan display. Setelah itu set lebar elemen menjadi auto agar lebar elemen bisa menyesuaikan diri. Setelah itu terserah Anda:

@media screen and (max-width:1030px) {
#outer-wrapper {
width:100%;
}
}

@media screen and (max-width:600px) {
#sidebar-wrapper,
#main-wrapper {
float:none;
display:block;
width:auto;
padding:5%;
}
}

Gambar Responsif

Untuk membuat gambar menjadi responsif, Anda bisa menambahkan kode ini dalam CSS:

img {
max-width:100%;
height:auto;
width:auto\9; /* IE8 */
}

Hal yang sama juga bisa Anda lakukan untuk embed video dan iframe:

embed,object,iframe {
width:100%;
height:auto;
min-height:300px;
}

Meta Tag Skala pada Perangkat Seluler

Secara normal, perangkat seluler yang canggih akan memperkecil skala halaman website saat dibuka. Dengan menggunakan meta tag ini, perangkat tersebut tidak akan menyesuaikan skala halaman dan akan menerapkan skala seperti apa adanya:

<meta content='width=device-width, initial-scale=1, maximum-scale=1' name='viewport'/>

Orientasi Viewport

Jika Anda menggunakan tablet atau iPhone maka orientasi dapat berubah secara otomatis dari portrait menjadi landscape atau sebaliknya saat Anda memutarnya. Saya tidak tahu apakah komputer Anda memiliki fasilitas hebat seperti itu atau tidak. Jadi, sekarang coba balik komputer Anda dan lihat apakah orientasinya berubah? :))

@media screen and (orientation:portrait) {
/* Tampilan Portrait Website Anda */
}

@media screen and (orientation:landscape) {
/* Tampilan Landscape Website Anda */
}

Masalah Background Image yang terlalu Besar

Tidak seperti gambar pada umumnya, background-image tidak bisa responsif, karena dia adalah gambar yang hanya dijadikan sebagai background sebuah objek, bukan dijadikan sebagai objek itu sendiri. Untuk membuat background-image menjadi responsif, gunakan CSS background-size. Misalnya, di sini Saya akan mengubah skala background menjadi 80% dari ukuran sesungguhnya saat lebar viewport berada pada 480 piksel:

@media screen and (max-device-width:480px) {
html,body {
-webkit-background-size:100% auto;
-moz-background-size:100% auto;
-ms-background-size:100% auto;
-o-background-size:100% auto;
background-size:100% auto;
}
}

Media Queries pada CSS Eksternal

Bla.. bla.. bla.... Saya yakin Anda sudah mengerti untuk yang satu ini:

<link rel='stylesheet' media='screen and (max-width: 600px)' href='600px-viewport.css'></link>

Max Width, Min Width, Multiple Media Queries

Max Width

Kode di bawah akan mulai mengubah penampilan saat lebar viewport berada pada maksimal 500 piksel dan di bawahnya:

@media screen and (max-width:500px) {
...
...
}

Min Width

Kode di bawah akan mulai mengubah penampilan saat lebar viewport berada pada minimal 500 piksel dan di atasnya:

@media screen and (min-width:500px) {
...
...
}

Multiple Media Queries

Kode di bawah ini akan mengubah penampilan apabila lebar viewport berada di antara 500 piksel dan 900 piksel:

@media screen and (min-width:500px) and (max-width: 900px) {
...
...
}

Device Width

Harap bedakan antara max-width dan max-device-width. max-width dihitung berdasarkan resolusi area, sedangkan max-device-width dihitung berdasarkan resolusi device:

@media screen and (max-device-width:1024px) {
...
...
}

Media Queries untuk Device Standar

/* Smartphone (portrait & landscape) */
@media only screen
and (min-device-width:320px)
and (max-device-width:480px) {
...
...
}

/* Smartphone (landscape) */
@media only screen
and (min-width:321px) {
...
...
}

/* Smartphone (portrait) */
@media only screen
and (max-width:320px) {
...
...
}

/* iPad (portrait & landscape) */
@media only screen
and (min-device-width:768px)
and (max-device-width:1024px) {
...
...
}

/* iPad (landscape) */
@media only screen
and (min-device-width:768px)
and (max-device-width:1024px)
and (orientation:landscape) {
...
...
}

/* iPad (portrait) */
@media only screen
and (min-device-width:768px)
and (max-device-width:1024px)
and (orientation:portrait) {
...
...
}

/* Desktop & laptop */
@media only screen
and (min-width:1224px) {
...
...
}

/* Large Screen */
@media only screen
and (min-width:1824px) {
...
...
}

/* iPhone 4 */
@media
only screen and (-webkit-min-device-pixel-ratio:1.5),
only screen and (min-device-pixel-ratio:1.5) {
...
...
}

Referensi:

 
Support : Creating Website | Johny Template | Mas Template
Copyright © 2011. Homtimpa - All Rights Reserved
Template Modify by Creating Website
Proudly powered by Blogger