Ditulis oleh: Ditulis pada: 2/06/2017
Beberapa hari ngutak-ngatik lazy load untuk image dan video Youtube dengan lazysize.js, saya jadi punya ide untuk memanfaatkan lazysize.js untuk show div onscroll untuk fixed widget.Seperti kita ketahui bahwa lazysize.js menggunakan
class="lazyload"
dan kemudian ketika halaman di-scroll dan object akan memasuki above the fold maka class="lazyload"
akan berubah menjadi class="lazyloaded"
yang menandakan bahwa sumber element sudah dimuat blowser.Dengan begitu kita bisa memanfaatkan perubahan
class="lazyload"
menjadi class="lazyloaded"
ketika di-scroll untuk show floating/fixed div. Kita menggunakan .lazyloaded
untuk memunculkan fixed div, kita tinggal mengatur tempat widget-nya sebelum di-scroll agar tidak langsung menjadi class="lazyloaded"
untuk menunda kemunculannya (di sini saya menganggap Anda sudah menggunakan lazysize.js di blog), seperti berikut:Sebelum discroll:
.fixed {
position: relative;
margin-top: 1000px;
width: 300px;
bottom: 0;
left: 0;
z-index: 9999;
}
Widget diletakan di bawah above the fold dengan
position: relative
, misalnya di sidebar bawah. Di sini saya menggunakan margin-top: 1000px
untuk mengatur ketinggian scroll.Kemudian ketika halaman di-scroll maka
class="lazyload"
akan berubah menjadi class="lazyloaded"
dan kita gunakan position: fixed
agar widget menjadi melayang.
.fixed.lazyloaded {
position: fixed;
}
Kita juga bisa menambahkan animasi ketika widget muncul dengan css animasi. Sebagai contoh, di bawah ini css dan html untuk widget yang saya gunakan di demo.
Kode CSS
.fixed {
position: relative;
margin-top: 1000px;
width: 300px;
bottom: 0;
left: 0;
z-index: 9999;
}
.fixed.lazyloaded {
position: fixed;
animation: totop 1s;
-moz-animation: totop 1s;
-webkit-animation: totop 1s
}
.fixed-content {
width: 300px;
height: 200px;
background: #fff;
border: 1px solid #ddd;
border-left: none;
border-bottom: none;
}
.fixed h2 {
font-size: 16px;
font-weight: bold;
margin: 10px 0 10px 10px;
}
.fixed label {
display: block;
position: absolute;
top: 0;
right: 0;
font-size: 18px;
font-weight: bold;
width: 20px;
height: 20px;
line-height: 20px;
text-align: center;
background: #fff;
border: 1px solid #dedede;
cursor: pointer;
z-index: 9999
}
.fixed input {
position: absolute;
right: -999em;
opacity: 0
}
.fixed input[type=checkbox]:checked+div {
position: fixed;
bottom: 0;
left: -500px;
animation: toleft 1s;
-moz-animation: toleft 1s;
-webkit-animation: toleft 1s
}
@keyframes toleft {
from {
left: 0
}
to {
left: -500px;
}
}
@-moz-keyframes toleft {
from {
left: 0
}
to {
left: -500px;
}
}
@-webkit-keyframes toleft {
from {
left: 0
}
to {
left: -500px;
}
}
@keyframes totop {
from {
bottom: -500px
}
to {
bottom: 0;
}
}
@-moz-keyframes totop {
from {
bottom: -500px
}
to {
bottom: 0;
}
}
@-webkit-keyframes totop {
from {
bottom: -500px
}
to {
bottom: 0;
}
}
Kode HTML
<div class="fixed lazyload">
<label for='item-1'>×</label>
<input id='item-1' name='one' type='checkbox' />
<div class="fixed-content">
<h2><span>Widget Fixed</span></h2>
<div>
<img src="https://i.ytimg.com/vi/vUQkLrEjpm0/maxresdefault.jpg" width="300" height="120">
</div>
</div>
</div>