Breaking

Showing posts with label CSS3. Show all posts
Showing posts with label CSS3. Show all posts

Tuesday, October 11, 2016

October 11, 2016

Membuat SlidingUpPanel Dengan HTML,CSS Dan Javascript Bagian 3


Pada postingan sebelumnya tentang Membuat SlidingUpPanel Dengan HTML, CSS Dan Javascript Bagian 2 kita telah selesai SlidingUpPanel, di postingan kali ini kita akan membuat javascript untuk memainkan lagu dari yang disimpan dalam folder songs.

Buatlah file javascript baru di dalam folder proyek Anda beri nama player.js. Seperti sebelumnya ssaat membuat sliding-up-panel.js buatlah class MusicPlayer pada file tersebut kemudian tambahkan constructor pada kelas MusicPlayer dan inisialisasikan variable yang akan digunakan.
'use strict';
class MusicPlayer{
constructor(){
this.player = document.querySelector('audio');
this.playlist = document.querySelector('.playlist');
this.playPauseBtn = Array.from(document.querySelectorAll('.play-btn'));
this.nextBtn = document.querySelector('.next-btn');
this.prevBtn = document.querySelector('.prev-btn');

this.songs = Array.from(document.querySelectorAll('.song a'));
this.currentSong = 0;

this.onPlayPause = this.onPlayPause.bind(this);
this.onNextClick = this.onNextClick.bind(this);
this.onPreviousClick = this.onPreviousClick.bind(this);
this.onProgress = this.onProgress.bind(this);
this.onMetadataLoaded = this.onMetadataLoaded.bind(this);
this.onSongEnded = this.onSongEnded.bind(this);
this.songChanged = this.songChanged;
this.setupMarqueeAnimation = this.setupMarqueeAnimation.bind(this);
this.addEventListeners();
this.initPlaylist();

}
}
window.addEventListener('load',() => new MusicPlayer());

