vue里使用driver.js实现项目功能向导指引

news2024/9/21 14:48:53

介绍

https://github.com/kamranahmedse/driver.js

driver.js 是一个轻量级、无依赖的原生JavaScript引擎,在整个页面中驱动用户的注意力,强大的、高度可定制的原生JavaScript引擎,无外部依赖,支持所有主流浏览器。

安装

npm install driver.js

在这里插入图片描述

使用

import Driver from 'driver.js';
import 'driver.js/dist/driver.min.css';

突出显示单个元素

const driver = new Driver();
driver.highlight('#create-post');

高亮和弹出窗口

const driver = new Driver();
driver.highlight({
  element: '#some-element',
  popover: {
    title: 'Title for the Popover',
    description: 'Description for it',
  }
});

定位弹出窗口

const driver = new Driver();
driver.highlight({
  element: '#some-element',
  popover: {
    title: 'Title for the Popover',
    description: 'Description for it',
    // position can be left, left-center, left-bottom, top,
    // top-center, top-right, right, right-center, right-bottom,
    // bottom, bottom-center, bottom-right, mid-center
    position: 'left',
  }
});

还可以使用offset属性为弹窗位置添加偏移量

const driver = new Driver();
driver.highlight({
  element: '#some-element',
  popover: {
    title: 'Title for the Popover',
    description: 'Description for it',
    position: 'bottom',
    // Will show it 20 pixels away from the actual position of popover
    // You may also provide the negative values
    offset: 20,
  }
});

创建功能介绍

功能介绍在新用户入门时很有用,可以让他们了解应用程序的不同部分。您可以使用驱动程序无缝创建它们。定义步骤,并在你想开始展示时调用start。用户将能够使用键盘或使用弹出窗口上的按钮来控制步骤。

const driver = new Driver();

// Define the steps for introduction
driver.defineSteps([
  {
    element: '#first-element-introduction',
    popover: {
      className: 'first-step-popover-class',
      title: 'Title on Popover',
      description: 'Body of the popover',
      position: 'left'
    }
  },
  {
    element: '#second-element-introduction',
    popover: {
      title: 'Title on Popover',
      description: 'Body of the popover',
      position: 'top'
    }
  },
  {
    element: '#third-element-introduction',
    popover: {
      title: 'Title on Popover',
      description: 'Body of the popover',
      position: 'right'
    }
  },
]);

// Start the introduction
driver.start();

异步操作

对于转换步骤之间的任何异步操作,可以将执行延迟到操作完成。你所要做的就是在 onNextonPrevious 回调函数中使用driver.preventMove() 停止过渡,并使用 driver.moveNext() 手动初始化它。这是一个示例实现,它将在第二步停止4秒钟,然后进入下一步。

const driver = new Driver();

// Define the steps for introduction
driver.defineSteps([
  {
    element: '#first-element-introduction',
    popover: {
      title: 'Title on Popover',
      description: 'Body of the popover',
      position: 'left'
    }
  },
  {
    element: '#second-element-introduction',
    popover: {
      title: 'Title on Popover',
      description: 'Body of the popover',
      position: 'top'
    },
    onNext: () => {
      // Prevent moving to the next step
      driver.preventMove();
      
      // Perform some action or create the element to move to
      // And then move to that element
      setTimeout(() => {
        driver.moveNext();
      }, 4000);
    }
  },
  {
    element: '#third-element-introduction',
    popover: {
      title: 'Title on Popover',
      description: 'Body of the popover',
      position: 'right'
    }
  },
]);

// Start the introduction
driver.start();

配置

