<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" integrity="sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A==" crossorigin=""/>
<style>
body {
margin: 0;
padding: 0;
}
#map { position: absolute; top: 0; height: 100vh; width: 50vw; }
.animated-icon {
width: 20px;
height: 20px;
background-color: rgba(128, 0, 128,0.5);
border-radius: 50%;
box-shadow: 0px 0px 4px white;
transition: all 1s
}
.box {
width: 100%;
height: 1000px;
}
.map-pin {
position: absolute;
top: 0;
height: 100%;
width: 50vw;
}
.red {
background-color: red;
}
.pink {
background-color: pink;
}
.purple {
background-color: purple;
}
</style>
</head>
<body>
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet-gpx/1.7.0/gpx.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/ScrollTrigger.min.js"></script>
<div id="scroll-trigger-container">
<div class="map-pin">
<div id="map"></div>
</div>
<div>
<div class="box red"></div>
<div class="box pink"></div>
<div class="box purple"></div>
</div>
</div>
</body>
</html>
<script>
var map = L.map('map').setView([51.505, -0.09], 6);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png',
{
maxZoom: 17,
minZoom: 9
}).addTo(map);
var icon = L.divIcon({
iconSize: [30, 30],
iconAnchor: [10, 10],
popupAnchor: [10, 0],
shadowSize: [0, 0],
className: 'animated-icon my-icon-id'
})
var ll = L.latLng( 51.505,-0.09)
// create marker
var marker = L.marker(ll, {
icon: icon,
title: 'look at me!'
})
marker.addTo(map)
gsap.registerPlugin(ScrollTrigger);
const animatedIcon = document.querySelector('.animated-icon');
const timeline = gsap.timeline({
// yes, we can add it to an entire timeline!
scrollTrigger: {
trigger: ".map-pin",
pin: true,
markers: true,
pinSpacing: false,
end: "3000px", // end after scrolling 500px beyond the start
onUpdate: e => {
animatedIcon.style.width = 20 * 10 * e.progress;
animatedIcon.style.height = 20 * 10 * e.progress;
}
}});
</script>