Tampilkan postingan dengan label Efek. Tampilkan semua postingan
Tampilkan postingan dengan label Efek. Tampilkan semua postingan

Sabtu, 02 November 2013

Border Semitransparan untuk Menciptakan Efek Tajam dan Tipis pada Elemen

Saya secara alami sering dan suka memperhatikan hal-hal yang detail, terutama pada elemen-elemen UI di dalam web-web terkenal seperti Google, Facebook dan juga berbagai framework web. Kali ini Saya akan membahas mengenai tampilan menu dropdown pada framework Bootstrap ini:

Bootstrap Dropdown
Menu dropdown pada Bootstrap.

Tampilannya terlihat sangat tajam dan dimensinya juga terlihat sangat tipis! Bagi Anda yang sudah terbiasa bekerja dengan aplikasi Photoshop dan sejenisnya mungkin tidak begitu asing dengan teknik untuk membuat efek seperti ini.

Pada kenyataannya, menciptakan elemen kotak dengan efek bayangan saja tidak cukup untuk memberikan kesan sisi yang tajam dan dimensi yang tipis seperti gambar di atas:

/* Belum cukup! */
.box {
background-color:white;
border:1px solid #bbb;
box-shadow:0 4px 15px -4px rgba(0,0,0,.6);
}

Deklarasi di atas sudah cukup untuk menciptakan efek kotak bergaris batas dan berbayang, namun tidak cukup utuk memberikan efek tajam pada elemen tersebut. Jika Anda memperhatikan dengan seksama pada menu dropdown di gambar pertama, maka seharusnya Anda akan menyadari bahwa garis batas pada menu tersebut ternyata tembus pandang:

Bootstrap Dropdown
Pembesaran tampilan.

Efek semacam ini tidak cukup dibuat hanya dengan warna solid dan bayangan, melainkan kita membutuhkan warna semi transparan pada border. Kita bisa menggunakan kode warna RGBA atau HSLA pada border:

.box {
background-color:white;
border:1px solid rgba(0,0,0,.3);
box-shadow:0 4px 15px -4px rgba(0,0,0,.6);
}

Tapi sekarang efek transparan pada border justru menampilkan warna latar dari elemen .box di bagian bawahnya karena warna latar secara normal memang akan menembus sampai ke sisi terluar dari border (Anda bisa mengeceknya dengan mencoba mengubah tipe border menjadi dashed atau dotted). Untuk mencegah warna latar agar tidak melebihi batas dalam lingkar border, kita bisa menggunakan CSS background-clip dengan nilai padding-box:

.box {
background-color:white;
border:1px solid rgba(0,0,0,.3);
background-clip:padding-box;
box-shadow:0 4px 15px -4px rgba(0,0,0,.6);
}

Membandingkan Hasil Tampilan

Berikut ini adalah gambar cuplikan hasil tampilan pada efek sebelum dan efek sesudah:

Efek Tajam dengan CSS
Efek sebelum dan sesudah.

Penggunaan Properti background-clip Lainnya

Fungsi CSS background-clip adalah untuk menentukan apakah latar belakang elemen, baik warna atau gambar, akan meluas ke bagian bawah perbatasan atau tidak. Nilai padding-box pada properti ini memungkinkan warna latar yang secara normal akan melebar dan melebihi batas sebelah dalam dari lingkar border menjadi tidak melebihi batas tersebut. Selengkapnya mengenai CSS background-clip bisa Anda pelajari di sini

Secara pribadi Saya jarang menggunakannya untuk kepentingan dekorasi. Melainkan, Saya lebih sering menggunakan properti ini untuk memperbaiki tampilan yang sedikit rusak karena render piksel yang tidak terlalu baik pada beberapa peramban. Sebagai contoh adalah pada elemen tombol dengan efek rouded corner di sekelilingnya seperti ini:

CSS3 Button

Gambar sebelah kiri adalah tampilan standar tombol yang dibuat tanpa mendeklarasikan background-clip:padding-box. Jika Anda meperhatikannya dengan seksama, maka pada bagian sisi-sisi lengkungnya akan tampak sedikit warna latar yang melebihi batas. Saya tidak tahu mengapa, tetapi ini hanya terjadi pada elemen tombol yang dikenai deklarasi display:inline, sedangkan tombol dengan deklarasi display:inline-block atau display:block tidak mengalami masalah ini. Ini terjadi di Google Chrome.

Gambar sebelah kanan adalah hasil tampilan sesudah Saya menerapkan deklarasi background-clip:padding-box pada tombol. Terlihat lebih rapi, karena warna latar tidak menembus bagian sisi tombol.

Kembali kepada efek tajam dan super tipis pada menu dropdown, Google Chrome juga mengimplementasikan hal yang sama, hanya saja sepertinya dia menggunakan latar gambar, bukan CSS:

Google Chrome Dropdown
Menu dropdown pada Google Chrome.

Pada Google Chrome versi lama, Anda pasti pernah melihat sebuah menu di bagian kanan bawah bernama “Barusan Ditutup” yang jika diklik akan menampilkan daftar histori munculan yang juga memiliki kesan yang sama seperti yang sedang kita bahas sekarang, akan tetapi efek itu diciptakan menggunakan metode yang sedikit berbeda dan Saya pikir ini sudah tidak standar lagi karena hasilnya yang kurang rapi dan tidak konsisten. Bukan menggunakan border semitransparan dan CSS background-clip, melainkan menggunakan outline semitransparan. Hasilnya kurang bagus karena outline tidak bisa mengikuti efek lengkung di ujung-ujung kotak. Saya menambahkan ini sebagai pengetahuan tambahan saja. Seharusnya Saya membahas ini sebelum peramban tersebut diperbaharui sampai yang seperti sekarang:

Outline Semitransparan
Outline tidak bisa mengikuti garis lengkung.
.box {
background-color:white;
box-shadow:0 0 3px rgba(0,0,0,.8);
outline:1px solid rgba(0,0,0,.4);
outline-offset:-3px;
}