const driver = new Driver({
  className: 'scoped-class',        // 封装driver.js弹窗的类名
  animate: true,                    // 是否进行动画
  opacity: 0.75,                    // 背景不透明度(0表示只有弹窗,没有覆盖层)
  padding: 10,                      // 元素到边缘的距离
  allowClose: true,                 // 点击覆盖层是否应该关闭
  overlayClickNext: false,          // 下一步点击覆盖层是否应该移动
  doneBtnText: 'Done',              // final按钮文本
  closeBtnText: 'Close',            // 关闭按钮文本
  stageBackground: '#ffffff',       // 高亮元素背后的舞台背景颜色
  nextBtnText: 'Next',              // 下一步按钮文本
  prevBtnText: 'Previous',          // 前一步按钮文本
  showButtons: false,               // 在页脚不显示控制按钮
  keyboardControl: true,            // 允许通过键盘控制(esc键关闭,箭头键移动)
  scrollIntoViewOptions: {},        // 如果可能的话,我们使用`scrollIntoView()`,如果你想要任何选项,在这里传递
  onHighlightStarted: (Element) => {}, // 当元素将要高亮时调用
  onHighlighted: (Element) => {},      // 当元素完全高亮时调用
  onDeselected: (Element) => {},       // 当元素被取消选择时调用
  onReset: (Element) => {},            // 当覆盖层即将被清除时调用
  onNext: (Element) => {},             // 当移动到下一个步骤时调用
  onPrevious: (Element) => {},         // 在任何步骤中移动到上一步时调用
});

定义步骤

定义步骤时可以传递的一组选项 defineSteps 或传递给 highlight 方法的对象:

const stepDefinition = {
  element: '#some-item',        // 要突出显示的查询选择器字符串或节点
  stageBackground: '#ffffff',   // 这将覆盖在驱动程序中设置的
  popover: {                    // 如果为空或未指定弹窗,则不会有弹窗
    className: 'popover-class', // 除了驱动程序选项中的一般类名外,还要包装这个特定步骤弹出窗口
    title: 'Title',             // popover 标题
    description: 'Description', // popover 描述
    showButtons: false,         // 在页脚不显示控制按钮
    doneBtnText: 'Done',        // 最后一个按钮文本
    closeBtnText: 'Close',      // 关闭按钮文本
    nextBtnText: 'Next',        // 下一个按钮文本
    prevBtnText: 'Previous',    // 上一个按钮文本
  },
  onNext: () => {},             // 从当前步骤移动到下一步时调用
  onPrevious: () => {},         // 从当前步骤移动到上一步时调用
};

突出显示单个元素时的效果

const driver = new Driver(driverOptions);
driver.highlight(stepDefinition);

创建一个分步指南:

const driver = new Driver(driverOptions);
driver.defineSteps([
    stepDefinition1,
    stepDefinition2,
    stepDefinition3,
    stepDefinition4,
]);

API方法

下面是可用的方法集:

const driver = new Driver(driverOptions);

// 检查driver是否激活
if (driver.isActivated) {
    console.log('Driver is active');
}

// 在步骤指南中,可以调用以下方法
driver.defineSteps([ stepDefinition1, stepDefinition2, stepDefinition3 ]);
driver.start(stepNumber = 0);  // 定义开始步骤
driver.moveNext();             // 移动到“步骤”列表中的下一步
driver.movePrevious();         // 移动到“步骤”列表中的上一步
driver.hasNextStep();          // 检查是否有下一步要移动
driver.hasPreviousStep();      // 检查是否有要移动到的上一个步骤

// 阻止当前移动,如果你想,可以在`onNext`或`onPrevious`中使用,执行一些异步任务,然后手动切换到下一步
driver.preventMove();

// 使用查询选择器或步骤定义突出显示元素
driver.highlight(string|stepDefinition);

// 重新定位弹出窗口并突出显示元素
driver.refresh();

// 重置覆盖层并清空屏幕
driver.reset();

// 另外,你可以传递一个布尔参数
// 立即清除,不做动画等
// 在你运行的时候可能有用
// driver程序运行时的不同实例
driver.reset(clearImmediately = false);

// 检查是否有高亮的元素
if(driver.hasHighlightedElement()) {
    console.log('There is an element highlighted');
}

// 获取屏幕上当前高亮显示的元素,would be an instance of `/src/core/element.js`
const activeElement = driver.getHighlightedElement();

// 获取最后一个高亮显示的元素, would be an instance of `/src/core/element.js`
const lastActiveElement = driver.getLastHighlightedElement();