Sekarang buat fungsi untuk menginisialisasikan daftar putar dengan melakukan XMLHttpRequest ke sisi server dan menerima semua nama file yang ada dalam folder songs.
initPlaylist(){
this.getPlaylist();
}
getPlaylist(){
var self = this;
return new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest();
xhr.onload = function(e){
e.preventDefault();
if(xhr.status == 200 || xhr.status == 409){
//parse the response to JSON Array
var data = JSON.parse(xhr.response.match(/\[.*\]/ig, "")[0]);
// loopping through all item in array, where each item contain link to the file.
data.forEach(function(item,index){
// load metadata from the file
self.loadPlaylistMetadata(item,index);
});
resolve(data);
}else{
reject('cant get paylist');
}
}
// open XMLHttpRequest with GET method
xhr.open('get', '\songlist', true);
// set header Content-Type to JSON
xhr.setRequestHeader('Content-Type', 'application/json');
// send the request to server
xhr.send();
});
}
loadPlaylistMetadata(path,index){
self =this;
// create new li element for the playlist item and set the attribute
var li = document.createElement('li');
li.setAttribute('class','song');
li.setAttribute('data-index',index);

// create new link element and set the href attribute to the file path
var a = document.createElement('a');
a.setAttribute('href',path);

// create new image element
var img = document.createElement('img');
img.className = 'cover';
img.style.cssFloat = 'left';

//create new container for title and artist metadata
var meta = document.createElement('div');
meta.className = 'metatag playlist';

//create new span element to set title from the file metadata
var title = document.createElement('span');
title.className = 'title';
title.style.whiteSpace = 'nowrap';

//create new span element to set artist name from the file metadata
var artist = document.createElement('span');
artist.className = 'artist';
//insert link/anchor element to li element
li.appendChild(a);
//insert img element to link/anchor element
a.appendChild(img);
//insert meta container to the link/anchor element
a.appendChild(meta);
/* create new p element and insert title and artist to it then append it to meta container,
* this element is necessary if we want the title or artist to
* be marqueed if the width is more than container width.*/
var p = document.createElement('p').appendChild(title);
meta.appendChild(p);
p = document.createElement('p').appendChild(artist);
meta.appendChild(p);
// listen to link click event
a.onclick = function(e){
e.preventDefault();
self.player.setAttribute('src',link);
self.songChanged(self.currentSong,li.getAttribute('data-index'));
self.currentSong = parseInt(li.getAttribute('data-index'));
self.playPauseBtn[0].children[0].click();
};
//append li element to playlist
this.playlist.children[0].appendChild(li);
// read meta data from the file using jsmediatags
jsmediatags.read(path, {
onSuccess: function(tag) {
var url = path;
var filename = url.split('/');
filename = filename[filename.length-1];
if(tag.tags.picture != undefined){
var base64String = "";
for (var i = 0; i < tag.tags.picture.data.length; i++) {
base64String += String.fromCharCode(tag.tags.picture.data[i]);
}
img.setAttribute('src',"data:"+ tag.tags.picture.format +";base64," + window.btoa(base64String));
}else{
img.setAttribute('src',"assets/img/albumart_mp_unknown.png");
}
// if the artist name in metadata is undefined or null, set it to unknown.
artist.innerHTML = tag.tags.artist || 'unknown';
// if the title in metadata is undefined or null, use filename instead.
title.innerHTML = tag.tags.title || filename;

// setup marquee animation
self.setupMarqueeAnimation(titles[i],artists[i]);

},
onError: function(error) {
console.log(error);
}
});
}
Buatlah fungsi baru untuk menambahkan animasi marquee pada title/artist jik lebarnya melebihi container/parent.
setupMarqueeAnimation(title,artist){
if(title.offsetWidth > parseInt(title.parentNode.style.width.replace('px',''))){
title.className += ' marquee-title';
}else{
title.style.willChange = 'initial';
title.className = 'title';
}
if(artist.offsetWidth > parseInt(artist.parentNode.style.width.replace('px',''))){
artist.className += ' marquee-artist';
}else{
artist.className = 'artist';
}
}
Setelah itu buat fungsi untuk menambahkan event listener yang dibutuhkan.
addEventListeners(){
this.player.ontimeupdate = this.onProgress;
this.player.onended = this.onSongEnded;
this.player.onloadedmetadata = this.onMetadataLoaded;
for(var i in this.playPauseBtn){
this.playPauseBtn[i].addEventListener('click',this.onPlayPause);
}
this.nextBtn.addEventListener('click',this.onNextClick);
this.prevBtn.addEventListener('click',this.onPreviousClick);
}
Sekarang buat fungsi-fungsi yang digunakan di event listener diatas.
onSongEnded(e){
this.moveToNext();
}
onNextClick(e){
this.moveToNext();
e.preventDefault();
}
onPreviousClick(e){
this.moveToPrevious();
e.preventDefault();
}
onPlayPause(e){
if(this.player.getAttribute('src') == ''){
this.player.setAttribute('src',this.songs[0].getAttribute('href'));
this.currentSong = 0;
this.songChanged(null,0);
}
if(this.player.paused){
this.player.play().then().catch(function(error){
console.log(error);
});
for(var i in this.playPauseBtn){
this.playPauseBtn[i].children[0].setAttribute('src','assets/icons/pause-btn.svg');
this.playPauseBtn[i].setAttribute('state','play');
}
}else{
try{
this.player.pause();
for(var i in this.playPauseBtn){
this.playPauseBtn[i].children[0].setAttribute('src','assets/icons/play-btn.svg');
this.playPauseBtn[i].setAttribute('state','play');
}
}catch(error){
console.log(error);
}
}
e.preventDefault();
}
onMetadataLoaded(e){
var self = this;
var artists = document.querySelectorAll('.meta .artist');
var titles = document.querySelectorAll('.meta .title');
var covers = Array.from(document.querySelectorAll('img.coverart'));
jsmediatags.read(e.target.src, {
onSuccess: function(tag) {
var url = e.target.src;
var filename = url.split('/');
filename = filename[filename.length-1]
if(tag.tags.picture != undefined){
for(var j in covers){
var base64String = "";
for (var i = 0; i < tag.tags.picture.data.length; i++) {
base64String += String.fromCharCode(tag.tags.picture.data[i]);
}
covers[j].setAttribute('src',"data:"+ tag.tags.picture.format +";base64," + window.btoa(base64String));
}
}else{
for(var j in covers){
covers[j].setAttribute('src',"assets/img/albumart_mp_unknown.png");
}
}
for(var i = 0; i < artists.length;i++){
titles[i].parentNode.style.width = 200;
artists[i].parentNode.style.width = 200;
artists[i].innerHTML = tag.tags.artist;
titles[i].innerHTML = tag.tags.title;

// if the artist name in metadata is undefined or null, set it to unknown.
artist.innerHTML = tag.tags.artist || 'unknown';
// if the title in metadata is undefined or null, use filename instead.
title.innerHTML = tag.tags.title || filename;

// setup marquee animation
self.setupMarqueeAnimation(titles[i],artists[i]);
}

},
onError: function(error) {
console.log(error);
}
});
}