Teknik lainnya adalah dengan menggunakan CSS bayangan murni, tanpa border:

.box {
background-color:white;
box-shadow:0 0 0 1px rgba(0,0,0,.3),0 4px 15px -4px rgba(0,0,0,.6);
}

Ini adalah teknik tersingkat, karena kita bahkan tidak memerlukan properti background-clip untuk menciptakan efeknya di sini. Hanya saja, jika peramban tidak mendukung CSS bayangan atau tidak mendukung CSS bayangan berganda atau tidak mendukung nilai spread pada CSS bayangan, maka efek garis batasnya tidak akan terlihat. Border memungkinkan kita untuk menciptakan fallback agar tampilan elemen tidak menjadi terlalu buruk pada peramban yang tidak mendukung CSS bayangan dan warna RGBA. Begini maksudnya:

.box {
background-color:white;
border:1px solid #bbb; /* warna fallback untuk peramban yang tidak mendukung warna RGBA */
border:1px solid rgba(0,0,0,.3); /* warna border yang seharusnya */
background-clip:padding-box;
box-shadow:0 4px 15px -4px rgba(0,0,0,.6);
}

Minggu, 06 Oktober 2013

Efek Masonry Hanya dengan CSS

CSS3 Masonry Layout

Teknik ini sudah pernah dibahas dengan cukup detail di CSS-Tricks. Hanya saja Saya tidak habis pikir mengapa beliau tetap mempertahankan deklarasi column-count untuk memecah area menjadi beberapa kolom dan menggunakan media queries untuk mengurangi jumlah kolom pada saat ukuran layar peramban menyempit. Padahal jika kita sudah menentukan lebar masing-masing item dengan ukuran yang sama, kita bisa menggunakan column-width untuk menentukan lebar kolom tetap tanpa harus melibatkan media queries untuk mengurangi jumlah kolom pada saat ukuran layar semakin sempit. column-width akan menciptakan kolom-kolom dengan jumlah yang bisa menyesuaikan diri berdasarkan ruang yang tersisa. Sudah tertulis dengan jelas dalam spesifikasi:

.container {
column-width:150px;
column-gap:5px; /* Margin kanan/kiri antarkolom */
}

img {
display:block;
width:100%;
height:auto;
margin:0 0 5px 0; /* Margin bawah antargambar */
}

Item Bukan Gambar

Ada satu hal yang harus diperhatikan jika Anda ingin menciptakan efek/tata letak seperti ini pada elemen yang bukan merupakan gambar, yaitu deklarasi display berupa inline-block. Mendeklarasikan perintah ini akan mencegah perpotongan yang tak terduga pada masing-masing item karena CSS3 Kolom secara normal akan berusaha untuk membuat masing-masing kolom menjadi sama tinggi. Beberapa harus terpaksa dipotong di bagian bawah mengingat properti CSS ini memang sebenarnya berbasis teks:

.container {
column-width:150px;
column-gap:5px; /* Margin kanan/kiri antarkolom */
}

.item {
display:inline-block; /* Mencegah pemotongan item yang tak terduga */
margin:0 0 5px 0; /* Margin bawah antaritem */
padding:10px;
background-color:black;
color:white;
}

Ini yang Saya maksud sebagai perpotongan yang tidak diduga dan tidak dikehendaki:

Item terpotong pada akhir kolom pada tempat yang salah.
Teks terpotong pada bagian bawah untuk memastikan agar masing-masing kolom memiliki tinggi yang sama.

Tidak tahu apa itu Masonry?

Rabu, 27 Maret 2013

Tentang Tooltip Deskripsi pada Formulir HTML

Gambaran Tooltip pada Formulir HTML

Memaksimalkan kerja selektor adjacent sibling sangat bermanfaat untuk menciptakan komunikasi yang lebih hidup pada saat proses pengisian formulir untuk pengunjung/anggota. Idenya adalah, seorang calon anggota mencoba untuk mengisi formulir. Dan saat kursor teks aktif di dalam elemen formulir tersebut, maka akan muncul pesan singkat di sebelahnya yang menjelaskan tentang apa saja yang harus calon anggota lakukan terhadap formulir yang sedang aktif tersebut.

Ide di atas bisa kita realisasikan hanya dengan cara seperti ini:

HTML

<input type="text">
<label>Mohon ketik setiap awalan dengan huruf kapital</label>

CSS

/* Menyembunyikan label-label formulir */
label {visibility:hidden}

/* Menampilkan label formulir saat elemen input terfokus */
input:focus + label {visibility:visible}

Yang kemudian akan menghasilkan komunikasi antarmuka seperti ini:

Melakukan beberapa pembaharuan pada tampilan elemen <label> untuk membuatnya tampak sebagai tooltip serta menambahkan efek transisi untuk memperlembut proses tampilnya deskripsi/pesan formulir, maka akan membuat komunikasi antarmuka menjadi semakin tegas tanpa harus meminta pengunjung yang sedang mengisi formulir tersebut pergi menuju ke halaman khusus mengenai panduan cara mengisi formulir. Dengan cara ini, pengunjung/calon anggota akan dipandu pada saat yang sama ketika mereka sedang mengisi formulir:

HTML

<div class="form-item">
<input type="text">
<label>Descriptions...</label>
</div>

CSS

/* Form item wrapper */
.form-item {
margin:1em 0 0;
position:relative;
}

/* Form item title */
.form-item strong {
display:block;
margin:0 0 5px;
}

/* Form items */
.form-item input,
.form-item textarea {
display:block;
border:1px solid #ccc;
padding:4px;
margin:0 0;
width:250px;
font:inherit;
line-height:normal;
color:inherit;
-webkit-box-shadow:inset 0 1px 3px -1px rgba(0,0,0,.2);
-moz-box-shadow:inset 0 1px 3px -1px rgba(0,0,0,.2);
box-shadow:inset 0 1px 3px -1px rgba(0,0,0,.2);
}