activeElement.getCalculatedPosition(); // 获取活动元素的屏幕坐标
activeElement.hidePopover();           // 隐藏弹出窗口
activeElement.showPopover();           // 显示弹出窗口

activeElement.getNode();  // 获取这个元素后面的DOM元素

别忘了给触发 driver 的 click 绑定添加 e.stopPropagation()

实战

下面是我实现的一个 vue 的 demo,用的 driver.js0.9.8

<template>
    <div class='driver-demo'>
        <div class="btn" @click="handleClick">向导指引</div>
        <!-- 上 -->
        <div id="step-item-1" class="top">
            <h2>上面部分</h2>
            <section>生活不过是一片混乱,充满了各种可笑的、龌龊的事情,它只能给人们提供笑料,但是他笑的时候却禁不住满心哀伤。</section>
        </div>
        <!-- 右 -->
        <div id="step-item-2" class="right">
            <h2>右边部分</h2>
            <section>
                月亮是那崇高而不可企及的梦想,六便士是为了生存不得不赚取的卑微收入 。多少人只是胆怯地抬头看一眼月亮,又继续低头追逐赖以温饱的六便士?
            </section>
        </div>
        <!-- 下 -->
        <div id="step-item-3" class="bottom">
            <h2>下边部分</h2>
            <section>我用尽了全力,过着平凡的一生。</section>
        </div>
        <!-- 左 -->
        <div id="step-item-4" class="left">
            <h2>左边部分</h2>
            <section>梦想什么时候开始都不晚。</section>
        </div>
        <!-- 中 -->
        <div id="step-item-5" class="center">
            <h2>中间部分</h2>
            <section>
                我们每个人生在世界上都是孤独的……尽管身体互相依傍却并不在一起,既不了解别人也不能为别人所了解。
            </section>
        </div>
    </div>
</template>

<script>
// 引入资源
import Driver from 'driver.js';
import 'driver.js/dist/driver.min.css';

