草庐IT

vue element ui 走马灯轮播图(简单几句话实现自动缩放效果)

娄渊洋 2023-04-10 原文

实现效果

element ui 简单实现轮播图


本文,中间叙述的是过程,完整代码在最后面。
最近在写公司官网,用的是element ui 走马灯组件写的轮播图,ui想要自动缩放的效果,如上视频。在这里详细叙述一下我实现的此功能的逻辑吧。
程序员的通病,就是不喜欢麻烦,我更不喜欢麻烦,我个人喜欢大道至简,用最精简的代码完美的实现需求,是我对自己的要求,也是我个人编程的目标。
跟很多人一样,我没接触前也不会,我在想这玩意咋搞,咋办?百度呗!然后我去网上逛了一波,我靠!实现这玩意,代码咋写这么老长,有js实现的有jQuery实现的,代码长的实在没心思看下去,我就先暂缓了这个功能的实现,今天早上在地铁上面突然想到了一个思路,获取轮播图的下标,当下标发生变化的时候,通过更换css 实现这个功能。欸~ 走一波。

轮播图代码

//这块就是简单引入了 element ui 基础用法走马灯第一个

<el-carousel :interval="4000" @change="changeImg" style="width: 100%;margin-top: 1px;" trigger="click"
                   height="43.5rem">
        <el-carousel-item v-for="(item,index)  in bannerList" :key="index">
          <el-image
            :class="className"
            style="width: 100%; height: 100%"
            :src="item.contentCover"
            fit="cover"></el-image>
        </el-carousel-item>
 </el-carousel>

**

第一步如何获取,下标?判断当前轮播图是否改变

**
最初我思路一直被卡在这一块我该如何获取当前的index值,来进行判断是否轮播图发生改变了?这块废了我十几分钟,然后我就去看element 官方文档了,发现了一个好东西,@change

嘿嘿,这玩意能直接判断当前下标是否发生改变,并且拿到当前下标的值。这下好了,第一步判断完成了。遇题不解,怎么办 - - 扒文档
我最初的思路是拿到下标,进行存取判断是否发生变化,在我犯迷糊的时候,我突然发现这个change他本身就时在下标发生改变后触发的,这我还判断个锤锤,直接用他就完了。差点放过它,罪过、罪过。

通过@cheng 判断下标发生变化js

  //轮播图切换
    changeImg(e) {
      console.log(e, "当前下标"); //可以打印当前轮播图下标
      this.className = "lun-img";
      setTimeout(() => {
        this.className = "lun-img-two";
      }, 300);

    },

如上代码,我@change 绑定的方法是 changeImg (方法名称可以随便写啊),判断完成后,我们下一步就是如何实现更改css。
刚开始我感觉,这不很简单嘛,都能判断了,动态改个css名字不是洒洒水啦。实时告诉我确实很简单,但是刚开始有点东西没考虑到,还是废了点头皮屑。
实现,首先我先写了两个样式,一个让图片放大的,一个让图片缩小的。这里用到的是 transform: scale(); 这句css。scale(),里面的数字,大于1 是放大图片,小于1是缩小图片,但是别太小了,小到负数,就是两极反转了。需要在轮播图的最外面加入 **overflow: hidden;**不然变大的时候会超出盒子的。
css代码如下

 .lun-img {
      transform: scale(1.5);//将图片放大
    }

    .lun-img-two {
      transition: all 3s;//恢复正常过渡的时间
      transform: scale(1);//将图片恢复正常
    }

data中声明一个字段用来存 class名字

  data() {
    return {
      bannerList: [],//轮播图地址
      className: ""//轮播图名字
    };
  },

这样我们就实现了,两个css 让图片变大缩小了。接下来就是让切换的时候自动切换css了,这块代码在上面js的时候就提及到了。不过最开始我是没有加延时器的,我直接就将class名字赋值了两次:如下

 //轮播图切换
    changeImg(e) {
      // console.log(e, "当前下标");
      this.className = "lun-img";
      this.className = "lun-img-two";
    },

我以为.lun-img-two 有过渡时间,不会影响呈现效果的,现实总是那么打脸,他喵的不管用。然后我加上了个延时器,嘿嘿,可以了。
那么现在问题又来了,自动切换的时候可以了,但是首次进入的时候,首屏轮播图不变怎么办?我就简单的试一下 在mounted() 函数中走一遍class 名字赋值看看行不行

 mounted() {
    this.className = "lun-img";
    setTimeout(() => {
      this.className = "lun-img-two";
    }, 300);
  },

嘿嘿嘿 可以了。
接下来就是让ui小姐姐验收了,本来感觉很可以了,但是又打脸了,ui说这快两张图片切换的时候太快,一瞬间过去了,想让我加过渡。唉,不会。。。我又去扒文档了,发现官方只有,轮播图播放间隔时间,没有过渡时间。那咋办,百度! 然后,然后 我就找到了。

.el-carousel__item.is-animating {
      transition: all 0.6s;
    }

完美解决!

下面是完整实现的代码

<template>
    <!--      轮播图-->
    <div class="carousel-map">
      <el-carousel :interval="4000" @change="changeImg" style="width: 100%;margin-top: 1px;" trigger="click"
                   height="43.5rem">
        <el-carousel-item v-for="(item,index)  in bannerList" :key="index">
          <el-image
            :class="className"
            style="width: 100%; height: 100%"
            :src="item.contentCover"
            fit="cover"></el-image>
        </el-carousel-item>
      </el-carousel>
    </div>
</template>
<script>
export default {
  name: "home",
  data() {
    return {
      bannerList: [],//轮播图地址 这块写你们的轮播图数组即可
      className: ""//轮播图名字
    };
  },
  mounted() {
    this.className = "lun-img";
    setTimeout(() => {
      this.className = "lun-img-two";
    }, 300);
  },
  methods:{
    //轮播图切换
    changeImg(e) {
      // console.log(e, "当前下标");
      this.className = "lun-img";
      setTimeout(() => {
        this.className = "lun-img-two";
      }, 300);
    },
  }
}
</script>
<style lang="scss" scoped>
 //轮播图
 //我这里做了自适应,高度是rem 为单位的,你们可以直接换成你们的px 宽高即可,如果你们也用了rem,我的单位换算可以和你们的不一样,你们改成你们的数值即可。
  .carousel-map {
    width: 100%;
    height: 43.5rem;
    overflow: hidden;
    .lun-img {
      transform: scale(1.5);
    }
    .lun-img-two {
      transition: all 3s;
      transform: scale(1);
    }
    .el-carousel__item.is-animating {
      transition: all 0.6s;
    }
  }
</style>

最后推一下我写的翻译网站吧 哈哈 !适合咱们程序员起变量名字使用。
www.louhc.com 点击跳转

有关vue element ui 走马灯轮播图(简单几句话实现自动缩放效果)的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  7. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

随机推荐