moveToNext(){
var next = this.currentSong + 1,link;
if(next < this.songs.length){
link = this.songs[next].getAttribute('href');
this.songChanged(this.currentSong,next);
this.currentSong = next;
this.player.setAttribute('src',link);

}else{
link = this.songs[0].getAttribute('href');
this.songChanged(this.currentSong,0);
this.currentSong = 0;
this.player.setAttribute('src',link);
}
this.player.load();
this.player.play();
}
moveToPrevious(){
var prev = this.currentSong - 1,link;
if(prev >= 0){
link = this.songs[prev].getAttribute('href');
this.songChanged(this.currentSong,prev);
this.currentSong = prev;
this.player.setAttribute('src',link);

}else{
prev = this.songs.length - 1;
var link = this.songs[prev].getAttribute('href');
this.songChanged(this.currentSong,prev);
this.currentSong = prev;
this.player.setAttribute('src',link);
}
this.player.play();
}
Kemudian buat fungsi baru lagi untuk mengubah warna background dari item yang saat ini sedang dimainkan.
songChanged(before,current){
//if the song before the current one is not null, remove active class from that element
if(before != null){
this.songs[before].removeAttribute('class');
}
// set the current song item class in playlist to active
this.songs[current].setAttribute('class','active');
}
Sampai disini pembuatan pemutar musiknya telah selesai, sekarang buka cmd/terminal kemudiang ketikkan perintah supervisor index.js kemudian buka browser dan ubah url menjadi http:/localhost:3000 untuk melihat hasilnya. Kurang lebih hasilnya menjadi akan seperti berikut.



untuk postingan selanjutnya kita akan memperbaiki beberapa tampilan termasuk panel header yang akan kita buat berganti tampilan saat kita membuka panel. :)

Thursday, October 6, 2016

October 06, 2016

Penggunaan Flexbox di CSS3

Tulisan ini bulum sepenuhnya selesai dan lengkap, namun akan terus diupdate jika penulis memiliki waktu luang.

Pada postingan kali ini saya akan membahas cara penggunaan Flexbox Di CSS3. Sebelum memulai ada baiknya Anda memahami terlebih dahulu apa itu Flexbox.

Apa Itu Flexbox ?

Flexbox (Flexible Layout) merupakan salah satu fitur baru di CSS3 yang bertujuan untuk menyediakan cara yang lebih efisien dalam mengatur tata letak komponen pada suatu dokumen html dengan menyelaraskan ruang antar item dalam suatu elemen meskipu ukurannya tidak diketahui.

Poin utama di balik Flexible Layout adalah untuk memberikan kemampuan untuk mengubah lebar / tinggi (dan urutan) item untuk mengisi ruang yang tersedia (sebagian besar untuk mengakomodasi semua jenis layar dan ukuran layar). Sebuah wadah fleksibel memperluas item untuk mengisi ruang kosong yang tersedia, atau mengecilkan mereka untuk mencegah overflow/melewati batas tinggi dan lebar dari wadah.

Yang paling penting, Flexbox layout adalah layout dengan arah-agnostik yang bertentangan dengan layout yang teratur (block yang berbasis vertikal dan inline yang berbasis horizontal). Sementara block dan inline layout bekerja dengan baik untuk halaman, namun layout ini tidak memiliki fleksibilitas untuk mendukung aplikasi yang besar atau kompleks (terutama ketika perubahan orientasi, perubahan ukuran, peregangan, menyusutan, dll).

Implementasi Flexbox Layout

Berikut ini adalah contoh dari katalog yang saya ambil dari w3.org di mana setiap item memiliki judul, foto, deskripsi, dan tombol pembelian. Tujuan desainernya adalah bahwa setiap entri memiliki ukuran keseluruhan yang sama, foto berada di atas teks, dan tombol pembelian selaras di bagian bawah, terlepas dari panjang deskripsi item. Flex layout membuat banyak aspek desain ini menjadi mudah:
  • Katalog menggunakan Flexbox layout untuk meletakkan baris item horizontal, dan untuk memastikan bahwa item dalam baris semua sama-tingginya. Setiap entri kemudian memiliki wadah kolom flex sendiri, dan mengatur isinya secara vertikal.
  • Dalam setiap entri, isi dokumen sumber disusun secara logis dengan judul pertama, diikuti oleh deskripsi dan foto. Ini menyediakan susunan yang masuk akal untuk speech rendering dan di browser non-CSS. Untuk presentasi visual yang lebih menarik, namun, agar digunakan untuk menarik gambar ke atas kemudian di isi ke atas, dan align-self digunakan untuk memperbaiki posisi horizontal.
  • Margin auto atas tombol pembelian memaksanya ke bawah dalam setiap kotak entri, terlepas dari ketinggian deskripsi item ini.

#deals {
display: flex; /* Flex layout so items have equal height */
flex-flow: row wrap; /* Allow items to wrap into multiple lines */
}
.sale-item {
display: flex; /* Lay out each item using flex layout */
flex-flow: column; /* Lay out item’s contents vertically */
flex-basis: 50%; /* Lay out item's width is 50% relative to parent */

}
.sale-item > img {
order: -1; /* Shift image before other content (in visual order) */
align-self: center; /* Center the image cross-wise (horizontally) */
}
.sale-item > button {
margin-top: auto; /* Auto top margin pushes button to bottom */
}