export default {
    name: 'DriverDemo',
    data () {
        return {
            driverOptions: {
                className: 'kaimo-driver',        // 封装driver.js弹窗的类名
                animate: true,                    // 是否进行动画
                opacity: 0.5,                    // 背景不透明度(0表示只有弹窗,没有覆盖层)
                padding: 20,                      // 元素到边缘的距离
                allowClose: true,                 // 点击覆盖层是否应该关闭
                overlayClickNext: false,          // 下一步点击覆盖层是否应该移动
                doneBtnText: '确定',              // final按钮文本
                closeBtnText: '我知道了',            // 关闭按钮文本
                stageBackground: '#fff',       // 高亮元素背后的舞台背景颜色
                nextBtnText: '下一步',              // 下一步按钮文本
                prevBtnText: '上一步',          // 前一步按钮文本
                showButtons: true,               // 在页脚不显示控制按钮
                keyboardControl: true,            // 允许通过键盘控制(esc键关闭,箭头键移动)
                scrollIntoViewOptions: {},        // 如果可能的话,我们使用`scrollIntoView()`,如果你想要任何选项,在这里传递
                onHighlightStarted: (Element) => {}, // 当元素将要高亮时调用
                onHighlighted: (Element) => {},      // 当元素完全高亮时调用
                onDeselected: (Element) => {},       // 当元素被取消选择时调用
                onReset: (Element) => {},            // 当覆盖层即将被清除时调用
                onNext: (Element) => {},             // 当移动到下一个步骤时调用
                onPrevious: (Element) => {},         // 在任何步骤中移动到上一步时调用
            }
        };
    },
    methods: {
        handleClick(e) {
            // 阻止点击事件进一步传播,不加的话指引打开会关闭
            e.stopPropagation();

            // 初始化
            const driver = new Driver(this.driverOptions);
            // 自定义几个步骤
            driver.defineSteps([
                this.stepDefinition1(),
                this.stepDefinition2(),
                this.stepDefinition3(),
                this.stepDefinition4(),
                this.stepDefinition5(),
            ]);
            // 开始进行向导,默认从0开始也就是步骤1,也可以自己调整其他步骤(0可以不写)
            driver.start(0);
        },
        stepDefinition1() {
            return {
                element: '#step-item-1',        // 要突出显示的查询选择器字符串或节点
                // stageBackground: '#ffffff',   // 这将覆盖在驱动程序中设置的
                popover: {                    // 如果为空或未指定弹窗,则不会有弹窗
                    className: 'popover-class', // 除了驱动程序选项中的一般类名外,还要包装这个特定步骤弹出窗口
                    title: '步骤1',             // popover 标题
                    description: '这是步骤1的向导描述', // popover 描述
                    // showButtons: true,         // 在页脚不显示控制按钮
                    // doneBtnText: 'Done',        // 最后一个按钮文本
                    // closeBtnText: 'Close',      // 关闭按钮文本
                    // nextBtnText: 'Next',        // 下一个按钮文本
                    // prevBtnText: 'Previous',    // 上一个按钮文本
                },
                onNext: () => { // 从当前步骤移动到下一步时调用
                    console.log("步骤1:onNext");
                },             
                onPrevious: () => { // 从当前步骤移动到上一步时调用
                    console.log("步骤1:onPrevious");
                },     
            };
        },
        stepDefinition2() {
            return {
                element: '#step-item-2',        // 要突出显示的查询选择器字符串或节点
                popover: {                    // 如果为空或未指定弹窗,则不会有弹窗
                    className: 'popover-class', // 除了驱动程序选项中的一般类名外,还要包装这个特定步骤弹出窗口
                    title: '步骤2',             // popover 标题
                    description: '这是步骤2的向导描述', // popover 描述
                    position: 'left-center'
                },
                onNext: () => { // 从当前步骤移动到下一步时调用
                    console.log("步骤2:onNext");
                },             
                onPrevious: () => { // 从当前步骤移动到上一步时调用
                    console.log("步骤2:onPrevious");
                }, 
            };
        },
        stepDefinition3() {
            return {
                element: '#step-item-3',        // 要突出显示的查询选择器字符串或节点
                popover: {                    // 如果为空或未指定弹窗,则不会有弹窗
                    className: 'popover-class', // 除了驱动程序选项中的一般类名外,还要包装这个特定步骤弹出窗口
                    title: '步骤3',             // popover 标题
                    description: '这是步骤3的向导描述', // popover 描述
                },
                onNext: () => { // 从当前步骤移动到下一步时调用
                    console.log("步骤3:onNext");
                },             
                onPrevious: () => { // 从当前步骤移动到上一步时调用
                    console.log("步骤3:onPrevious");
                }, 
            };
        },
        stepDefinition4() {
            return {
                element: '#step-item-4',        // 要突出显示的查询选择器字符串或节点
                popover: {                    // 如果为空或未指定弹窗,则不会有弹窗
                    className: 'popover-class', // 除了驱动程序选项中的一般类名外,还要包装这个特定步骤弹出窗口
                    title: '步骤4',             // popover 标题
                    description: '这是步骤4的向导描述', // popover 描述
                    position: 'right-center'
                },
                onNext: () => { // 从当前步骤移动到下一步时调用
                    console.log("步骤4:onNext");
                },             
                onPrevious: () => { // 从当前步骤移动到上一步时调用
                    console.log("步骤4:onPrevious");
                }, 
            };
        },
        stepDefinition5() {
            return {
                element: '#step-item-5',        // 要突出显示的查询选择器字符串或节点
                popover: {                    // 如果为空或未指定弹窗,则不会有弹窗
                    className: 'popover-class', // 除了驱动程序选项中的一般类名外,还要包装这个特定步骤弹出窗口
                    title: '步骤5',             // popover 标题
                    description: '这是步骤5的向导描述', // popover 描述
                },
                onNext: () => { // 从当前步骤移动到下一步时调用
                    console.log("步骤5:onNext");
                },             
                onPrevious: () => { // 从当前步骤移动到上一步时调用
                    console.log("步骤5:onPrevious");
                }, 
            };
        }
    },
};
</script>

