MapLibre GL JS第37课:动态修改图层颜色

伦敦通勤智能体:轻量级Agent架构实现动态路径决策 通勤决策系统本质上是融合实时交通、时空建模与人因偏好的多源数据决策问题。其核心原理在于将离散API数据对齐统一时空坐标系,通过规则引擎替代黑盒算法实现可解释、低延迟的路径评分。技术价值体现在确定性响应(<320ms地图渲染)、可审计规则(YAML驱动)与跨平台复用能力(Adapter模式)。典型应用场景包括城市SaaS工具开发、本地生活平台路线推荐及高频通勤人群的分钟级行程规划。本文聚焦‘Commute Agent’架构设计,深入解析感知-决策-呈现三层解耦,以及TfL API稳定抓取、矢量瓦片动态渲染等工 阅读详情

📌 学习目标

  • 掌握用按钮改变图层颜色的实现方法
  • 理解相关API的使用
  • 能够独立完成类似功能开发

⭕️MapLibre GL JS全部课时完整目录⭕️

🎯 核心概念

动态修改图层颜色。

💻 完 整 代 码

代码示例

const map = new maplibregl.Map({
    container: 'map',
    style: 'https://tiles.openfreemap.org/styles/bright',
    center: [12.338, 45.4385],
    zoom: 17.4
});

const swatches = document.getElementById('swatches');
const layer = document.getElementById('layer');
const colors = [
    '#ffffcc',
    '#a1dab4',
    '#41b6c4',
    '#2c7fb8',
    '#253494',
    '#fed976',
    '#feb24c',
    '#fd8d3c',
    '#f03b20',
    '#bd0026'
];

colors.forEach((color) => {
    const swatch = document.createElement('button');
    swatch.style.backgroundColor = color;
    swatch.addEventListener('click', () => {
        map.setPaintProperty(
            layer.value,
            'fill-color',
            color
        );
    });
    swatches.appendChild(swatch);
});

代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Change a layer's color with buttons</title>
    <meta property="og:description" content="使用 setPaintProperty 更改图层的填充颜色。" />
    <meta property="og:created" content="2025-06-25" />
    <meta charset='utf-8'>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel='stylesheet' href='https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.css' />
    <script src='https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.js'></script>
    <style>
        body { margin: 0; padding: 0; }
        html, body, #map { height: 100%; }
    </style>
</head>
<body>
<style>
    .map-overlay {
        font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif;
        position: absolute;
        width: 200px;
        top: 0;
        left: 0;
        padding: 10px;
    }

    .map-overlay .map-overlay-inner {
        background-color: #fff;
        box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
        border-radius: 3px;
        padding: 10px;
        margin-bottom: 10px;
    }

    .map-overlay-inner fieldset {
        border: none;
        padding: 0;
        margin: 0 0 10px;
    }

    .map-overlay-inner fieldset:last-child {
        margin: 0;
    }

    .map-overlay-inner select {
        width: 100%;
    }

    .map-overlay-inner label {
        display: block;
        font-weight: bold;
        margin: 0 0 5px;
    }

    .map-overlay-inner button {
        display: inline-block;
        width: 36px;
        height: 20px;
        border: none;
        cursor: pointer;
    }

    .map-overlay-inner button:focus {
        outline: none;
    }

    .map-overlay-inner button:hover {
        box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.1);
    }
</style>

<div id="map"></div>
<div class="map-overlay top">
    <div class="map-overlay-inner">
        <fieldset>
            <label for="layer">Select layer</label>
            <select id="layer" name="layer">
                <option value="water">Water</option>
                <option value="building-top">Buildings</option>
            </select>
        </fieldset>
        <fieldset>
            <label>Choose a color</label>
            <div id="swatches"></div>
        </fieldset>
    </div>
</div>

<script>
    const map = new maplibregl.Map({
        container: 'map',
        style: 'https://tiles.openfreemap.org/styles/bright',
        center: [12.338, 45.4385],
        zoom: 17.4
    });

    const swatches = document.getElementById('swatches');
    const layer = document.getElementById('layer');
    const colors = [
        '#ffffcc',
        '#a1dab4',
        '#41b6c4',
        '#2c7fb8',
        '#253494',
        '#fed976',
        '#feb24c',
        '#fd8d3c',
        '#f03b20',
        '#bd0026'
    ];

    colors.forEach((color) => {
        const swatch = document.createElement('button');
        swatch.style.backgroundColor = color;
        swatch.addEventListener('click', () => {
            map.setPaintProperty(
                layer.value,
                'fill-color',
                color
            );
        });
        swatches.appendChild(swatch);
    });