<section id="deals">
<section class="sale-item">
<h1>Computer Starter Kit</h1>
<p>This is the best computer money can buy, if you don’t have much money.</p>
<ul>
<li>Computer</li>
<li>Monitor</li>
<li>Keyboard</li>
<li>Mouse</li>
</ul>
<img src="https://www.w3.org/TR/css-flexbox-1/images/computer.jpg"
alt="You get: a white computer with matching peripherals.">
<button>BUY NOW</button>
</section>
<section class="sale-item">
<h1>Printer</h1>
<p>Only capable of printing ASCII art.</p>
<ul>
<li>Paper and ink not included.</li>
</ul>
<img src="https://www.w3.org/TR/css-flexbox-1/images/printer.png"
alt="You get: a white computer with matching peripherals." />
<button>BUY NOW</button>
</section>
</section>


Output :

Computer Starter Kit

This is the best computer money can buy, if you don’t have much money.

  • Computer
  • Monitor
  • Keyboard
  • Mouse
You get: a white computer with matching peripherals.

Printer

Only capable of printing ASCII art.

  • Paper and ink not included.
You get: a white computer with matching peripherals.



Karena flexbox adalah seluruh modul dan bukan satu properti, hal ini akan melibatkan banyak hal termasuk seluruh set properti. Beberapa dari mereka yang dimaksudkan untuk mengatur pada container/wadah (elemen induk, yang dikenal sebagai "wadah fleksibel") sedangkan yang lain dimaksudkan untuk mengatur child/anak dari container/wadah (item fleksibel).

Jika layout yang teratur didasarkan pada kedua blok dan aliran arah inline, layout fleksibel didasarkan pada flex-flow. Silakan lihat di gambar spesifikasi berikut, yang menjelaskan gagasan utama di balik layout fleksibel.
Pada dasarnya, item akan ditata mengikuti poros utama (dari main-start ke main-end) atau sumbu silang (dari cross-start ke cross-end).
  • Sumbu Utama - Sumbu utama(Main Axis) container/wadah fleksibel adalah sumbu utama bersama dimana item fleksibel diletakkan. Hati-hati, arahnya tidak selalu horizontal, tergantung pada properti flex-flow.
  • main-start | main-end - Item fleksibel ditempatkan dalam container/wadah mulai dari main-start ke main-end
  • .
  • Ukuran Utama - lebar atau tinggi Item fleksibel, yang ada dalam dimensi utama, adalah ukuran utama item. Properti ukuran utama flex item adalah properti width atau height, yang ada dalam dimensi utama.
  • Sumbu Cross - Sumbu tegak lurus dengan sumbu utama disebut sumbu cross. arahnya tergantung pada arah sumbu utama.
  • cross-start | cross-end - garis Flex dipenuhi dengan item-item dan ditempatkan ke dalam container/wadah dimulai pada sisi cross-start container/wadah fleksibel menuju ke sisi cross-end.
  • Ukuran Cross - Lebar atau tinggi dari item flex, dalam dimensi Cross, adalah ukuran cross item. Ukuran properti cross dari lebar atau tinggi yang ada di dimensi cross.

Properti Untuk elemen parent

(flex container)
display
Ini mendefinisikan sebuah wadah fleksibel; inline atau blok tergantung pada nilai yang diberikan.
.container {
display: flex; /* or inline-flex */
}
Perlu dicatat bahwa kolom CSS tidak berpengaruh pada container/wadah fleksibel.
flex-direction
Properti ini menetapkan sumbu utama, sehingga menentukan arah item fleksibel ditempatkan dalam wadah fleksibel. Flexbox adalah (selain dari pembungkus opsional) konsep layout satu arah. Anggaplah item fleksibel sebagai tata letak utama baik dalam baris horizontal atau kolom vertikal.
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
  • row (default): kiri ke kanan dalam ltr; kanan ke kiri dalam rtl
  • row-reverse: kanan ke kiri dalam ltr; kiri ke kanan dalam rtl
  • column: sama seperti row namun dari atas ke bawah
  • column-reverse: sama seperti row-reverse namun dari bawah ke atas



Sunday, September 4, 2016

September 04, 2016

Membuat Efek Ripple Berbasis Material Design Menggunakan jQuery


Pada kesempatan kali ini saya akan membahas tentang bagaimana cara membuat efek ripple seperti yang ada pada Google Material Design. Disini saya menggunakan jQuery untuk mempermudah dalam pembuatan efek ripple, versi yang saya gunakan adalah versi 1.9.1.