/* Tooltip */
.form-item label {
display:block;
position:absolute;
bottom:100%;
left:150px;
margin-bottom:2em;
font-size:11px;
font-weight:bold;
color:white;
white-space:nowrap;
line-height:normal;
padding:.6em 1em;
background-color:black;
-webkit-border-radius:3px;
-moz-border-radius:3px;
border-radius:3px;
visibility:hidden;
opacity:0;
/* Transition effect */
-webkit-transition:all .2s ease-out;
-moz-transition:all .2s ease-out;
-ms-transition:all .2s ease-out;
-o-transition:all .2s ease-out;
transition:all .2s ease-out;
}

/* Tooltip arrow */
.form-item label:after {
content:"";
display:block;
width:0;
height:0;
border:5px solid transparent;
position:absolute;
top:100%;
left:2em;
border-top-color:black;
}

.form-item input:focus,
.form-item textarea:focus {border-color:#aaa}

/* Show tooltip when the form is being focused */
.form-item input:focus + label,
.form-item textarea:focus + label {
visibility:visible;
opacity:1;
margin-bottom:-.5em;
}

Rabu, 27 Februari 2013

JavaScript Draggable

Membuat elemen HTML menjadi bisa digeser-geser ternyata jauh lebih mudah dibandingkan dengan apa yang Saya pikir selama ini. Fungsi di bawah ini murni menggunakan JavaScript biasa dan tidak memerlukan library apapun. Berbeda dengan plugin draggable buatan Saya yang dulu:

HTML

<div id="draggable-element" style="position:relative;">Drag me!</div>

JavaScript

var selected = null, // Object of the element to be moved
x_pos = 0, y_pos = 0, // Stores x & y coordinates of the mouse pointer
x_elem = 0, y_elem = 0; // Stores top, left values (edge) of the element

// Will be called when user starts dragging an element
function _drag_init(elem) {
selected = elem; // Store the object of the element which needs to be moved
x_elem = x_pos - selected.offsetLeft;
y_elem = y_pos - selected.offsetTop;
}

// Will be called when user dragging an element
function _move_elem(e) {
x_pos = document.all ? window.event.clientX : e.pageX;
y_pos = document.all ? window.event.clientY : e.pageY;
if (selected !== null) {
selected.style.left = (x_pos - x_elem) + 'px';
selected.style.top = (y_pos - y_elem) + 'px';
}
}

// Destroy the object when we are done
function _destroy() {
selected = null;
}

// Bind the functions here...
document.getElementById('draggable-element').onmousedown = function() {
_drag_init(this);
return false;
};

document.onmousemove = _move_elem;
document.onmouseup = _destroy;

Demo

Kamis, 21 Februari 2013

Sliding Up Image Description

Sliding Up Image Description
Terinspirasi dari Google Web Store

HTML

<div class="image-box-wrapper" id="image-box-wrapper">

<!-- `.image-box` start -->
<div class="image-box">
<div class="image-container">
<img src="img/image-1.jpg" alt="" width="200" height="150">
</div>
<div class="image-details">
<div class="details">
<h4>Description Title</h4>
<p>Description text...</p>
<p><a class="more" href="#">More</a></p>
</div>
</div>
</div>
<!-- `.image-box` end -->

...
...
...

<div class="clear"></div>

</div>

CSS

.image-box-wrapper {
width:642px;
margin:50px auto;
}

.image-box {
width:210px;
height:160px;
overflow:hidden;
background-color:white;
border:1px solid #ccc;
float:left;
margin:1px 1px;
font:normal normal 12px/1.4 Segoe,"Segoe UI",Arial,Sans-Serif;
color:#333;
}

.image-container,
.image-details {
height:150px;
border:5px solid white;
background-color:#ffc;
-webkit-transition:margin-top .4s ease-out .4s;
-moz-transition:margin-top .4s ease-out .4s;
-ms-transition:margin-top .4s ease-out .4s;
-o-transition:margin-top .4s ease-out .4s;
transition:margin-top .4s ease-out .4s;
}

.image-container img {
width:200px;
height:150px;
padding:0 0;
margin:0 0;
border:none;
outline:none;
max-width:none;
max-height:none;
background-color:black;
}

.image-details h4,
.image-details p {
margin:0 0 .2em;
padding:0 0;
height:70px;
}

.image-details h4 {
font-size:120%;
height:auto;
}

.image-details .details {
padding:10px 12px;
overflow:hidden;
}

.image-details .more {
color:white;
text-decoration:none;
display:block;
text-align:center;
font-weight:bold;
background-color:#f9a;
height:26px;
line-height:26px;
margin:10px 0 0;
}

.image-box:hover {border-color:#bbb}
.image-box:hover .image-container {margin-top:-160px}
.image-details .more:hover {background-color:black}

Selasa, 19 Februari 2013

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

Jumat, 18 Januari 2013

Efek Animasi Loading dengan Event `beforeunload`

Loading

Sebelumnya Saya pernah menuliskan cara membuat efek animasi loading pada saat halaman berpindah dengan cara menyeleksi semua tautan internal untuk memicu tampilnya overlay/tabir animasi saat tautan tersebut diklik. Tapi metode ini memiliki dua kelemahan:

Pertama, menyeleksi semua tautan internal dengan selektor atribut sebenarnya tidak begitu baik karena selektor atribut itu performanya buruk.

Ke dua, jika kita mengeklik tautan internal yang memiliki atribut target='_blank' di dalamnya, tautan tersebut akan terbuka di tab baru. Tapi efek animasi memuat halaman justru terpicu pada halaman sebelumnya, padahal kita tidak menghendaki itu ⇒ #c8644667892985451185. Saya sudah berhasil mengakalinya dengan cara memfilter tautan internal tersebut dengan cara mengecualikan tautan yang memiliki atribut target='_blank' menggunakan JQuery .filter():

$internalLinks.filter(':not([target="_blank"])').click(function() {});

Tapi mulai sekarang lebih baik kita lupakan cara lama tersebut. Kita bisa menciptakan efek animasi perpindahan halaman dengan aman menggunakan event beforeunload.

beforeunload adalah event yang akan terpicu saat sebuah halaman mulai berpindah karena seorang pengguna mengeklik tautan tertentu (atau sekedar memuat ulang halaman dengan cara mengeklik tombol Reload pada peramban) yang memicu mereka untuk keluar dari halaman tersebut:

$(window).on("beforeunload", function() {
// Menampilkan tabir animasi dengan efek `.fadeIn()`...
});

Kali ini tabir animasi ditampilkan bukan karena terpicu oleh aksi klik pada tautan melainkan karena aksi halaman yang mulai berpindah. Sehingga kita bisa merancang ulang tabir animasi perpindahan halaman dengan cara ini:

Anggaplah JQuery sudah terpasang di blog kita. Pertama, masuklah ke halaman editor HTML template, kemudian letakkan kode CSS ini di atas ]]></b:skin> atau </style>:

#page-loader {
position:fixed !important;
position:absolute;
top:0;
right:0;
bottom:0;
left:0;
z-index:9999;
background-color:black;
color:white;
padding:1em 1.2em;
display:none;
}

Kemudian sisipkan kode ini di atas </body>:

<script>
//<![CDATA[
// Menyisipkan markup tabir animasi
$(document.body).append('<div id="page-loader">Loading...</div>');
// Saat halaman terpicu untuk berpindah/keluar menuju halaman lain...
$(window).on("beforeunload", function() {
// ... tampilkan tabir animasi dengan efek `.fadeIn()`
$('#page-loader').fadeIn(1000).delay(6000).fadeOut(1000);
});
//]]>
</script>

Klik Simpan Template.

Demo

Sabtu, 29 Desember 2012

Meringkas Efek Animasi Beruntun/Berkelanjutan

Saat kita membuat efek animasi beruntun/berkelanjutan menggunakan .animate(), biasanya kita akan melakukan ini:

$('div').animate({
width:100,
height:30
}, 1000).animate({
marginTop:200,
marginLeft:100
}, 1000).animate({
fontSize:30,
padding:40
}, 1000).animate({
borderWidth:10
}, 1000).animate({
marginTop:0
}, 1000); // dan seterusnya...

Implementasi di atas memang bekerja dan sama sekali tidak salah. Lihat hasilnya di sini:

Tapi sadarkah Anda bahwa properti-properti animasi yang tertulis di dalam .animate() pada dasarnya hanyalah objek:

Object in JQuery .animate()
Dan kita bisa mempopulasikan itu ke dalam sebuah array:

var anim = [
{ width:100, height:30 },
{ marginTop:200, marginLeft:100 },
{ fontSize:30, padding:40 },
{ borderWidth:10 },
{ marginTop:0 }
];

Ini memungkinkan kita untuk menerapkan properti-properti animasi tersebut satu per satu tanpa harus mendeklarasikan .animate() berulang kali:

var anim = [
{ width:100, height:30 },
{ marginTop:200, marginLeft:100 },
{ fontSize:30, padding:40 },
{ borderWidth:10 },
{ marginTop:0 }
];

$.each(anim, function(i) {
$('div').animate(anim[i], 1000);
});

Atau cukup gunakan cara lama yang biasa digunakan untuk menangani array saat kita menggunakan JavaScript mentah seperti ini:

var anim = [
{ width:100, height:30 },
{ marginTop:200, marginLeft:100 },
{ fontSize:30, padding:40 },
{ borderWidth:10 },
{ marginTop:0 }
];

for (var i = 0, len = anim.length; i < len; i++) {
$('div').animate(anim[i], 1000);
}

Performa?

Saya tidak tahu apakah cara ini bisa mempercepat kerja animasi atau tidak (Saya malas mengetesnya). Tapi Saya pikir cara ini bisa mempermudah kita di dalam membangun deret animasi berlebih-lebihan tanpa harus mendeklarasikan JQuery .animate() secara berlebihan. Selain itu, dengan cara mempopulasikan properti animasi di dalam array, maka ini memungkinkan kita untuk menciptakan gerak animasi yang berbeda-beda pada elemen yang berbeda dengan cara meletakkan array animasi ke dalam atribut elemen. Misalnya seperti ini:

<div data-animation="[{top:30},{left:50},{fontSize:30,borderWidth:10},{padding:30}]"></div>

Setelah itu, cukup gunakan method manipulasi atribut untuk mendapatkan nilai atribut pada masing-masing elemen. Konversi nilainya agar menjadi array (bukan string) dengan eval():

$('div').each(function() {
var anim = eval($(this).data('animation')), // Mengambil nilai atribut `data-animation` dari elemen
$div = $(this);
$.each(anim, function(i) {
$div.animate(anim[i], 1000);
});
});

Minggu, 18 November 2012

Teknik-Teknik Durasi CSS Transisi

Teknik-Teknik Durasi CSS Transisi

Katakanlah kita mempunyai baris CSS ini untuk mengubah warna dan tinggi sebuah elemen <span> saat pointer berada di atasnya:

span {
display:block;
width:50px;
height:120px;
background-color:#080;
margin:15px auto;
}

span:hover {
height:150px;
background-color:#900;
margin:0 auto;
}

Hasilnya adalah seperti ini:

Kemudian Anda tambahkan sedikit CSS Transisi untuk memberikan efek animasi:

span {
display:block;
width:50px;
height:120px;
background-color:#080;
margin:15px auto;
transition:all .4s ease-out;
}

Maka inilah yang akan Anda hasilkan:

Itu adalah dasarnya. Jika Anda ingin menciptakan efek animasi yang sedikit unik, Anda bisa mencoba untuk memindahkan deklarasi CSS transisi atau membuat perbedaan durasi transisi antara keadaan normal dan saat disentuh pointer. Sebagai contoh, jika Anda memindahkan deklarasi transisi dari selektor utama ke selektor keadaan :hover, maka efek transisi hanya akan terjadi saat pointer berada di atas elemen. Namun saat pointer keluar dari elemen tersebut, efek transisi akan menghilang dan menyisakan efek tersentak seperti biasa:

span {
display:block;
width:50px;
height:120px;
background-color:#080;
margin:15px auto;
}

span:hover {
height:150px;
background-color:#900;
margin:0 auto;
transition:all .4s ease-out;
}

Efek di atas tampak sedikit berbeda dari efek yang pertama karena transisi hanya terjadi saat pointer berada di atas elemen. Sedangkan saat pointer meninggalkannya, efek transisi tidak terjadi.

Untuk membuat efek transisi yang merupakan kebalikan dari efek di atas (yaitu efek transisi terjadi pada saat pointer keluar dari elemen, namun tidak terjadi pada saat pointer berada di atasnya), Anda bisa menggunakan cara seperti ini:

Pertama-tama, set efek transisi pada selektor utama dengan durasi tertentu:

span {
display:block;
width:50px;
height:120px;
background-color:#080;
margin:15px auto;
transition:all .4s ease-out;
}

Kemudian set durasi transisi menjadi 0s pada keadaan :hover:

span:hover {
height:150px;
background-color:#900;
margin:0 auto;
transition-duration:0s;
}

Sehingga hasilnya akan menjadi seperti ini:

Ini berlaku juga untuk pseudo kelas :focus dan :active.

Rabu, 03 Agustus 2011

Apa Saja yang Bisa Kita Lakukan dengan CSS Text Shadow?


Sebenarnya tugas CSS Text Shadow tidak hanya sebatas membuat bayangan pada teks saja, namun juga bisa menciptakan efek-efek spesial dengan memanfaatkan kemampuan propertinya yang dapat menerima value bayangan lebih dari satu. Pelajaran CSS Text Shadow dasar bisa kamu baca di sini. Internat Explorer tidak mendukung CSS Text Shadow, jadi kamu harus membuka halaman ini dengan browser lain seperti Mozilla Firefox untuk melihat efeknya. Semua demo yang tampak seperti gambar ini sebenarnya memang benar-benar teks, kalau tidak percaya kamu bisa mencoba untuk menyeleksinya satu-persatu.



Efek Teks Cekung

Untuk membuat efek cekung, intinya adalah dengan membuat warna bayangan offset-X dan offset-Y negatif menjadi lebih gelap dibandingkan warna latar belakangnya. Sebaliknya, bayangan offset-X dan offset-Y positif diwarnai dengan warna yang lebih terang dibandingkan warna latar belakangnya. Hal ini akan menciptakan efek cekung pada teks.

Hompimpa Alaihum Gambreng

h2 {
background:#4aacf7;
color:#064475;
text-shadow:1px 2px 1px #9ad2fe,-1px -2px 1px #1895f7;
}


Efek Teks Cembung

Untuk membuat efek teks cembung adalah dengan membuat warna bayangan offset-X dan offset-Y negatif menjadi lebih terang dibandingkan warna latar belakangnya. Sebaliknya, bayangan offset-X dan offset-Y positif diwarnai dengan warna yang lebih gelap. Hal ini akan menciptakan efek cembung pada teks. Terlebih lagi dengan penambahan detail pemberian warna yang lebih terang lagi pada dua sudut yang tersisa untuk menciptakan efek sedikit berkilau. Kinyis-kinyis...

Hompimpa Alaihum Gambreng

h2 {
background:#3e6a06;
color:#3e6a06;
text-shadow:
-1px -1px 1px #528e06,
-1px -1px 3px #528e06,
1px 1px 1px #243d05,
1px 1px 3px #243d05,
1px -1px 1px #eafed2,
-1px 1px 1px #eafed2;
}


Efek Teks Bergaris Tepi

Untuk membuat efek teks bergaris tepi adalah dengan cara membuat deret bayangan berwarna putih ke segala arah, baik offset positif maupun offset negatif. Mengatur tingkat blur menjadi 0 piksel dan pemberian sentuhan akhir berupa bayangan yang sedikit gelap dengan tingkat blur sebesar 2 piksel untuk mempertegas garis tepinya.

Hompimpa Alaihum Gambreng

h2 {
background:#fafafa;
color:#91080b;
text-shadow:
1px 0px 0px #fff,
-1px 0px 0px #fff,
0px 1px 0px #fff,
0px -1px 0px #fff,
1px 1px 2px #000;
}


Efek Teks Tiga Dimensi

Membuat efek teks tiga dimensi dilakukan dengan cara menuliskan deret bayangan berwarna sama ke satu arah dengan menambahkan besaran angka offset sedikit demi sedikit pada masing-masing bayangan. Mengatur tingkat blur menjadi 0 piksel dan pemberian sentuhan akhir berupa bayangan yang sedikit gelap dengan tingkat blur sebesar 7 piksel untuk mempertegas efek tiga dimensinya.

Hompimpa Alaihum Gambreng

h2 {
background:#f9f9d7;
color:#9a9d0b;
text-shadow:
1px 1px #404206,
2px 2px #727415,
3px 3px #727415,
4px 4px #727415,
5px 5px #727415,
6px 6px #727415,
7px 7px #404206,
8px 8px 7px #000;
}

Hompimpa Alaihum Gambreng

h2 {
background:#eee;
color:#45BEF7;
text-shadow:
0px 1px #577079,
0px 2px #577079,
0px 3px #577079,
0px 4px #577079,
0px 5px #577079,
0px 6px #577079,
0px 7px #577079,
0px 7px 10px #333;
}