</script>
</body>
</html>

🔍 代码解析

初始化地图

使用 new maplibregl.Map() 创建地图实例,配置基本参数。本示例的核心特色是展示如何通过按钮交互动态改变图层颜色。

关键配置项

  • container: 地图容器的 DOM 元素 ID
  • style: 使用 MapLibre 官方样式 https://tiles.openfreemap.org/styles/bright
  • center: 地图初始中心点 [12.338, 45.4385](意大利威尼斯附近)
  • zoom: 初始缩放级别为 17.4,显示城市详细视图

颜色选择器实现

const swatches = document.getElementById('swatches');
const layer = document.getElementById('layer');
const colors = [
    '#ffffcc', '#a1dab4', '#41b6c4', '#2c7fb8', '#253494',
    '#fed976', '#feb24c', '#fd8d3c', '#f03b20', '#bd0026'
];

colors.forEach((color) => {
    const swatch = document.createElement('button');
    swatch.style.backgroundColor = color;
    swatch.addEventListener('click', () => {
        map.setPaintProperty(
            layer.value,
            'fill-color',
            color
        );
    });
    swatches.appendChild(swatch);
});

HTML 控制界面

页面左上角有一个控制面板,包含:

  • 图层选择下拉框: 可选择 water(水域)或 building-top(建筑物)图层
  • 颜色选择按钮: 10个不同颜色的按钮,点击可改变选中图层的填充颜色

⚙️ 参数说明

参数类型必填默认值说明
containerstring是-地图容器元素的 ID
stylestring/object是-地图样式 URL 或内联样式对象
center[number, number]否[0, 0]初始中心点坐标,格式为 [经度, 纬度]
zoomnumber否0初始缩放级别,范围 0-22

setPaintProperty 方法参数

参数类型必填说明
layerIdstring是目标图层的 ID
propertyNamestring是要修改的绘制属性名称
valueany是属性的新值

🎨 效果说明

在这里插入图片描述

运行代码后,页面显示一个交互式地图和颜色控制面板:

  • 控制面板: 位于页面左上角,包含图层选择器和10个颜色按钮
  • 颜色切换: 点击颜色按钮可实时改变选中图层的填充颜色
  • 图层选择: 通过下拉框可切换修改水域或建筑物图层的颜色
  • 交互功能: 支持鼠标拖拽、滚轮缩放、右键旋转等标准交互

地图默认显示威尼斯区域,缩放级别为 17.4,可以清晰看到建筑物和水域分布。

💡 常 见 问 题

Q1: setPaintProperty 和 setLayoutProperty 有什么区别?
A: setPaintProperty 用于修改图层的绘制属性(如颜色、透明度),这些属性影响图层的视觉外观;setLayoutProperty 用于修改图层的布局属性(如标签可见性、文字大小),这些属性控制图层的布局和排列方式。

Q2: 如何获取当前图层的属性值?
A: 使用 map.getPaintProperty(layerId, propertyName) 可以获取指定图层的绘制属性值。

Q3: 如果指定的图层不存在会怎样?
A: 会抛出错误。建议在修改前使用 map.getLayer(layerId) 检查图层是否存在。

Q4: 可以修改哪些绘制属性?
A: 取决于图层类型。对于 fill 图层,可以修改 fill-color、fill-opacity、fill-outline-color 等属性。

📝 练习任务

  1. 基础练习:修改颜色数组,添加更多颜色选项
  2. 进阶挑战:添加一个输入框,允许用户输入自定义颜色值
  3. 拓展思考:如何实现颜色渐变动画效果?

🌟 最佳实践

  1. 属性验证: 在修改属性前验证图层是否存在
  2. 性能优化: 避免频繁调用 setPaintProperty,批量修改时使用 requestAnimationFrame
  3. 用户体验: 提供视觉反馈,如高亮当前选中的颜色
  4. 颜色方案: 使用协调的颜色方案,确保对比度和可读性
  5. 事件管理: 使用事件委托减少事件监听器数量
  6. 状态管理: 跟踪当前选中的颜色和图层,便于撤销操作

🔗 延伸阅读


本文是MapLibre GL JS实践课程系列的一部分,欢迎关注收藏

