// If you're adding a number of markers, you may want to drop them on the map// consecutively rather than all at once. This example shows how to use// window.setTimeout() to space your markers' animation.constneighborhoods:google.maps.LatLngLiteral[]=[{lat:52.511,lng:13.447},{lat:52.549,lng:13.422},{lat:52.497,lng:13.396},{lat:52.517,lng:13.394},];letmarkers:google.maps.Marker[]=[];letmap:google.maps.Map;functioninitMap():void{map=newgoogle.maps.Map(document.getElementById("map")asHTMLElement,{zoom:12,center:{lat:52.52,lng:13.41},});document.getElementById("drop")!.addEventListener("click",drop);}functiondrop():void{clearMarkers();for(leti=0;i < neighborhoods.length;i++){addMarkerWithTimeout(neighborhoods[i],i*200);}}functionaddMarkerWithTimeout(position:google.maps.LatLngLiteral,timeout:number):void{window.setTimeout(()=>{markers.push(newgoogle.maps.Marker({position:position,map,animation:google.maps.Animation.DROP,}));},timeout);}functionclearMarkers():void{for(leti=0;i < markers.length;i++){markers[i].setMap(null);}markers=[];}declareglobal{interfaceWindow{initMap:()=>void;}}window.initMap=initMap;
// If you're adding a number of markers, you may want to drop them on the map// consecutively rather than all at once. This example shows how to use// window.setTimeout() to space your markers' animation.constneighborhoods=[{lat:52.511,lng:13.447},{lat:52.549,lng:13.422},{lat:52.497,lng:13.396},{lat:52.517,lng:13.394},];letmarkers=[];letmap;functioninitMap(){map=newgoogle.maps.Map(document.getElementById("map"),{zoom:12,center:{lat:52.52,lng:13.41},});document.getElementById("drop").addEventListener("click",drop);}functiondrop(){clearMarkers();for(leti=0;i < neighborhoods.length;i++){addMarkerWithTimeout(neighborhoods[i],i*200);}}functionaddMarkerWithTimeout(position,timeout){window.setTimeout(()=>{markers.push(newgoogle.maps.Marker({position:position,map,animation:google.maps.Animation.DROP,}),);},timeout);}functionclearMarkers(){for(leti=0;i < markers.length;i++){markers[i].setMap(null);}markers=[];}window.initMap=initMap;
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */#map{height:100%;}/* * Optional: Makes the sample page fill the window. */html,body{height:100%;margin:0;padding:0;}#floating-panel{position:absolute;top:10px;left:25%;z-index:5;background-color:#fff;padding:5px;border:1pxsolid#999;text-align:center;font-family:"Roboto","sans-serif";line-height:30px;padding-left:10px;}#floating-panel{margin-left:-52px;}
<html>
<head>
<title>Marker Animations With setTimeout()</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="floating-panel">
<button id="drop">Drop Markers</button>
</div>
<div id="map"></div>
<!--
The `defer` attribute causes the script to execute after the full HTML
document has been parsed. For non-blocking uses, avoiding race conditions,
and consistent behavior across browsers, consider loading using Promises. See
https://developers.google.com/maps/documentation/javascript/load-maps-js-api
for more information.
-->
<script
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=weekly"
defer
></script>
</body>
</html>
Git and Node.js are required to run this sample locally. Follow these instructions to install Node.js and NPM. The following commands clone, install dependencies and start the sample application.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-28 UTC."],[[["\u003cp\u003e\u003ccode\u003egoogle.maps.Marker\u003c/code\u003e is deprecated, with \u003ccode\u003egoogle.maps.marker.AdvancedMarkerElement\u003c/code\u003e being the recommended replacement.\u003c/p\u003e\n"],["\u003cp\u003eThis example demonstrates using \u003ccode\u003ewindow.setTimeout()\u003c/code\u003e to animate markers dropping onto the map sequentially.\u003c/p\u003e\n"],["\u003cp\u003eA "Drop Markers" button triggers the animation, placing markers at predefined neighborhood locations.\u003c/p\u003e\n"],["\u003cp\u003eSample code is provided in TypeScript and JavaScript, alongside CSS and HTML for styling and structure.\u003c/p\u003e\n"]]],["`google.maps.Marker` is deprecated as of February 21st, 2024 (v3.56); use `google.maps.marker.AdvancedMarkerElement` instead, which requires Maps JavaScript API version 3.53.2 or higher. To animate multiple markers, use `window.setTimeout()` within a loop, as demonstrated in the example to add markers to a map with a drop animation effect. A `Drop Markers` button initiates the process, and `clearMarkers` removes existing markers.\n"],null,["| As of February 21st, 2024 (v3.56), google.maps.Marker is deprecated. We encourage you to\n| transition to the new `google.maps.marker.AdvancedMarkerElement` class. Advanced\n| markers provide substantial improvements over the legacy `google.maps.Marker` class.\n| The minimum version of the Maps JavaScript API with `google.maps.marker.AdvancedMarkerElement`\n| is 3.53.2. At this time, google.maps.Marker is not scheduled to be discontinued.\n|\n| [Learn more](/maps/documentation/javascript/advanced-markers/migration)\n\nThis example uses `window.setTimeout()` to place markers on the map\nconsecutively rather than all at once when a **Drop Markers** button is\nclicked.\n\nRead the [documentation](/maps/documentation/javascript/markers#animate). \n\nTypeScript \n\n```typescript\n// If you're adding a number of markers, you may want to drop them on the map\n// consecutively rather than all at once. This example shows how to use\n// window.setTimeout() to space your markers' animation.\n\nconst neighborhoods: google.maps.LatLngLiteral[] = [\n { lat: 52.511, lng: 13.447 },\n { lat: 52.549, lng: 13.422 },\n { lat: 52.497, lng: 13.396 },\n { lat: 52.517, lng: 13.394 },\n];\n\nlet markers: google.maps.Marker[] = [];\nlet map: google.maps.Map;\n\nfunction initMap(): void {\n map = new google.maps.Map(document.getElementById(\"map\") as HTMLElement, {\n zoom: 12,\n center: { lat: 52.52, lng: 13.41 },\n });\n\n document.getElementById(\"drop\")!.addEventListener(\"click\", drop);\n}\n\nfunction drop(): void {\n clearMarkers();\n\n for (let i = 0; i \u003c neighborhoods.length; i++) {\n addMarkerWithTimeout(neighborhoods[i], i * 200);\n }\n}\n\nfunction addMarkerWithTimeout(\n position: google.maps.LatLngLiteral,\n timeout: number\n): void {\n window.setTimeout(() =\u003e {\n markers.push(\n new google.maps.Marker({\n position: position,\n map,\n animation: google.maps.Animation.DROP,\n })\n );\n }, timeout);\n}\n\nfunction clearMarkers(): void {\n for (let i = 0; i \u003c markers.length; i++) {\n markers[i].setMap(null);\n }\n\n markers = [];\n}\n\ndeclare global {\n interface Window {\n initMap: () =\u003e void;\n }\n}\nwindow.initMap = initMap;https://github.com/googlemaps/js-samples/blob/2683f7366fb27829401945d2a7e27d77ed2df8e5/samples/marker-animations-iteration/index.ts#L8-L67\n```\n| **Note:** Read the [guide](/maps/documentation/javascript/using-typescript) on using TypeScript and Google Maps.\n\nJavaScript \n\n```javascript\n// If you're adding a number of markers, you may want to drop them on the map\n// consecutively rather than all at once. This example shows how to use\n// window.setTimeout() to space your markers' animation.\nconst neighborhoods = [\n { lat: 52.511, lng: 13.447 },\n { lat: 52.549, lng: 13.422 },\n { lat: 52.497, lng: 13.396 },\n { lat: 52.517, lng: 13.394 },\n];\nlet markers = [];\nlet map;\n\nfunction initMap() {\n map = new google.maps.Map(document.getElementById(\"map\"), {\n zoom: 12,\n center: { lat: 52.52, lng: 13.41 },\n });\n document.getElementById(\"drop\").addEventListener(\"click\", drop);\n}\n\nfunction drop() {\n clearMarkers();\n\n for (let i = 0; i \u003c neighborhoods.length; i++) {\n addMarkerWithTimeout(neighborhoods[i], i * 200);\n }\n}\n\nfunction addMarkerWithTimeout(position, timeout) {\n window.setTimeout(() =\u003e {\n markers.push(\n new google.maps.Marker({\n position: position,\n map,\n animation: google.maps.Animation.DROP,\n }),\n );\n }, timeout);\n}\n\nfunction clearMarkers() {\n for (let i = 0; i \u003c markers.length; i++) {\n markers[i].setMap(null);\n }\n\n markers = [];\n}\n\nwindow.initMap = initMap;https://github.com/googlemaps/js-samples/blob/2683f7366fb27829401945d2a7e27d77ed2df8e5/dist/samples/marker-animations-iteration/docs/index.js#L7-L55\n```\n| **Note:** The JavaScript is compiled from the TypeScript snippet.\n\nCSS \n\n```css\n/* \n * Always set the map height explicitly to define the size of the div element\n * that contains the map. \n */\n#map {\n height: 100%;\n}\n\n/* \n * Optional: Makes the sample page fill the window. \n */\nhtml,\nbody {\n height: 100%;\n margin: 0;\n padding: 0;\n}\n\n#floating-panel {\n position: absolute;\n top: 10px;\n left: 25%;\n z-index: 5;\n background-color: #fff;\n padding: 5px;\n border: 1px solid #999;\n text-align: center;\n font-family: \"Roboto\", \"sans-serif\";\n line-height: 30px;\n padding-left: 10px;\n}\n\n#floating-panel {\n margin-left: -52px;\n}\nhttps://github.com/googlemaps/js-samples/blob/2683f7366fb27829401945d2a7e27d77ed2df8e5/dist/samples/marker-animations-iteration/docs/style.css#L7-L42\n```\n\nHTML \n\n```html\n\u003chtml\u003e\n \u003chead\u003e\n \u003ctitle\u003eMarker Animations With setTimeout()\u003c/title\u003e\n\n \u003clink rel=\"stylesheet\" type=\"text/css\" href=\"./style.css\" /\u003e\n \u003cscript type=\"module\" src=\"./index.js\"\u003e\u003c/script\u003e\n \u003c/head\u003e\n \u003cbody\u003e\n \u003cdiv id=\"floating-panel\"\u003e\n \u003cbutton id=\"drop\"\u003eDrop Markers\u003c/button\u003e\n \u003c/div\u003e\n \u003cdiv id=\"map\"\u003e\u003c/div\u003e\n\n \u003c!-- \n The `defer` attribute causes the script to execute after the full HTML\n document has been parsed. For non-blocking uses, avoiding race conditions,\n and consistent behavior across browsers, consider loading using Promises. See\n https://developers.google.com/maps/documentation/javascript/load-maps-js-api\n for more information.\n --\u003e\n \u003cscript\n src=\"https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=weekly\"\n defer\n \u003e\u003c/script\u003e\n \u003c/body\u003e\n\u003c/html\u003ehttps://github.com/googlemaps/js-samples/blob/2683f7366fb27829401945d2a7e27d77ed2df8e5/dist/samples/marker-animations-iteration/docs/index.html#L8-L33\n```\n\nTry Sample \n[JSFiddle.net](https://jsfiddle.net/gh/get/library/pure/googlemaps/js-samples/tree/master/dist/samples/marker-animations-iteration/jsfiddle) [Google Cloud Shell](https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fgooglemaps%2Fjs-samples&cloudshell_git_branch=sample-marker-animations-iteration&cloudshell_tutorial=cloud_shell_instructions.md&cloudshell_workspace=.)\n\nClone Sample\n\n\nGit and Node.js are required to run this sample locally. Follow these [instructions](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) to install Node.js and NPM. The following commands clone, install dependencies and start the sample application. \n\n git clone -b sample-marker-animations-iteration https://github.com/googlemaps/js-samples.git\n cd js-samples\n npm i\n npm start\n\n\nOther samples can be tried by switching to any branch beginning with `sample-`\u003cvar translate=\"no\"\u003eSAMPLE_NAME\u003c/var\u003e. \n\n git checkout sample-\u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-nx\"\u003eSAMPLE_NAME\u003c/span\u003e\u003c/var\u003e\n npm i\n npm start"]]