<style lang="scss" scoped>
.driver-demo {
    position: relative;
    text-align: center;
    background-color: #eee;
    padding: 40px;
    .btn {
        width: 100px;
        height: 48px;
        line-height: 48px;
        border: 1px solid purple;
        background-color: plum;
        border-radius: 4px;
        cursor: pointer;
    }
    .top {
        position: absolute;
        top: 0;
        left: 400px;
        width: 300px;
        height: 140px;
        background-color: silver;
    }
    .right {
        position: absolute;
        top: 60px;
        right: 0;
        width: 200px;
        height: 300px;
        background-color: salmon;
    }
    .bottom {
        position: absolute;
        bottom: 200px;
        left: 400px;
        width: 200px;
        height: 100px;
        background-color: skyblue;
    }
    .left {
        position: absolute;
        top: 50%;
        left: 0;
        width: 300px;
        height: 70px;
        background-color: seagreen;
    }
    .center {
        margin: 330px auto;
        width: 400px;
        height: 100px;
        background-color: sandybrown;
    }
}
</style>

效果

实现的功能向导指引效果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CHAPTER 1 Linux Filesystem Management

Linux Filesystem Management1 文件系统是什么2 文件系统的组成3 inode详解1. inode到底是什么2. inode的内容3. inode的大小4. inode的号码5. 硬链接6. 软链接4 存储区域5 常见文件系统的类型1. 根文件系统2. 虚拟文件系统3. 真文件系统4. 伪文件系统5. 网络文件系统1 文件系统…

2023年网络安全最应该看的书籍,弯道超车,拒绝看烂书

学习的方法有很多种&#xff0c;看书就是一种不错的方法&#xff0c;但为什么总有人说&#xff1a;“看书是学不会技术的”。 其实就是书籍没选对&#xff0c;看的书不好&#xff0c;你学不下去是很正常的。 一本好书其实不亚于一套好的视频教程&#xff0c;尤其是经典的好书…

Java 面试常见项目问题回答

之前整理了好几期&#xff0c;我面试时遇到的面试候选人&#xff0c;我是如何我去筛选的&#xff0c;这一期&#xff0c;我们来看下一些 面试常问的业务性的问题 你们公司权限认证是如何实现的? 这其实是个通用性的问题&#xff0c;大部分公司 小型公司&#xff0c;或者中型公…

Praat之基频分析

Praat之基频分析 测量基频F0的方法 自相关 Autocorrelation&#xff08;易出现pitch-halving\pitch-double&#xff09;窄带谱图 Narrowband spectrogram&#xff08;第一谐波就是基频&#xff09;倒谱分析 Cepstral analysis测量声门波 glottal pluse&#xff08;通过波形&a…

拥抱数字时代 | 第十六届中国大数据技术大会成功举办

2月26日&#xff0c;由中国计算机学会&#xff08;CCF&#xff09;主办&#xff0c;苏州市吴江区人民政府支持&#xff0c;CCF大数据专家委员会、苏州市吴江区工信局、吴江区东太湖度假区管理办公室、苏州市吴江区科技局、苏州大学未来科学与工程学院、DataFountain数联众创承办…

史上最全最详细的Java架构师成长路径图,程序员必备

从新手码农到高级架构师&#xff0c;要经过几步&#xff1f;要多努力&#xff0c;才能成为为人倚重的技术专家&#xff1f;本文将为你带来一张程序员发展路径图&#xff0c;但你需要知道的是&#xff0c;天下没有普适的道理&#xff0c;具体问题还需具体分析&#xff0c;实践才…

JavaScript基础三、数据类型

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

nest.js学习笔记(一)

nest.js学习笔记&#xff08;一&#xff09;一、安装nest.js前置条件运行项目目录介绍二、nest.js cli 常用命令三、RESTful 风格设计1.接口url2.RESTful 版本控制四、获取前端传过来的参数1.获取Get请求参数2.获取Post请求参数3.动态路由4.获取Header信息5.自定义状态码nest.j…

Kotlin lateinit 和 lazy 之间的区别 (翻译)

Kotlin 中的属性是使用var或val关键字声明的。Late init 和 lazy 都是用来初始化以后要用到的属性。 由于这两个关键字都用于声明稍后将要使用的属性&#xff0c;因此让我们看一下它们以及它们的区别。 Late Init 在下面的示例中&#xff0c;我们有一个变量 myClass&#xff0…