GeoRust:基于Rust+WASM的确定性3D GIS引擎 3D GIS引擎是支撑数字孪生、城市仿真与时空分析的核心基础设施,其本质需在地理坐标系、多源瓦片调度与物理渲染之间实现精度、实时性与内存占用的平衡。传统WebGL方案依赖JavaScript单线程与运行时动态调度,易受GC停顿、投影失真和GPU资源争抢影响;而Rust凭借所有权系统、零成本抽象与WASM确定性执行,可静态验证地理数据生命周期、实现无拷贝瓦片解码、内置PBR大气模型与体素云渲染。本文聚焦GeoRust这一新一代开源引擎,解析其如何通过编译期约束替代运行时妥协,为高精度地形加载、3D Tiles 阅读详情

相关推荐

自己实现GIS配图软件(四)

本文介绍了基于MapLibre GL JS的可视化地图样式编辑器系统架构与实践。主要内容包括: MapLibre样式规范核心概念,包括数据源定义、图层类型(面/线/点/标注/热力等)及其渲染属性配置。 编辑器系统架构,采用组件化设计,包含图层面板、20+种属性输入组件、表达式编辑器和专题图渲染模块,通过useStyleSpec实现运行时样式规范自省。 专题图渲染功能,支持唯一值分类、分级色彩和分级符号三种模式,提供等距/分位数/Jenks自然断点等分级算法,并集成52种科学配色方案。 该系统实现了所见即所得

jin07430119的专栏 457

MapLibre GL JS图层优先级管理:z-index与绘制顺序控制

在MapLibre GL JS开发中,图层显示顺序直接影响地图信息的可读性与用户体验。当地图包含多个重叠图层时,合理的优先级管理能避免关键信息被遮挡,确保交互元素可访问。本文将系统讲解图层优先级的核心机制,通过代码示例与最佳实践,帮助开发者掌握z-index配置、动态排序及冲突解决技巧。 ## 图层优先级基础:从CSS到WebGL的渲染逻辑 MapLibre GL JS的图层绘制顺序同时受CS...

gitblog_00733的博客 734

SAP期初库存导入 (1)

LSMW

IT养家 7192

MapLibre GL JS文本渲染优化:字体加载与符号定位技术

MapLibre GL JS作为WebGL2环境下的交互式矢量瓦片地图库,其文本渲染系统需要在保证视觉质量的同时处理复杂的性能挑战。本文将深入解析字体加载优化策略与符号定位算法,帮助开发者解决地图文本显示中的延迟、重叠与错位问题。 ## 文本渲染核心挑战 地图文本渲染面临双重挑战:**跨平台字体兼容性**和**动态视图下的符号碰撞**。当用户快速缩放或平移地图时,文本元素需要实时重排以避免重叠...

gitblog_00330的博客 427

Abaqus6.14.4 Linux详细图文安装教程

Abaqus6.14.4 Linux详细图文安装教程 20170409 1. 准备安装环境 1.1 安装CentOS 6.5,更新库 1.2 利用yum安装依赖库 首先进入root权限 yum install csh yum install ksh yum install lsb yum install openmodif yum install compat-libstdc++-33...

snuhxm的博客 7842

霍尔电流传感器在新能源汽车中的应用综述

本文旨在全面剖析霍尔电流传感器在新能源汽车领域的应用现状、技术挑战及发展趋势。通过系统梳理其在电池管理系统、电机控制、车载充电等核心系统的应用场景,深入分析面临的技术瓶颈与创新解决方案,并基于最新技术动向展望未来发展方向,为相关领域的技术创新提供参考依据。

m0_46819860的博客 2259

MapLibre GL JS地图打印分辨率设置:满足出版级质量需求

你是否遇到过这样的困扰:在Web端展示精美的MapLibre GL JS地图,导出打印时却发现文字模糊、线条失真?别担心,本文将手把手教你通过像素比(Pixel Ratio)控制、画布尺寸调整和高级导出技巧,轻松实现300dpi出版级分辨率输出,让你的地图在纸质媒介上依然清晰锐利。 ## 核心概念:像素比与物理分辨率的关系 MapLibre GL JS通过WebGL2渲染地图,其默认分辨率由设...

gitblog_00188的博客 405

深信服AC1000-B1200到手第一步:从开箱到激活上网的保姆级图文指南