Saya akan sedikit menjelaskan keseluruhan konsep yang akan digunakan dalam pembuatan efek ripple ini. Jadi ketika sebuah element HTML di klik kita akan menambahkan element baru dimana nantinya di dalam element baru ini terdapat element yang akan kita ingin beri efek. Element baru yang dibuat ini nantinya akan di berikan efek scale dengan warna background tertentu, dan ketika klik mouse selesai efek akan di fade-out(dipudarkan).

Pertama-tama kita akan membuat element yang akan kita beri efek, buatlah file baru beri nama index.html.


<html>
<head>
</head>
<body>
<h1>
Ripple Click Effect</h1>
<ul>
<li><a class="ripple" href="#">Dashboard</a></li>
<li><a class="ripple" href="#">My Account</a></li>
<li><a class="ripple" href="#">Direct Messages</a></li>
<li><a class="ripple" href="#">Chat Rooms</a></li>
<li><a class="ripple" href="#">Settings</a></li>
<li><a class="ripple" href="#">Logout</a></li>
</ul>
</body>
</html>


Sekarang kita akan membuat file CSS untuk mengubah tampilannya serta membuat keyframes untuk animasi ripple, buatlah file baru dan beri nama style.css.

/*basic reset*/

* {
margin: 0;
padding: 0;
}

body {
background-size: cover;
}

h1 {
font: normal 32px/32px Bitter;
color: black;
text-align: center;
padding: 85px 100px;
}


/*nav styles*/

ul {
background: white;
border-top: 6px solid hsl(180, 40%, 60%);
width: 200px;
margin: 0 auto;
}

ul li {
list-style-type: none;
/*relative positioning for list items along with overflow hidden to contain the overflowing ripple*/
position: relative;
overflow: hidden;
}

ul li a {
font: normal 14px/28px Montserrat;
color: hsl(180, 40%, 40%);
display: block;
padding: 10px 15px;
text-decoration: none;
cursor: pointer;
/*since the links are dummy without href values*/
/*prevent text selection*/
user-select: none;
/*static positioned elements appear behind absolutely positioned siblings(.ink in this case) hence we will make the links relatively positioned to bring them above .ink*/
position: relative;
}


/*.ink styles - the elements which will create the ripple effect. The size and position of these elements will be set by the JS code. Initially these elements will be scaled down to 0% and later animated to large fading circles on user click.*/

.ink {
display: block;
position: absolute;
background: hsl(180, 40%, 80%);
border-radius: 100%;
transform: scale(0);
-webkit-transform: scale(0);
-moz-transform: scale(0);
}

.fade-out {
transform: opacity(0);
-webkit-transform: opacity(0);
-moz-transform: opacity(0);
}


/* animation effect keyframes */

.ink.animate {
animation: ripple 0.65s forwards;
-webkit-animation:ripple 0.65s forwards; /* For Chrome & Safari/Webkit based browser */
-moz-animation:ripple 0.65s forwards; /* For Mozilla Firefox */
}

.ink.animate.end {
transition: all 0.5s ease-in-out;
background-color: rgba(255, 0, 0, 0.0);
box-shadow: none;
border-radius: 0px;
}
@-webkit-keyframes ripple{
100% {
-webkit-transform: scale(2.5);
transform: scale(2.5);

}
}
@-moz-keyframes ripple{
100% {
-moz-transform: scale(2.5);
transform: scale(2.5);

}
}

@keyframes ripple {
/*scale the element to 250% to safely cover the entire link and fade it out*/
100% {
transform: scale(2.5);
-webkit-transform: scale(2.5);
-moz-transform: scale(2.5);
}
}


Selanjutnya kita akan menggunakan javascript dan jquery untuk membuat animasi efek Ripple. Buatlah file javascript baru dan beri nama ripple.js, setea itu deklarasikan semua variabel yang dibutuhkan untuk membuat efe ripple.