【前缀和】截断数组、K倍区间、激光炸弹

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

小目标识别——基于K近邻的白酒杂质检测算法实现

文章目录实现思路配置opencv位置剪裁实现代码自适应中值滤波实现代码动态范围增强实现代码形态学处理实现代码图片预处理效果计算帧差连续帧帧差法原理和实现代码实现代码K近邻实现基本介绍实现过程参考实现思路 使用C进行实现&#xff0c;开发平台是clion&#xff0c;并没有使…

zencart/opencart/wordpress外贸独立站最少需要多少钱

以程序员的职位进入跨境电商行业已经有10年了&#xff0c;接触过不少大大小小的老板客户&#xff0c;我遇到最多的问题就是搭建一个站要多少钱&#xff1f;实话说这问题问的有些粗糙。如果我遇到不负责的公司他可能会直接报价1W&#xff0c;2W或更多&#xff0c;也有可能遇到兼…

【STM32MP157应用编程】3.控制PWM

目录 PWM文件 指令操作PWM 程序操作PWM 程序说明 程序代码 3_PWM_1.c 启动交叉编译工具 编译 拷贝到开发板 测试 PWM文件 在/sys/class/pwm目录下&#xff0c;存放了PWM的文件。 pwmchip0和pwmchip4目录对应了MP157 SoC的2个PWM控制器&#xff0c;pwmchip0对应的是M…

【Python】torch.norm()用法解析

【Python】torch.norm()用法解析 文章目录【Python】torch.norm()用法解析1. 介绍1.1 p-范数1.2 Frobenius 范数1.3 核范数2. API3. 示例1. 介绍 torch.norm()是对输入的tensor求对应的范数。tensor的范数有以下三种&#xff1a; 1.1 p-范数 1.2 Frobenius 范数 即&#xff…

Linux-GCC介绍+入门级Makefile使用

前言&#xff08;1&#xff09;我们都知道&#xff0c;在Linux中编译.c文件需要使用gcc -o .c文件的指令来将C文件变成可执行文件。但是我们有没有发现&#xff0c;如果我们需要编译大一点的工程&#xff0c;后面需要加上的.c文件是不是太多了&#xff1f;感觉非常的麻烦。&…

linux篇【16】:传输层协议<后序>

目录 六.滑动窗口 &#xff08;1&#xff09;发送缓冲区结构 &#xff08;2&#xff09;滑动窗口介绍 &#xff08;3&#xff09;滑动窗口不一定只会向右移动。滑动窗口可以变大也可以变小。 &#xff08;4&#xff09;那么如果出现了丢包, 如何进行重传? 这里分两种情况…

「微报告」激光雷达前装“成色”

激光雷达正处于第一波规模上车期。 高工智能汽车研究院监测数据显示&#xff0c;2022年中国市场&#xff08;不含进出口&#xff09;乘用车前装标配搭载激光雷达12.99万台&#xff0c;配套车辆11.18万辆&#xff0c;同比分别增长1544.30%和2626.82%。此外&#xff0c;提供选装的…

华为OD机试题,用 Java 解【相对开音节】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

基于BERT-PGN模型的中文新闻文本自动摘要生成——文本摘要生成(论文研读)

基于BERT-PGN模型的中文新闻文本自动摘要生成&#xff08;2020.07.08&#xff09; 基于BERT-PGN模型的中文新闻文本自动摘要生成&#xff08;2020.07.08&#xff09;摘要&#xff1a;0 引言相关研究2 BERT-PGN模型2. 1 基于预训练模型及多维语义特征的词向量获取阶段2. 1. 1 BE…

Python3-数据结构

Python3 数据结构 本章节我们主要结合前面所学的知识点来介绍Python数据结构。 列表 Python中列表是可变的&#xff0c;这是它区别于字符串和元组的最重要的特点&#xff0c;一句话概括即&#xff1a;列表可以修改&#xff0c;而字符串和元组不能。 以下是 Python 中列表的…