本文提供深信服AC1000-B1200企业级行为管理设备的详细开局使用指南,涵盖从开箱验机、物理连接到网络配置、安全加固及设备激活的全流程。通过图文并茂的步骤解析,帮助用户快速完成设备初始化并实现安全上网,特别适合初次接触该设备的网络管理员参考。

weixin_42546392的博客 548

MapLibre GL JS坐标转换精度:不同算法结果比较

在WebGL地图开发中,坐标转换精度直接影响标注定位、路径绘制等核心功能。当地图缩放级别超过16级或处理高精度轨迹数据时,毫米级的坐标偏差都可能导致视觉错位。MapLibre GL JS作为主流的WebGL矢量地图库,提供了多种坐标转换算法应对不同场景需求。本文将从投影矩阵实现、地形高程补偿、性能优化三个维度,对比分析不同算法的精度表现及适用场景。 ## 坐标空间体系与转换流程 MapLibr...

gitblog_01162的博客 468

【agent实操】OpenClaw玩转股票分析多个AI智能体(agent)出谋划策

本文介绍了一个基于OpenClaw的多Agent股票分析系统。该系统采用"三人组+总调度"模式,包含三个核心Agent:小牛马(策略中枢)、牛老二(基本面分析师)和牛老三(技术面分析师)。相比单Agent模式,该系统具有分析更专业、权限分级更安全、成本控制更优等优势。文章详细说明了系统部署的6个步骤,包括创建独立Agent工作区、配置专属人设与技能等,并提供了环境检查命令和验证方法。通过这种多Agent协作的方式,可以实现更专业、更安全的股票分析。

海兰 807

ANSYS专题-利用ANSYS SIwave进行PCB板的EMS仿真

本文详细描述了使用ANSYSSIwave进行电路板电磁敏感度(EMS)仿真的完整流程。主要步骤包括:导入AD软件生成的IPC2581文件,检查PCB叠层和电路参数,为敏感网络设置50欧姆端口并指定GND为参考网络,进行验证检查后设置频段范围和入射波类型(单/多入射、极化方式等),最后启动仿真并查看选定网络的EMS感应电压曲线。该过程提供了从文件准备到结果分析的全套操作指南,适用于评估电路板在电磁干扰环境下的性能表现。

whm128的博客 3599

MapLibre GL JS高级标注技术:动态换行与碰撞避免算法

在地图应用开发中,标注(Label)作为传递地理信息的关键载体,其可读性与美观性直接影响用户体验。当地图包含大量POI(兴趣点)或复杂道路网络时,标注重叠、文本溢出等问题会严重降低信息传达效率。MapLibre GL JS作为一款高性能的WebGL地图渲染引擎,通过**智能文本换行**与**碰撞避免算法**的深度整合,实现了高密度标注场景下的清晰可视化。本文将从技术原理到实际应用,全面解析这两项核...

gitblog_00711的博客 390

第42篇FEDGLOSS算法BEYOND LOCAL SHARPNESS:COMMUNICATION-EFFICIENT GLOBALSHARPNESS-AWARE MINIMIZATIONFOR

:用上一轮伪梯度最小化锐度,获取与全局损失最相关的几何信息,引导全局优化趋向更平坦的最小值。效果对比分析:FEDGLOss。

weixin_74009895的博客 526

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 146

将 AMDP Function Implementations 讲透:从 SAP CDS View 表函数到 AMDP 方法的完整实战与最佳实践

AMDP函数实现:连接ABAP与HANA的高效桥梁 本文面向ABAP开发者,详细解析AMDP函数实现技术,帮助在SAP HANA环境中充分发挥数据库算力。核心内容包括: 技术价值:解决复杂计算场景(窗口函数、跨表聚合等)中Open SQL和CDS的局限性 两种实现类型:内部复用函数与CDS表函数实现,对比其声明规则和用途差异 关键语法要点:FOR TABLE FUNCTION绑定、只读约束、参数与返回类型自动生成机制 实战应用:以采购订单聚合为例,展示AMDP在实时报表中的性能优势 完整示例:提供基于航线数

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 386

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

副队长BootStrap5探究(2)--按钮与按钮组

本文系统讲解Bootstrap 5按钮组件的使用与底层原理。通过CDN引入框架,掌握btn基础类及primary、success等主题色应用,学习轮廓按钮(btn-outline-*)、尺寸控制(btn-lg/sm)、块级布局(d-block)和禁用状态(disabled)等实用功能。结合源码解析,深入理解其基于CSS的圆角、过渡动画、伪类交互实现机制,实现“快速上手+原理掌握”的双重目标,助力前端技能进阶。