(function($){
var parent,ink,d,x,y;
}(jQuery);

Berikut sedikit penjelasan tentang variabel yang akan digunakan
variabelfungsi
parent digunakan untuk menyimpan objek html parent dari objek yang di klik
ink digunakan untuk menyimpan element html baru yang akan memberikan efek animasi ripple pada elemen yang diklik
d digunakan untuk menyimpan lebar atau tinggi element parent untuk mendapatkan diameter lingkaran untuk efek ripple
x digunakan untuk menyimpan posisi x dari parent element yang diklik
y digunakan untuk menyimpan posisi y dari parent element yang diklik
Sekarang kita akan membuat fungsi untuk melakukan animasi pada 2 event yaitu event mousedown dan mouseup, mousedown adalah event saat mousedown ditekan dan mouseup adalah event saat tombol mouse dilepas/selesai ditekan. Sebelumnya pada script html tiap element list saya beri nama class ripple sehingga kita akan menggunakan nama class untuk mengeksekusi animasi.
Note:
untuk mengeksekusi perintah yang melibatkan lebih dari satu element menggunakan javascript sebaiknya menggunakan class bukan id, karena id hanya akan mengambil 1 element pertama saja.

(function($){
var parent,ink,d,x,y;
$('.ripple').mousedown(function(e){

});
$('.ripple').mouseup(function(e)){

});
}(jQuery);

Selanjutnya kita akan mulai mengeksekusi perintah-perintah pada event mousedown terlebih dahulu. Didalam fungsi mousedown kita dapat mengakses objek yang sedang diklik dan menganimasikannya menggunakan css yang telah dibuat sebelumnya. Pertama kita perlu mendapatkan parent element dari element yang diklik.

var parent = $(this).parent();

Setelah mendapatkan element parent dari objek yang di klik kita perlu mengecek apakah element ink sudah ada pada element parent atau tidak, jika tidak ada maka buat element ink baru kemudian menyisipkannya kedalam parent element, kemudian simpan element ke variable ink.

if (parent.find(".ink").length == 0){
parent.prepend("
");
}
ink = parent.find(".ink");

Agar efek ripple dapat selalu berjalan ketika mouse diklik kita perlu menghapus nama class animate dan end dari element ink jika memang pada element parent sudah terdapat element ink.

ink.removeClass("animate");
ink.removeClass("end");

Selanjutnya kita perlu mengatur ukuran dari element ink menggunakan lebar atau tinggi element parent untuk membuat diameter lingkaran yang bisa untuk menutupi element.

if (!ink.height() && !ink.width()) {
d = Math.max(parent.outerWidth(), parent.outerHeight());
ink.css({
height: d,
width: d
});
}

Selanjutnya kita perlu mengatur posisi dari element ink namun kita harus mendapatkan kordinat x dan y saat mouse ditekan terlebih dahulu. Untuk mendapatkan kordinat x kita perlu mendapatkan kordinat x dari objek yang diklik relatif pada halaman kemudian dikurangi dengan posisi element parent relatif pada halaman dan dikurangi setengah dari lebar element ink, untuk kordinat y kita dapat menggunakan rumus yang sama yang berbeda hanya pada yang terakhir dimana untuk x kita menggunakan setengah dari lebar element ink sedangkan untuk y kita menggunakan setengah dari tinggi element ink.

x = e.pageX - parent.offset().left - ink.width() / 2;
y = e.pageY - parent.offset().top - ink.height() / 2;

Sekarang atur posisi dari element ink dan tambahkan class animate

ink.css({
top: y + 'px',
left: x + 'px'
}).addClass("animate");

Sekarang kita telah selesai membuat efek ripple pada event mousedown, sekarang kita perlu menambahkan 1 baris terahir di event mouseup untuk memberikan efek fade saat mouse selesai diklik dengan menambahkan nama class end pada element ink.

ink.addClass("end");

Sampai disini Anda telah selesai Membuat Efek Ripple Berbasis Material Design Menggunakan jQuery. Mungkin itu saja yang dapat saya berikan pada postingan kali ini.
Semoga Bermanfaat ...!!!

Full Code + Result

Friday, June 24, 2016

June 24, 2016

Kombinasi HTML, CSS3 Dan Javascript Bagian 3


Seperti janji saya sebelumnya pada postingan kali ini kita akan bermain dengan animasi css serta mengkombinasikannya dengan javascript. Pada postingan kali ini saya akan membahas tentang cara penggunaan keyframes untuk menganimasikan objek.

Animasi pada CSS3 biasanya di deklarasikan menggunakan property animation, setiap animasi dapat dijadikan satu menggunakan keyframes. Seperti layaknya pada beberapa software animasi 3D dimana setiap pergerakan objek memiliki keyframes.


Move To Right Animation (Animasi Bergerak Ke Kanan)

Sekarang kita akan mencoba menggerakan sebuah objek HTML dari posisi awal menuju posisi bagian kanan. terdapat beberapa cara untuk membuat animasi ini kita dapat mengubah margin/padding dari objek atau kita juga dapat mengubah posisi dari objek tersebut. Disini saya menggunakan posisi objek dengan property left, perlu diingat bahwa ketika kita ingin menggunakan property left,right,top atau bottom kita harus terlebih dahulu mendeklarasikan properti position jika tidak maka properti yang Anda deklarasikan tidak akan dieksekusi.
berikut contoh animasi CSS3 menggunakan keyframes yang bergerak ke kanan.

button{
position:relative;
display:block;
margin:10px auto;
}
@keyframes ltr {
0% {
left:0px;
}
50% {
left:70px;
}
100% {
left:0px;
}
}

Pada CSS diatas saya membuat keyframes yang saya beri nama ltr dan terdapat 3 keyframes dimana saya hanya mengubah posisi left dari objek dimana objek yang saya gunakan adalah sebuah button. Ada 2 Cara dalam menggunakan keyframes yaitu menggunakan persentasi atau menggunakan from dan to. Namun disini saya hanya membahas yang menggunakan persen. Pada keyframes kedua objek digerakkan 70px ke kanan, kemudian pada keyframes ketiga objek dikembalikan ke posisi semula.

Untuk mengimplementasikan animasi tersebut ke sebuah objek kita perlu menambahkan properti animation pada objek yang akan kita animasikan, terdapat 2 cara, membuat class baru di CSS atau menambahkannya pada attribut style di sebuah objek HTML. Namun dalam kasus ini saya memakai cara yang kedua yaitu menambahkan properti animation pada attribut style.

Pertanyaan yang ada di benak Anda mungkin adalah "Lalu, bagaimana cara melakukannya ?" untuk melakukannya kita akan menggunakan javascript, javascript sangat berguna untuk membuat website menjadi lebih responsive, banyak situs-situs besar seperti misalnya Twitter yang memiliki framework bootstrap, kemudian jQuery dan jQuery Mobile serta masih banyak lagi framework javascript lainnya.

Lanjut ke pembahasan, jadi untuk menambahkan properti animation kita memerlukan javascript terutama apabila kita ingin memicu animasi pada kondisi tertentu, misal saat objek diklik atau saat objek menyentuh kursor mouse dan lain sebagainya. disini saya akan memicu animasi saat objek menyentuh kursor mouse. Untuk mengakses objek menggunakan javascript kita dapat menggunakan id, class atau tag dari objek tersebut, jadi jika Anda ingin mengubah suatu objek dengan tag yang sama maka ada baiknya Anda menggunakan class atau id agar objek tidak mengeksekusi perintah yang sama. Disini saya memberikan id btn pada objek yang akan diubah.
var tombol = document.getElementById('btn');
tombol.onmouseover = function(){
tombol.setAttribute("style","animation: ltr 2s");
}
setTimeout(function() {
tombol.removeAttribute("style");
}, 2000);

Saya akan sedikit menjelaskan tentang script diatas melalui tabel berikut

tombolVariabel yang kita buat untuk mengakses objek yang akan diberikan animasi
documentRepresentasi halaman HTML
onmouseoverEvent yang kita gunakan untuk memicu pengubahan attribute pada objek yaitu saat kursor mouse menyentuh objek tersebut
setAttribute("style","animation: ltr 2s")fungsi yang digunakan untuk menambahkan attribute pada objek dimana parameter pertama adalah nama attribute sedangkan parameter kedua adalah value dari attribute dimana terdapat 2 argument, nama keyframes dan lama waktu animasi
setTimeoutDigunakan untuk mengeksekusi suatu perintah setelah kurun waktu tertentu

Pada script diatas saya menggunakan setTimeout untuk menghapus attribute style setelah animasi telah selesai, tujuannya adalah agar saat event onmouseover dipicu kembali objek akan tetap dianimasikan. Untuk membuat animasi yang bergerak dari Kanan ke Kiri Anda hanya perlu mengubah properti left pada keyframes menjadi right

Full Code



Rotate Animation(Animasi Berputar)

Untuk membuat animasi berputar tidak berbeda jauh dengan animasi sebelumnya, yang berbeda hanya pada keyframes nya saja dimana pada keyframes saya menggunakan property transform kemudian memutar objek pada sumbu Z sebanyak 360 derajat.


Move To Bottom Animation(Animasi Bergerak Ke Bawah)

Animasi ini hampir sama seperti yang pertama, perbedaannya hanya pada properti left dimana saya mengubahnya menjadi top.




Itu tadi 3 variasi animasi yang dapat digunakan untuk menganimasikan objek HTML di web Anda. Bagaimana ? mudah bukan ? tidak ada yang sulit selama Anda mau belajar :). Untuk hasil akhir dapat dilihat disini

Semoga bermanfaat ...!!

Wednesday, June 15, 2016

June 15, 2016

Kombinasi HTML, CSS3 Dan Javascript Bagian 2



Setelah di postingan sebelumnya saya sudah sedikit menjelaskan tentang apa itu javascript, maka di postingan kali ini kita akan mencoba beberapa fitur yang ada di CSS3 sekaligus mengkombinasikannya dengan javascript.

Rounded Corners (Sudut Tumpul)

Pertama kita mulai dengan Sudut Tumpul atau yang sering disebut dengan Rounded Corners.
Di CSS3 kita dapat membuat suatu objek memiliki sudut tumpul atau rounded corners dengan menambahkan properti border-radius. berikut contoh penggunaan border-radius pada tombol dengan css yang ditulis menggunakan cara penulisan Embadded Stylesheet.


<html>
<head>
<style>
.btn{
border-radius: 5px;
}
</style>
</head>
<body>
<button class="btn">button</button>
</body>
</html>

Hasil Output :



Color Gradient (Warna Gradien)

Jika Anda sering bermain dengan software editing foto seperti Photoshop mungkin Anda sudah tidak asing dengan apa yang disebut dengan warna gradien. warna gradien(sering disebut dengan warna ramp atau warna deret) menentukan berbagai warna tergantung dari posisi, biasanya digunakan untuk mengisi suatu objek. Warna yang dihasilkan bervariasi terus-menerus dengan posisi, sehingga menghasilkan transisi warna yang halus. Terdapat beberapa variasi warna gradien yang dapat kita gunakan di CSS3 namun disini saya hanya menunjukkan cara penggunaan warna gradien yang biasa yaitu dari atas kebawah.


berikut contoh cara penggunaan warna gradient di CSS3 :


<html>
<head>
<style>
.gradient{
background: linear-gradient(cyan, whitesmoke);
height: 50px;
width: 100%;
}
</style>
</head>
<body>
<div class="gradient"></div>
</body>
</html>
Hasil output :






Shadows(Bayangan)

Pada CSS3 juga terdapat efek bayangan yang dapat kita gunakan untuk memberikan efek bayangan pada suatu objek atau teks Berkut contoh efek bayangan pada text




<html>
<head>
<style>
span{
text-shadow: 2px 2px;
}
</style>
</head>
<body>
<span></div>
</body>
</html>

Hasil output :
Teks Dengan efek bayangan

kemudian untuk memberikan efek bayangan pada sebuah objek biasanya menggunakan properti box-shadow.


<html>
<head>
<style>
.shadow{
height: 50px;
width: 50px;
box-shadow:10px 10px;
}
</style>
</head>
<body>
<span></div>
</body>
</html>

Hasil Output :


Itu tadi beberapa fitur baru di CSS3, untuk postingan selanjutnya saya akan membahas tentang properti Transform,Animaton dan Transition serta menggabungkannya dengan javascript.


Semoga bermanfaat !!!

Friday, June 10, 2016

June 10, 2016

Kombinasi HTML, CSS3 Dan Javascript



Setelah Sebelumnya saya telah membahas tentang CSS pada artikel CSS(Cascading Stylesheet) dimana disana saya menjelaskan beberapa dasar cara menggunakan CSS, maka pada postingan kali ini saya akan sedikit membahas tentang CSS3 dimana CSS3 merupakan pengembangan dari CSS, sehingga dalam dasar penggunaanya tidak berbeda dengan CSS.

Di CSS3 terdapat beberapa penambahan fitur diantaranya adalah :

  • Box Model
  • Efek Teks
  • Transformasi 2D/3D 
  • Animasi
  • Layout multi kolom
  • dll.
Disini saya menganggap Anda telah mengerti cara penggunaan CSS dan HTML, jika belum, Anda dapat membaca artikel CSS(Cascading Stylesheet) untuk mengetahui apa itu CSS dan bagaimana dasar penggunaannya, dan artikel Pengertian HTML, Dasar Penggunaan HTML untuk mengetahui apa itu HTML dan bagaimana Dasar penggunaan dari HTML.

Sekarang saya akan sedikit membahas tentang Javascript.

Apa itu Javascript ?


Javascript adalah bahasa pemrograman tingkat tinggi yang banyak digunakan di internet dan dapat bekerja di beberapa web browser populer seperti Internet Explorer/Edge, Netscape, Opera, Mozilla Firefox dan Chrome.

Kode javascript biasanya dituliskan dalam bentuk fungsi diantara tag
<script type="text/javascript"> dan </script > atau ditulis didalam file yang berbeda.



Sejarah Javascript

JavaScript pertama kali dikembangkan oleh Brendan Eich dari Netscape di bawah nama Mocha, yang tadinya namanya diganti menjadi LiveScript, dan akhirnya menjadi JavaScript.


Navigator sebelumnya telah mendukung Java untuk lebih bisa dimanfaatkan para programmer yang non-Java. Maka dikembangkanlah bahasa pemrograman bernama LiveScript untuk mengakomodasi hal tersebut. Bahasa pemrograman inilah yang akhirnya berkembang dan diberi nama JavaScript, walaupun tidak ada hubungan bahasa antara Java dengan JavaScript.


JavaScript bisa digunakan untuk banyak tujuan, misalnya untuk membuat efek rollover baik di gambar maupun teks, dan yang penting juga adalah untuk membuat AJAX(Asynchronus Javascript XMLHTTP). JavaScript adalah bahasa yang digunakan untuk AJAX.


Itu tadi sedikit penjelasan tentang Apa itu Javascript dan sejarah singkatnya, saya akan mulai menjelaskan bagaimana cara menggunakan Javascript bersama dengan HTML dan CSS3 pada postingan selanjutnya.