190.Vue3 + OpenLayers 实战:实现地图旋转移动动画 + CSS缩放动画(详解 animate 用法)

一、实现效果

页面包含一个 按钮 + 地图 + 动画提示

点击 开始动画 后,会执行以下流程:

1️⃣ 地图移动到指定位置

2️⃣ 地图开始旋转

3️⃣ 地图继续缩放移动

4️⃣ 动画结束后出现 CSS 动画提示


二、项目技术栈

本文示例使用技术:

技术 说明
Vue3 前端框架
OpenLayers WebGIS 地图库
Element Plus UI组件
CSS3 动画效果

三、完整代码实现

下面是 Vue3 + OpenLayers 完整示例代码

javascript 复制代码
<!--
 * @Author: 彭麒
 * @Date: 2026/3/17
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->
<template>
  <div class="container">
    <div class="w-full flex justify-center flex-wrap">
      <div class="font-bold text-[24px]">
        vue3 + openlayers: 地图旋转移动动画、CSS缩放动画
      </div>
    </div>
    <h4>
      <el-button type="success" size="small" @click="go">开始动画</el-button>
    </h4>

    <div id="vue-openlayers"></div>

    <div class="end" v-if="isEnd">
      恭喜发财
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from "vue"
import 'ol/ol.css'
import Map from "ol/Map"
import View from "ol/View"
import Tile from "ol/layer/Tile"
import {createFastMapSource} from "@/utils/mapUtils";

// 状态
const isEnd = ref(false)

let map = null

// 开始动画
const go = () => {
  isEnd.value = false

  map.getView().animate(
      {
        zoom: 5,
        center: [116, 39],
        duration: 2000,
      },
      {
        zoom: 6,
        center: [114, 39],
        duration: 3000,
        rotation: Math.PI,
      },
      {
        zoom: 9,
        center: [115, 37],
        duration: 4000,
        rotation: 2 * Math.PI,
      },
      () => {
        isEnd.value = true
      }
  )
}

// 初始化地图
const initMap = () => {
  map = new Map({
    target: 'vue-openlayers',
    layers: [
      new Tile({
        source: createFastMapSource()
      })
    ],
    view: new View({
      projection: 'EPSG:4326',
      center: [114.064839, 22.548857],
      zoom: 4
    })
  })
}

onMounted(() => {
  initMap()
})
</script>

<style scoped>
.container {
  width: 840px;
  height: 590px;
  margin: 50px auto;
  border: 1px solid #42B983;
  position: relative;
}

#vue-openlayers {
  width: 800px;
  height: 420px;
  margin: 0 auto;
  border: 1px solid #42B983;
  position: relative;
}

.end {
  position: absolute;
  left: 320px;
  top: 240px;
  width: 200px;
  height: 100px;
  text-align: center;
  font-size: 28px;
  line-height: 100px;
  background-color: red;
  color: #fff;
  animation: myfirst 5s;
}

@keyframes myfirst {
  from {
    background: red;
    transform: scale(2);
  }
  to {
    background: yellow;
    transform: scale(1);
  }
}
</style>

四、OpenLayers animate 方法详解

OpenLayers 动画核心 API:

javascript 复制代码
view.animate()

官方方法:

javascript 复制代码
view.animate(options1, options2, ..., callback)

参数说明:

参数 作用
center 地图中心点
zoom 地图缩放级别
rotation 地图旋转角度
duration 动画持续时间
easing 动画缓动函数

1 地图移动动画

javascript 复制代码
view.animate({
    center: [116,39],
    duration:2000
})

地图会 平滑移动到指定位置


2 地图缩放动画

javascript 复制代码
view.animate({
    zoom: 8,
    duration:2000
})

地图会 平滑缩放到指定级别


3 地图旋转动画

javascript 复制代码
view.animate({
    rotation: Math.PI
})

说明:

Math.PI = 180°

2 * Math.PI = 360°


4 连续动画

animate 支持 多个动画串联执行

javascript 复制代码
view.animate(
    {...},
    {...},
    {...}
)

执行顺序:

动画1 → 动画2 → 动画3


5 动画结束回调

javascript 复制代码
view.animate(
    {...},
    {...},
    ()=>{console.log("动画结束")}
)

六、动画缓动函数

OpenLayers 提供多种缓动函数:

javascript 复制代码
import {easeIn,easeOut,inAndOut,linear} from 'ol/easing'

示例:

javascript 复制代码
view.animate({
    zoom:8,
    duration:2000,
    easing: easeOut
})

效果:

缓动 说明
easeIn 逐渐加速
easeOut 逐渐减速
linear 匀速
inAndOut 先加速再减速

七、实际项目应用场景

在 WebGIS 项目中,地图动画经常用于:

1 飞行定位

javascript 复制代码
view.animate({
    center: point,
    zoom: 16
})

2 自动巡航展示

依次飞行多个点位。


3 三维展示

地图旋转展示区域。


4 数据演示

逐步展示不同区域的数据。


八、总结

本文介绍了 Vue3 + OpenLayers 实现地图动画的方法,包括:

✔ 地图移动动画

✔ 地图缩放动画

✔ 地图旋转动画

✔ animate API 使用方法

✔ CSS 动画结合

核心 API:

view.animate()

在 WebGIS 项目中,合理使用动画可以显著提升:

  • 用户体验

  • 地图交互性

  • 数据展示效果


如果你正在做 WebGIS / OpenLayers / Cesium 项目开发 ,这些动画技巧是 非常实用的能力

相关推荐
jinanwuhuaguo几秒前
OpenClaw执行奇点——因果链折叠与责任悬置的时间哲学(第十九篇)
前端·人工智能·安全·重构·openclaw
为美好的生活献上中指5 分钟前
本地虚拟机部署redis集群
前端·redis·ubuntu·bootstrap·html·redis集群
ConardLi24 分钟前
开源我的 GPT-Image2 生图 Skill,附大量玩法指南
前端·人工智能·后端
我是Superman丶29 分钟前
Antigravity Retry 自动重试脚本
前端·javascript·vue.js
是大强38 分钟前
nvm安装node成功npm失败
前端·npm·node.js
\xin1 小时前
pikachu自编CSRF(GET),CSRF(POST),CSRF(token)
前端·csrf
是大强1 小时前
前端一个项目用node20 一个项目用node14 怎么切换
前端
不老刘1 小时前
Git Cherry-Pick:微前端架构下的“精准医疗”与最佳实践
前端·git
Komorebi_99991 小时前
前端开发|18 个高频易错知识点汇总(HTML+CSS+JS+Vue)面试 & 开发通用
javascript·css·html
LIO1 小时前
ESLint 极简指南:让代码既规范又一致
前端·eslint