Efek Teks Menyala

Efek teks menyala dibuat dengan cara menuliskan deret bayangan berwarna sama dengan menambahkan besaran angka tingkat blur sedikit demi sedikit pada masing-masing bayangan. Mengatur warna teks menjadi putih, latar belakang menjadi hitam serta mengatur offset sumbu X dan Y menjadi 0 piksel.

Hompimpa Alaihum Gambreng

h2 {
background:black;
color:#fff;
text-shadow:
0 0 3px #FFFFA0,
0 0 5px #FFFF4D,
0 0 9px #FFFF41,
0 0 20px #FFFF2A,
0 0 25px #FFFF2B,
0 0 30px #FEFE00,
0 0 40px #F7F700;
}


Efek Nyala Api

Efek nyala api pada teks dapat dibuat dengan cara yang hampir sama dengan efek teks menyala, hanya saja di sini offset sumbu Y dibuat negatif, sementara besar ukuran offset X dibebaskan seperti halnya dimensi nyala api yang tidak beraturan.

Hompimpa Alaihum Gambreng

h2 {
background:black;
color:black;
text-shadow:
0px 0px 4px #ccc,
-1px -5px 4px #ff3,
2px -10px 6px #fd3,
-3px -15px 11px #f80,
3px -18px 18px #f20;
}


Efek Cat Semprot

Efek cat semprot dibuat dengan cara membuat deret bayangan berwarna sama dengan menambahkan besaran angka tingkat blur sebesar 3 piksel pada masing-masing bayangan. Mengatur warna teks menjadi transparan serta mengatur offset sumbu X dan Y sembarang.

Hompimpa Alaihum Gambreng

h2 {
background:#cac3b4;
color:transparent;
text-shadow:
5px 5px 3px #414141,
0px 7px 3px #414141,
7px 0px 3px #414141,
7px 0px 3px #414141,
-4px 0px 3px #414141,
0px 0px 20px #000;
}


Efek Teks Pelangi

Membuat efek teks pelangi dilakukan dengan cara menuliskan deret bayangan ke satu arah dengan menambahkan besaran angka offset sedikit demi sedikit pada masing-masing bayangan. Mengatur tingkat blur menjadi 0 piksel dan pemberian warna pelangi secara berurutan pada masing-masing deret bayangannya.

Hompimpa Alaihum Gambreng

h2 {
background:#f5e6fe;
color:#fff;
text-shadow:
-1px -1px 0px #ddd,
2px 1px 0px #f93e47,
4px 2px 0px #f59b0f,
6px 3px 0px #f5dc0f,
8px 4px 0px #19a305,
10px 5px 0px #057fa3,
12px 6px 0px #052aa3,
14px 7px 0px #7605a3,
14px 8px 2px #000,
14px 5px 10px #000,
14px 5px 25px #000;
}

Merotasi Objek dengan CSS3

Rotasi

Berikut ini adalah kode CSS dasar untuk membuat efek rotasi pada objek:

div {
-webkit-transform:rotate(30deg); /* Safari dan Chrome */
-moz-transform:rotate(30deg); /* Firefox */
-ms-transform:rotate(30deg); /* IE9 */
-o-transform:rotate(30deg); /* Opera */
transform:rotate(30deg); /* W3C */
}

(30deg) adalah ukuran derajat rotasi. Kamu juga bisa menuliskan nilai derajat negatif untuk memutar objek ke arah sebaliknya. Cara penerapannya bisa diletakkan secara topdown ataupun inline seperti ini:

Top-DownInline
#contoh1 {
-webkit-transform:rotate(30deg);
-moz-transform:rotate(30deg);
-ms-transform:rotate(30deg);
-o-transform:rotate(30deg);
transform:rotate(30deg);
}

......

<div id='contoh1'>
HASIL TAMPILAN
</div>
<div style='-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg);'>
HASIL TAMPILAN
</div>




HASIL TAMPILAN
DERAJAT POSITIF


HASIL TAMPILAN
DERAJAT NEGATIF


Membuat Efek Foto dengan CSS3

CSS Efek Foto Polaroid

Cara untuk membuat efek ini sebenarnya sangatlah sederhana (lihat demo), yaitu hanya dengan memanfaatkan CSS Box Shadow dan CSS Transformasi 2 Dimensi.
Masuklah ke tab Rancangan kemudian pilih Edit HTML. Untuk membuat efek seperti dalam demo, kamu cukup menyalin kode CSS ini kemudian meletakkannya tepat di atas kode ]]></b:skin> atau </style>:

img.foto {
background-color:#ffffff;
border:0px;
outline:none;
padding:5px 5px 20px;
-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.7);
-moz-box-shadow:0 1px 3px rgba(0,0,0,0.7);
box-shadow:0 1px 3px rgba(0,0,0,0.7);
}

img.foto:hover {
-webkit-transform:rotate(5deg);
-moz-transform:rotate(5deg);
-ms-transform:rotate(5deg);
-o-transform:rotate(5deg);
transform:rotate(5deg);
}

Simpan templatemu.

Nah, untuk menerapkan efeknya, jangan lupa setiap kali kamu mengunggah gambar, terapkan class foto pada masing-masing tubuh tag <img> yang ada seperti ini:

<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-KzxqfN5tPCo/TjkBR2otlDI/AAAAAAAAAhQ/nlCzSobCnG8/s1600/Funny-Cats-cats-9474201-1600-1200.jpg"><img class="foto" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-KzxqfN5tPCo/TjkBR2otlDI/AAAAAAAAAhQ/nlCzSobCnG8/s320/Funny-Cats-cats-9474201-1600-1200.jpg" alt="" id="BLOGGER_PHOTO_ID_5636537814866564146" border="0" /></a>

atau seperti ini:

<img class="foto"  src="http://4.bp.blogspot.com/-KzxqfN5tPCo/TjkBR2otlDI/AAAAAAAAAhQ/nlCzSobCnG8/s320/Funny-Cats-cats-9474201-1600-1200.jpg" alt="" />

Jumat, 17 Juni 2011

Efek Hover Transparan Sederhana dengan CSS Opacity

CSS Opacity

Apa yang dimaksud dengan hover gambar sederhana? Coba letakkan pointer mousemu pada gambar di atas. Dalam segi kepraktisan, tentu saja efek ini akan lebih ringan jika dibandingkan dengan efek hover gambar artistik dengan JQuery. Untuk membuatnya caranya sangat sederhana. Kita hanya memerlukan sebuah penerapan CSS Pseudo-Class :hover pada selektor img.

Pertama-tama, carilah kode yang tampak seperti ini:

img {
background-color:#fafafa;
border:1px solid #dcdcdc;
padding:5px;
}

Tidak usah terfokus pada deklarasi-deklarasi di dalamnya. Cukup fokus pada selektor img. Kode di atas adalah komponen khusus untuk mengatur tampilan gambar-gambar di halamanmu. Kita bisa mengetahui itu karena selektor img pada dasarnya memang berasal dari tagnya, yaitu <img>

Jika sudah ketemu, salinlah kode ini, kemudian letakkan di bawahnya:

img:hover {

/* Secara teoritis untuk IE 8 & 9 (lebih valid) */
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";

/* Ini juga bekerja di IE 8 & 9
... juga 5, 6, 7 */
filter:alpha(opacity=50);

/* browser Firefox lama di bawah Firefox 0.9 */
-moz-opacity:0.5;

/* Safari 1.x (pra WebKit!) */
-khtml-opacity:0.5;

/* Moderen!
* Firefox 0.9 +, Safari 2?, Chrome yang lain?
* Opera 9 +, IE 9 + */
opacity:0.5;

}

Klik Simpan Template. Sekarang kita masuk ke tahap pemahaman lebih lanjut.

Pemahaman Lebih Lanjut:

Meskipun selektor img:hover memiliki begitu banyak jenis properti opacity, namun pada dasarnya hanya satu saja yang dipakai, yaitu tergantung dari peramban apa yang sedang kita pakai. Sedangkan mengenai nilai opacity, nilai 1 atau 100 sama artinya dengan solid, sedangkan nilai 0 sama artinya dengan tembus pandang SEPENUHNYA.

Kamis, 16 Juni 2011

Efek Hover Gambar Artistik dengan JQuery

tutorial efek fog, hover gambar jquery

Apa yang dimaksud dengan efek hover gambar artistik? Coba letakkan pointer mousemu pada gambar di halaman ini »
Untuk membuat efek seperti itu, yang kita butuhkan hanya JQuery. Saya ajarkan caranya di sini:
  • Pertama-tama, salinlah script di bawah ini, kemudian letakkan di atas kode </head>:

    <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js' type='text/javascript'></script>

    Nah, yang barusan kita lakukan adalah meletakkan mesinnya. Khusus untuk script di atas, jika ternyata templatemu sudah memilikinya, kamu tidak perlu lagi menambahkannya, satu template cukup satu mesin saja. Namun seperti halnya di alam nyata, sebuah mesin tidak akan bekerja tanpa adanya remot pengendali. Untuk itu, sertakanlah komponen pengendali ini dan letakkan tepat di bawah kode tadi:

    <script type='text/javascript'>
    $(document).ready(function() {
    $('img').hover(function() { //masuk
    $(this).animate({ opacity: "0.3" }, 1000);
    }, function() { //keluar
    $(this).animate({ opacity: "1" }, 1000);
    });
    });
    </script>

    Selesai. Klik Simpan Template kemudian lihat hasilnya. Sekarang kita masuk ke tahap pemahaman lebih lanjut.


Pemahaman Lebih Lanjut

  • Sebuah remot pengendali (sebut saja begitu) dapat memiliki tiga buah tugas penting, yaitu menentukan APA yang diberi efek, SEPERTI APA efek yang diberikan dan SECEPAT APA efek itu bekerja.
  • Perhatikan kode img yang nyungsep di antara kode '. Itu adalah selektor dalam CSS yang berarti GAMBAR. Oleh karena itu, tutorial ini sebenarnya tidak mutlak hanya memberlakukan efek pada gambar saja. Kamu juga bisa mengganti kode img tersebut menjadi a misalnya, untuk memberikan efek transparasi pada semua link (tautan). - [APA]
  • opacity adalah properti dalam CSS yang akan dianimasikan oleh mesin ini. - [SEPERTI APA]
  • 1000 adalah tingkat kecepatan perubahan nilai efek (dalam hal ini adalah: opacity/transparasi). Coba saja ganti nilai itu dan lihat perbedaan kecepatannya. - [SECEPAT APA]

Pemakaian JQuery dalam blog tentu saja memiliki sebuah resiko, yaitu blog menjadi bertambah lambat ketika diakses. Namun itu cuma sedikit saja. Atau jika kamu ingin membuat efek hover yang lebih ringan, kamu bisa baca tutorialnya di sini.

Rabu, 15 Juni 2011

Efek Tautan Berubah-Ubah Warna Seperti Pelangi

Hover Link Pelangi

Sebenarnya ada banyak tutorial yang menyediakan script tautan pelangi seperti ini. Tapi untuk yang satu ini, Saya sudah sedikit mengompresnya sehingga berkasnya jadi sedikit lebih kecil ukurannya.


<script src="http://reader-download.googlecode.com/svn/trunk/pelangi.js" type="text/javascript"></script>


Letakkan saja kode itu di atas kode </head> atau letakkan dalam sebuah widget HTML/JavaScript. Efeknya bisa kalian lihat langsung di sini. Coba saja kamu dekatkan kursor mousemu ke tautan-tautan di blog ini.

Jumat, 10 Juni 2011