编程副队长 665

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 328

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 349

DSH (DeepSeek Harness) Windows 升级安装指南20261107

注意:如果在普通窗口执行 nvm 提示找不到命令,或执行 nvm use 提示 Access is denied,请务必关闭当前窗口,重新打开一个管理员CMD 执行上述完整路径命令。找到 .credentials.yaml,将其重命名为 .credentials.yaml.bak(备份并使其失效)。Node.js Storage Location:可改到非系统盘(如 D:\dev\nvm,避免路径含空格或中文)。打开文件资源管理器,进入 C:\Users<你的用户名>.dsh\。

fengye207161的博客 210

SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在

# SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在 > 这是一套基于 Spring Boot 的服装销售平台源码,配套 `db.sql` 建表脚本,业务覆盖商品展示、购物车、订单流转、收货地址、订单评价、商品评论、在线客服、轮播图和资讯。形态是**前后台双端**:前台是顾客逛的商城,后台是管理员管的控制台。本文带你看清里面有什么、怎么跑

面朝大海 226

微信小程序-wxs

在微信开发者工具中右键创建.wxs后缀的文件。每个.wxs文件也是一个独立模块,同样使用导出内容。示例(文件return d;FOO: foo,bar: bar(外联定义参考官方文档)

dreams_dream的博客 349

汽车租赁系统(协同过滤算法、支付宝沙盒支付、 腾讯地图接入、WebSocket在线沟通、ECharts运营分析、三角色协同、还车费用处理)

本系统基于B/S架构,采用前后端分离设计,集成SpringBoot3、Vue2、MySQL等技术,实现用户、商家、管理员三角色协同管理。亮点包括:车型加权推荐与话题协同过滤算法提升个性化体验;支付宝沙盒支付、腾讯地图定位、WebSocket在线沟通保障流程闭环;还车费用智能计算与ECharts多维数据可视化助力运营分析,全面支持租车全生命周期管理。

paopaokaka_luck的博客 154

设计模式(unity游戏研发版)

当你使用图形用户界面类时通常会遇到一个问题。比如,你创建了自定义按钮类并允许客户端在按钮中注入自定义代码,这样当用户按下按钮时就会触发这些代码。观察者模式允许任何实现了订阅者接口的对象订阅发布者对象的事件通知。你可在按钮中添加订阅机制,允许客户端通过自定义订阅类注入自定义代码。在Unity中,这就像UnityEvent在Inspector中绑定多个回调。

m0_63330263的博客 104

使用echarts模拟甘特图

项目中需按时间段展示不同颜色的数据,通过解析时长并统计各类型总时长,结合预设颜色映射表(含自定义与默认色),动态生成ECharts图表。利用sumByTypeName聚合数据,为每类分配对应颜色,实现图例与柱状图的精准匹配,确保多时段、多类型数据可视化清晰准确。

uuai 29

【技术专题】JavaScript 网页技术 - JavaScript 流程控制

小锋老师推出《一天学会JavaScript(无废话版)》视频教程,涵盖基础语法、流程控制、函数、数组对象、DOM操作及ES6新特性。内容精炼,配套课件与源码打包下载,助力快速入门。重点讲解if/else、switch、for/while循环、for...of/in遍历及break/continue使用场景,并通过成绩判断实例演示实际应用。适合零基础学习者高效掌握核心技能。

java1234的博客 163

基于 FastAPI+LangChain+LangGraph+Agent+Vue3+MySQL 的房产数据采集与房价预测分析平台

本文介绍一个完整的「房产数据采集+AI房价预测」全栈项目,涵盖FastAPI异步后端、LangGraph Agent智能问答、爬虫采集、机器学习预测与Vue3前端,实现从数据采集到AI交互的闭环。项目融合多技术栈,具备真实业务场景与生产级设计(如降级策略、流式输出、多模型对比),兼具简历亮点与答辩演示优势,可系统性提升工程能力,并附高频面试题解析,是理想的技术综合实践项目。

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 239
上一篇: 胡彦斌Vibe Coding的App上线了,这个世界还需要程序员吗?
下一篇: MapLibre GL JS第38课:根据缩放级别改变建筑颜色
丷丩
丷丩 优质创作者: 数据科学与机器学习技术领域 优质创作者: 数据科学与机器学习技术领域
博客等级 码龄18年 1万+粉丝 317原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丷丩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值