JavaScript Image Trail Tooltip
Pertama kali Saya melihat tooltip semacam ini di situs SXC. Saya mencoba untuk membuat replikanya dengan tanpa menyertakan dukungan untuk peramban-peramban lawas. document.all
itu sudah sangat ketinggalan zaman!
Keistimewaan dari tooltip ini adalah dia bisa bergerak mengikuti gerakan pointer serta bisa mempertahankan posisinya agar tetap berada pada area yang terlihat di halaman agar Anda tidak mengalami masalah-masalah seperti: tooltip keluar terlalu jauh ke sebelah kanan atau ke sebelah bawah dari area terlihat pada halaman. JavaScript ini juga bisa digunakan untuk menggantikan salah satu plugin jQuery Saya yang tidak begitu terkenal dan tidak sering diperbaharui lagi:
JavaScript
/*! JavaScript Image Trail Tooltip by Taufik Nurrohman <http://gplus.to/tovic> */
(function(w, d) {
var tooltip = d.createElement('div'),
noImage = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7", // 1 x 1 pixel transparent GIF
top = 0,
left = 0,
docWidth = 0,
docHeight = 0,
offsetTop = 20, // Default top distance of the tooltip to the mouse pointer
offsetLeft = 20, // Default left distance of the tooltip to the mouse pointer
wait = null;
// Get the correct width of the document without scrollbars
function getDocWidth() {
return d.documentElement.clientWidth;
}
// Get the correct height of the document
function getDocHeight() {
return Math.max(
d.body.scrollHeight, d.documentElement.scrollHeight,
d.body.offsetHeight, d.documentElement.offsetHeight,
d.body.clientHeight, d.documentElement.clientHeight
);
}
tooltip.id = "trail-image";
tooltip.className = "trail-image";
tooltip.innerHTML = '<img src="' + noImage + '" alt="Loading..." style="float:none;display:block;width:100%;height:100%;max-width:none;max-height:none;min-width:0;min-height:0;border:none;outline:none;background:none;margin:0;padding:0;">';
// Just like `DOMContentLoaded` event, but only to
// wait for the existence of the `<body>` element
// to insert the tooltip markup in the proper area
function waitForBodyExist() {
if (!d.body) {
wait = setTimeout(waitForBodyExist, 100);
} else {
clearTimeout(wait);
d.body.appendChild(tooltip);
docWidth = getDocWidth();
docHeight = getDocHeight();
w.onresize = function() {
docWidth = getDocWidth();
docHeight = getDocHeight();
};
w.onscroll = hideTrail;
}
// console.log('Still waiting...');
} waitForBodyExist();
// Function to show the tooltip
// `width` => the tooltip width
// `height` => the tooltip height
// `file` => the URL of the image to show
function showTrail(width, height, file) {
tooltip.style.visibility = "visible";
tooltip.children[0].src = file;
tooltip.style.width = parseInt(width, 10) + "px";
tooltip.style.height = parseInt(height, 10) + "px";
d.onmousemove = function(e) {
if (!e) e = w.event;
if (e.pageX || e.pageY) {
left = e.pageX;
top = e.pageY;
} else if (e.clientX || e.clientY) {
left = e.clientX + d.body.scrollLeft + d.documentElement.scrollLeft;
top = e.clientY + d.body.scrollTop + d.documentElement.scrollTop;
}
tooltip.style.top = parseInt(((top >= docHeight - (height + offsetTop + 10)) ? top - (height + offsetTop) : top + offsetTop), 10) + "px";
tooltip.style.left = parseInt(((left >= docWidth - (width + offsetLeft + 10)) ? left - (width + offsetLeft) : left + offsetLeft), 10) + "px";
};
}
// Function to hide the tooltip
function hideTrail() {
d.onmousemove = "";
tooltip.style.top = "-9999px";
tooltip.style.left = "-9999px";
tooltip.style.visibility = "hidden";
tooltip.children[0].src = noImage;
docWidth = getDocWidth();
docHeight = getDocHeight();
}
// Add to the window object as an external/global function
w.showTrail = showTrail;
w.hideTrail = hideTrail;
})(window, document);
CSS
/* Image Trail Tooltip CSS */
.trail-image {
width:0;
height:0;
background-color:#ddd;
border:1px solid #888;
position:absolute;
top:-9999px;
left:-9999px;
z-index:9999;
visibility:hidden;
-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);
-moz-box-shadow:0 1px 1px rgba(0,0,0,.2);
box-shadow:0 1px 1px rgba(0,0,0,.2);
}
Penggunaan
Dasar Penggunaan
Ada dua fungsi utama dalam skrip di atas, yaitu showTrail
dan hideTrail
. showTrail digunakan untuk menampilkan tooltip sedangkan hideTrail digunakan untuk menyembunyikannya. Anda bisa menerapkannya pada atribut onmouseover
dan onmouseout
seperti ini:
<a href="img/large.jpg">
<img onmouseover="showTrail(250, 100, 'img/medium.jpg');" onmouseout="hideTrail();" src="img/small.jpg" alt="">
</a>
Tentukan lebar dan tinggi gambar baru pada parameter width
dan height
serta URL gambar baru yang ingin ditampilkan pada parameter file
:
Menyimpan Data di dalam Atribut HTML
Menuliskan fungsi berkali-kali secara inline mungkin akan melelahkan. Untuk itu Anda bisa memodifikasinya dengan cara memasukkan setiap URL gambar yang lebih besar di dalam atribut HTML5 data-*
:
<img alt="" src="img/small.jpg" data-image-preview="img/medium.jpg">
Kemudian untuk penerapan fungsinya:
(function() {
var img = document.getElementsByTagName('img');
for (var i = 0, len = img.length; i < len; ++i) {
if (img[i].getAttribute('data-image-preview')) {
img[i].onmouseover = function() {
showTrail(this.offsetWidth * 3, this.offsetHeight * 3, this.getAttribute('data-image-preview'));
};
img[i].onmouseout = hideTrail;
}
}
})();
Pada kode di atas Saya menerapkan this.offsetWidth * 3
dan this.offsetHeight * 3
untuk menciptakan skala tooltip menjadi tiga kali lipat dari gambar thumbnail yang didekati pointer. Jadi anggap saja URL yang berada di dalam atribut data-image-preview
memiliki ukuran sebesar tiga kali lipat dari thumbnail.
Pastikan DOM sudah berada dalam keadaan siap:
Tip untuk Gambar-Gambar dari Picasa
Kita tahu bahwa kita bisa mengubah resolusi gambar yang disimpan di Picasa dengan cara mengubah path /sN
pada setiap gambar. Berikut ini adalah contoh penerapan fungsi showTrail
dan hideTrail
tanpa memerlukan adanya atribut data-image-preview
. Sekali Anda menerapkan fungsi ini, maka semua gambar yang berasal dari Picasa dengan ukuran lebar tidak lebih dari 100 piksel akan bisa menampilkan tooltip dengan lebar gambar 400 piksel:
(function() {
var img = document.getElementsByTagName('img');
for (var i = 0, len = img.length; i < len; ++i) {
var valid = (img[i].src && /\/s[0-9]+(\-c)?\/.*?\.(bmp|gif|jpg|jpeg|png)/i.test(img[i].src) && img[i].offsetWidth <= 100);
if (valid) {
img[i].onmouseover = function() {
showTrail(this.offsetWidth * 4, this.offsetHeight * 4, this.src.replace(/\/s[0-9]+(\-c)?/, "/s400$1"));
};
img[i].onmouseout = hideTrail;
}
}
})();
Pembaharuan: Pengecekan lebar gambar yang Saya terapkan di atas terkadang tidak bekerja karena mungkin fungsi telah tereksekusi sebelum dimensi gambar terbentuk, sehingga lebar gambar akan sama dengan 0 dan itu membuatnya bisa lolos dari pengecekan. Anda bisa mengeluarkan logika img[i].offsetWidth <= 100
dan memasukkannya ke dalam event onmouseover
seperti ini untuk memastikan agar pengecekan lebar gambar bisa dilakukan setelah dimensi gambar terbentuk setiap kali Anda mendekatkan pointer ke atas gambar:
var valid = (img[i].src && /\/s[0-9]+(\-c)?\/.*?\.(bmp|gif|jpg|jpeg|png)/i.test(img[i].src));
if (valid) {
img[i].onmouseover = function() {
if (this.offsetWidth <= 100) {
showTrail(this.offsetWidth * 4, this.offsetHeight * 4, this.src.replace(/\/s[0-9]+(\-c)?/, "/s400$1"));
}
};
img[i].onmouseout = hideTrail;
}
Catatan Tambahan untuk Internet Explorer
Pastikan deklarasi <!DOCTYPE html>
dinyatakan pada dokumen HTML Anda agar skrip ini bisa bekerja dengan baik. Selain itu, menambahkan tag meta ini sedekat mungkin dengan <head>
juga bisa mencegah Internet Explorer untuk berubah ke mode compatibility view tanpa kita kehendaki:
<meta http-equiv='X-UA-Compatible' content='IE=Edge'>
Labels: Gambar, JavaScript
34 Comments:
Keren banget mas... hadeueuehhh susah juga untuk memahami bahasa javascript... :D
By Adhy Suryadi, at Tuesday, October 1, 2013 at 10:47:00 AM GMT+7
wah cukup keren mas, namun susah amat untuk dipahami mas \o/
By Admin, at Tuesday, October 1, 2013 at 10:56:00 AM GMT+7
mantap nih
By Damar Zaky, at Tuesday, October 1, 2013 at 11:42:00 AM GMT+7
mantap mas Taufik :-d
By Imron Fhatoni, at Tuesday, October 1, 2013 at 11:59:00 AM GMT+7
Berarti bisa memperbaiki image preview yg sy pake di yujikop?
By Lalu Abd. Rahman, at Tuesday, October 1, 2013 at 2:08:00 PM GMT+7
widiw...komplit bener :-bd
By Beben Koben, at Tuesday, October 1, 2013 at 4:31:00 PM GMT+7
itu maen sampe ke hungaria (.HU)? cemiwiw
By Beben Koben, at Tuesday, October 1, 2013 at 4:32:00 PM GMT+7
Beda ga mas sama yang ini ?
http://hohoketauan.blogspot.com/2013/04/demo-image-preview-dengan-jquery.html
By Kang Ismet, at Tuesday, October 1, 2013 at 4:55:00 PM GMT+7
Masih keren yang ini :D
By Dixy, at Tuesday, October 1, 2013 at 5:00:00 PM GMT+7
sama kayaknya :3 tinggal memberi tr.caption pada cssnya aja :)
By Unknown, at Wednesday, October 2, 2013 at 6:58:00 AM GMT+7
Sesuaikan dengan kebutuhan.
By Taufik Nurrohman, at Wednesday, October 2, 2013 at 6:58:00 AM GMT+7
Yang ini murni JavaScript, tidak memerlukan JQuery, jadi lebih ringan.
By Taufik Nurrohman, at Wednesday, October 2, 2013 at 7:02:00 AM GMT+7
ijin coba dulu ya mas :D
By Unknown, at Wednesday, October 2, 2013 at 7:05:00 AM GMT+7
Wah asik lebih ringan dari yang udah-udah, terimaksih banyak mas
By M. Alex Joenaedi, at Wednesday, October 2, 2013 at 1:29:00 PM GMT+7
Bro I have seen this effect on mas template site. So how we can add this effect on blog post image in Home page?
By BloggerSpice, at Wednesday, October 2, 2013 at 5:20:00 PM GMT+7
wew keren om, izin coba. makasih udah share :D
- salam damai -
By Anonymous, at Wednesday, October 2, 2013 at 8:48:00 PM GMT+7
Take the last demo. Copy the JavaScript code in it and upload it somewhere. Then place the uploaded code externally above the </body> tag inside this conditional tag:
<b:if cond='data:blog.pageType != "item"'>
<b:if cond='data:blog.pageType != "static_page"'>
<script src='YOUR-JAVASCRIPT-URL-HERE.js'/>
</b:if>
</b:if>
And place the CSS code above the </b:skin> code.
By Taufik Nurrohman, at Wednesday, October 2, 2013 at 9:29:00 PM GMT+7
Izin bookmarks, mau nyoba kapan" mas B)
By Anonymous, at Wednesday, October 2, 2013 at 9:58:00 PM GMT+7
bagus banget mas, jadi image nya bisa di bawa2 pake pointer hehe ,,
kunjungan perdana ,,
blog nya keren banget
By Unknown, at Thursday, October 3, 2013 at 7:23:00 PM GMT+7
Asikkk izin coba gan ... :)
By Anonymous, at Thursday, October 3, 2013 at 9:15:00 PM GMT+7
:-bd jos gandos
By Anonymous, at Friday, October 4, 2013 at 4:02:00 PM GMT+7
Mas kalo cara di atas di terapkan di postingan gimana ?? bisa nggak??
:D
By bagusa4, at Sunday, October 6, 2013 at 5:44:00 PM GMT+7
thanks gan..
By Anonymous, at Monday, October 7, 2013 at 2:08:00 PM GMT+7
thank youuuuu \o/
By admin, at Saturday, October 19, 2013 at 5:26:00 AM GMT+7
saya juga membuat artikel sejenis, pertanyaan saya sama dengan Kang Ismet, apakah sama dengan yang saya jelaskan di artikel blog ini mas?
panduantemplateblog.com/2013/02/cara-memberikan-efek-memperbesar-zoom.html
By Ana Sriwahyuni, at Saturday, October 26, 2013 at 4:13:00 PM GMT+7
Persamaannya mungkin sama-sama memakai library JQuery...
By Taufik Nurrohman, at Wednesday, October 30, 2013 at 9:55:00 PM GMT+7
Salam Keanal sebelumnya Mas Angwyn, menarik artikel nya
Ijin simak Mas,. Rumit juga memahami javascript dan css,
Terima kasih sudah berbagi
By Anonymous, at Thursday, October 31, 2013 at 12:07:00 PM GMT+7
Bener Mbak Leony, lumayan rumit nih memahami javascript dan CSS ini
Samapi ni hari saya, masih belajar terus untuk memhami tentang javascript dan CSS
By Unknown, at Thursday, October 31, 2013 at 12:09:00 PM GMT+7
Perkenalan Salah Nama, Tapi sesuatu yang salah kadang baik kedepannya atau bisa saja tetap salah...hahaaa
By Suwardi, at Saturday, November 9, 2013 at 6:53:00 AM GMT+7
is possible to show the information of an image automatically on blogger? exactly as in the example you gave of SXC? a widget that shows the image resolution and how many views it already had? just like this or similar http://2.bp.blogspot.com/-O2rCu8-1LQY/UoY4APkUdzI/AAAAAAAAAAA/NO-8OFd24QQ/s1600/javascript-tooltip-image-trail-in-sxc-hu-site.png
By Game Cover, at Thursday, December 5, 2013 at 9:27:00 PM GMT+7
Yes for showing the image resolution/dimension, image title and description that inserted inside the image tag itself. But impossible for showing how many views it already had.
By Taufik Nurrohman, at Friday, December 6, 2013 at 8:15:00 AM GMT+7
i know you are a very busy person, but can we talk by skype? this is my site www.gamecover.com.br and im using many of your scripts, i need something, i can hire you to do this for me?
By Game Cover, at Saturday, December 7, 2013 at 7:20:00 AM GMT+7
this is my skype jeronimo_lopes can i add you to?
By Game Cover, at Saturday, December 7, 2013 at 7:20:00 AM GMT+7
kalau efek javascript ini digunakan untuk teks pada default title berjenis teks bagaimana mas taufik...?? 0:)
By Rizky Kurniawan, at Tuesday, March 4, 2014 at 12:01:00 AM GMT+7
Post a Comment
<< Home