CSS Text Shadow - Membuat Efek Bayangan pada Teks

CSS Text-Shadow src=

Berikut ini adalah kode CSS dasar untuk membuat efek bayangan pada teks:

span {
text-shadow:10px 10px 7px #222;
}

Aturannya sama persis dengan CSS Box Shadow: 10px yang pertama adalah ukuran offset sumbu-X, 10px yang ke dua adalah offset sumbu-Y, 7px adalah tingkat blur, #222 adalah warna bayangan. Kamu juga bisa menuliskan nilai offset negatif untuk membuat bayangan menuju ke arah sebaliknya. CSS Text Shadow Inset itu tidak ada, namun keterbatasan tersebut bukan berarti bahwa kamu tidak bisa membuat efek-efek yang lebih dahsyat. Dengan sedikit kreativitas, sebenarnya kamu juga bisa membuat efek bayangan teks inset (baca tutorialnya di sini).
Cara penerapannya bisa diletakkan secara top down ataupun inline seperti ini:

Top-DownInline
<style type='text/css'>
#teks1 {text-shadow:10px 10px 7px #222;}
</style>

......

<div id='teks1'>TEKS</div>
<div style='text-shadow:10px 10px 7px #222;'>
TEKS
</div>


Dan ini adalah contoh hasil tampilannya:


HASIL TAMPILAN
OFFSET POSITIF


HASIL TAMPILAN
OFFSET NEGATIF

CSS Box Shadow - Membuat Efek Bayangan pada Area

Box Shadow

Berikut ini adalah kode CSS dasar untuk membuat efek bayangan pada objek:

CSS Bayangan Outset

div {
-webkit-box-shadow:10px 10px 7px #222; /* Safari & Chrome */
-moz-box-shadow:10px 10px 7px #222; /* Firefox */
box-shadow:10px 10px 7px #222; /* W3C */
}

CSS Bayangan Inset

div {
-webkit-box-shadow:inset 10px 10px 7px #222; /* Safari & Chrome */
-moz-box-shadow:inset 10px 10px 7px #222; /* Firefox */
box-shadow:inset 10px 10px 7px #222; /* W3C */
}

10px yang pertama adalah ukuran offset sumbu X, 10px yang ke dua adalah offset sumbu Y, 7px adalah tingkat blur, #222 adalah warna bayangan. Kamu juga bisa menuliskan nilai offset negatif untuk membuat bayangan menuju ke arah sebaliknya. Cara penerapannya bisa diletakkan secara top down ataupun inline seperti ini:

Top-DownInline
<style>
#kotak-1 {
  -webkit-box-shadow:10px 10px 7px #222;
  -moz-box-shadow:10px 10px 7px #222;
  box-shadow:10px 10px 7px #222;
}
</style>
<div id='kotak-1'>OBJEK</div>
<div style='-webkit-box-shadow:10px 10px 7px #222;-moz-box-shadow:10px 10px 7px #222;box-shadow:10px 10px 7px #222;'>OBJEK</div>

Dan ini adalah contoh-contoh penerapan yang lebih detail. Saya sudah memberikan warna merah dan hijau untuk mempertegas bagian mana yang harus menjadi perhatian:

-webkit-box-shadow: 10px 5px 7px #222;
-moz-box-shadow: 10px 5px 7px #222;
box-shadow: 10px 5px 7px #222;
-webkit-box-shadow: 0 10px 7px #222;
-moz-box-shadow: 0 10px 7px #222;
box-shadow: 0 10px 7px #222;
-webkit-box-shadow: 10px 0 7px #222;
-moz-box-shadow: 10px 0 7px #222;
box-shadow: 10px 0 7px #222;
-webkit-box-shadow: 0 0 7px #222;
-moz-box-shadow: 0 0 7px #222;
box-shadow: 0 0 7px #222;
-webkit-box-shadow: 0 0 20px #222;
-moz-box-shadow: 0 0 20px #222;
box-shadow: 0 0 20px #222;
-webkit-box-shadow: 0 0 20px #f10c0c;
-moz-box-shadow: 0 0 20px #f10c0c;
box-shadow: 0 0 20px #f10c0c;
-webkit-box-shadow: 10px 5px 0 #222;
-moz-box-shadow: 10px 5px 0 #222;
box-shadow: 10px 5px 0 #222;
-webkit-box-shadow: -10px -5px 0 #222;
-moz-box-shadow: -10px -5px 0 #222;
box-shadow: -10px -5px 0 #222;
-webkit-box-shadow: inset 10px 5px 7px #222;
-moz-box-shadow: inset 10px 5px 7px #222;
box-shadow: inset 10px 5px 7px #222;
-webkit-box-shadow: inset 0 10px 7px #222;
-moz-box-shadow: inset 0 10px 7px #222;
box-shadow: inset 0 10px 7px #222;
-webkit-box-shadow: inset 10px 0 7px #222;
-moz-box-shadow: inset 10px 0 7px #222;
box-shadow: inset 10px 0 7px #222;
-webkit-box-shadow: inset 0 0 7px #222;
-moz-box-shadow: inset 0 0 7px #222;
box-shadow: inset 0 0 7px #222;
-webkit-box-shadow: inset 0 0 20px #222;
-moz-box-shadow: inset 0 0 20px #222;
box-shadow: inset 0 0 20px #222;
-webkit-box-shadow: inset 0 0 20px #f10c0c;
-moz-box-shadow: inset 0 0 20px #f10c0c;
box-shadow: inset 0 0 20px #f10c0c;
-webkit-box-shadow: inset 10px 5px 0 #222;
-moz-box-shadow: inset 10px 5px 0 #222;
box-shadow: inset 10px 5px 0 #222;
-webkit-box-shadow: inset -10px -5px 0 #222;
-moz-box-shadow: inset -10px -5px 0 #222;
box-shadow: inset -10px -5px 0 #222;