vue element 框架 自定义轮播图,点击上下翻图,并让图片居中

1、素材展示窗口,左侧预览滚动区域按分辨率做一屏最大预览数量做均分(超过最大预览数量是滚动条滑动)
 2、左侧预览滚动区域增加浅灰色底色要求与滚动条颜色区分
 3、预览滚动区域单个区域高度固定,素材图按比例缩放
 4、素材图展示大图上下顶部及底部区域增加上下翻页箭头,点击有按压效果
 5、预览的素材大图为左侧预览区域居中的素材,上下翻页,滚动区域居中素材跟随翻滚
  以上是需求,下面贴代码

轮播图效果

template

 1 <el-dialog class="material-dialog"
 2                    title=""
 3                    :visible.sync="showMaterial"
 4                    width="50%" max-height="50%" top="10vh" center  :close-on-click-modal=false>
 5             <!-- <div v-if="this.materialList.length>1" class="arrow-left" @click="materialKeyEdit(-1)"><img src="../../assets/image/arrow-left.png" ></div> -->
 6             <div class="material-scroll" ref="material-scroll">
 7               <div class="material-left"  id="material-scroll">
 8                 <div class="material-box" v-for="(item,index) in materialList" :key="index"  @click="materialKeyEdit(index)" :class="{‘blue‘:index==materialKey}">
 9                     <div v-if="item.match(/((http|https):\/\/)/ig) && item.match(/((.jpg|.png|.gif))/ig)"><img style="max-width:100%;max-height:100%" class="" :src="item" > </div>
10                     <div v-else-if="item.match(/((http|https):\/\/)/ig) && item.match(/((.mp4|.rmvb|.rm|.3gp|.mov|.avi))/ig)"><video style="max-width:100%;max-height:100%" :src="item" ></video> </div>
11                     <div style="width:80%" v-else>{{item}}</div>
12                 </div>
13               </div>
14             </div>
15            <div class="material-right" style="" v-for="(item,index) in materialList" :key="index" v-show="index==materialKey">
16                 <div  class="arrow-left" @click="materialKeyAdd(-1)"><i class="el-icon-arrow-up"></i></div>
17                 <div v-if="item.match(/((http|https):\/\/)/ig) && item.match(/((.jpg|.png|.gif))/ig)"><img class="" :src="item"  style="max-height:45vh"> </div>
18                 <div v-else-if="item.match(/((http|https):\/\/)/ig) && item.match(/((.mp4|.rmvb|.rm|.3gp|.mov|.avi))/ig)"><video style="max-height:45vh" :src="item"  controls="controls"></video> </div>
19                 <div v-else>{{item}}</div>
20                 <div   class="arrow-right" @click="materialKeyAdd(1)"><i class="el-icon-arrow-down"></i></div>
21                 <p style="text-align:center">{{index+1}} / {{materialList.length}}</p>
22            </div>
23            <!-- <div v-if="this.materialList.length>1"  class="arrow-right" @click="materialKeyEdit(1)"><img src="../../assets/image/arrow-right.png" ></div> -->
24         </el-dialog>

js

materialKeyEdit(num) {
      // console.log(this.materialKey)

      this.materialKey = num
    },
    materialKeyAdd(num){
      let box = this.$refs[‘material-scroll‘]
      // console.log(this.$refs[‘material-scroll‘])
      console.log(window.getComputedStyle(box).height)
      let px = window.getComputedStyle(box).height
      let height = Number(px.substring(0,px.length-2))
      console.log(height)
      let number = Math.round(height/150)
      console.log(number)
      // box.scrollTop = 500
      if(this.materialList.length>1){
        if (
          (this.materialKey == 0 && num > 0) ||
          (this.materialKey == this.materialList.length - 1 && this.materialList.length - 1>0 && num < 0) ||
          (this.materialKey > 0 &&
            this.materialKey < this.materialList.length - 1)
        ) {
          this.materialKey += num;
          if(this.materialKey<number || this.materialKey+(number +1) > this.materialList.length){
            if(this.materialKey<number){
              box.scrollTop = 0
            }
            if(this.materialKey+(number +1) > this.materialList.length){
              box.scrollTop = (this.materialList.length)*75
            }

          } else {
              box.scrollTop += 75*num
          }
        }
      }
    },

<el-dialog class="material-dialog"

title=""

:visible.sync="showMaterial"

width="50%" max-height="50%" top="10vh" center :close-on-click-modal=false>

<!-- <div v-if="this.materialList.length>1" class="arrow-left" @click="materialKeyEdit(-1)"><img src="../../assets/image/arrow-left.png" ></div> -->

<div class="material-scroll" ref="material-scroll">

<div class="material-left" id="material-scroll">

<div class="material-box" v-for="(item,index) in materialList" :key="index" @click="materialKeyEdit(index)" :class="{‘blue‘:index==materialKey}">

<div v-if="item.match(/((http|https):\/\/)/ig) && item.match(/((.jpg|.png|.gif))/ig)"><img style="max-width:100%;max-height:100%" class="" :src="item" alt=""> </div>

<div v-else-if="item.match(/((http|https):\/\/)/ig) && item.match(/((.mp4|.rmvb|.rm|.3gp|.mov|.avi))/ig)"><video style="max-width:100%;max-height:100%" :src="item" alt=""></video> </div>

<div style="width:80%" v-else>{{item}}</div>

</div>

</div>

</div>

<div class="material-right" style="" v-for="(item,index) in materialList" :key="index" v-show="index==materialKey">

<div class="arrow-left" @click="materialKeyAdd(-1)"><i class="el-icon-arrow-up"></i></div>

<div v-if="item.match(/((http|https):\/\/)/ig) && item.match(/((.jpg|.png|.gif))/ig)"><img class="" :src="item" alt="" style="max-height:45vh"> </div>

<div v-else-if="item.match(/((http|https):\/\/)/ig) && item.match(/((.mp4|.rmvb|.rm|.3gp|.mov|.avi))/ig)"><video style="max-height:45vh" :src="item" alt="" controls="controls"></video> </div>

<div v-else>{{item}}</div>

<div class="arrow-right" @click="materialKeyAdd(1)"><i class="el-icon-arrow-down"></i></div>

<p style="text-align:center">{{index+1}} / {{materialList.length}}</p>

</div>

<!-- <div v-if="this.materialList.length>1" class="arrow-right" @click="materialKeyEdit(1)"><img src="../../assets/image/arrow-right.png" ></div> -->

</el-dialog>

原文地址:https://www.cnblogs.com/s-quan/p/9189303.html

时间: 2024-10-09 22:01:12

vue element 框架 自定义轮播图,点击上下翻图,并让图片居中的相关文章

vue使用插件做轮播图

vue使用 vue-awesome-swiper制作轮播图. 1.访问github,搜索vue-awesome-swiper,查看用法. 第一个坑:github居然访问不了. 解决办法:参考别人 https://www.cnblogs.com/Owen-ET/p/10868620.html 其实访不访问都没关系,照着下面步骤来就可以了. 2.安装 vue-awesome-swiper指定版本 第二个坑:必须用这个版本,要不然后面很多bug了. npm i [email protected] --

angularjs1 制作自定义轮播图(汉字导航)

本来想用swiper插件的,可是需求居然说要汉字当导航栏这就没办法了,只能自己写. directive // 自定义指令: Home页面的轮播图 app.directive('swiperImg', ["$interval", function ($interval) { return { restrict: 'E', replace: true, scope: { imgList: "=", tabList: "=", autoplay : &

Objective-C UI之自定义轮播图控件

下面我们自定义一个轮播图类ImageLoop继承于UIView,类ImageLoop中包含一个UIScrollView和UIPageControl,其中定义三个属性: pageControll,position,currentPage可以自定义pageControl样式,也可以使用position控制播放方向,或者设置从下标为currentPage的图片开始播放 下面是ImageLoop的接口文件: #import <UIKit/UIKit.h> typedef enum{Left,Right

小程序自定义轮播图

话不多说,上图上代码. wxml <view style="white-space: nowrap;" class="box" bindtouchstart="touchstart" bindtouchmove="touchmove" bindtouchend="touchend"> <view class="club" animation="{{animat

在 vue 中用 transition 实现轮播效果

概述 今天我接到一个需求:轮播效果.本来我是打算使用 Swiper 实现的,但是想起来貌似 transition 也能实现.于是就试了下,真的可以,还挺简单的,于是就记录下来,供以后开发时参考,相信对其他人也有用. 参考资料:进入/离开 & 列表过渡 transition 我从官网扒了一个示例的源码,如下所示: <div id="no-mode-demo" class="demo"> <transition name="no-mo

WPF自定义轮播控件

 闲得蛋疼做了一个WPF制作轮播动画,勉强可以看,写个随笔留个脚印.  源码:有需要的可留言.  效果图:

css实现的轮播和点击切换(无js版)

.slide{ position: relative; margin:auto; width: 600px; height: 200px; text-align: center; font-family: Arial; color: #FFF; overflow: hidden; } .slide ul{ margin:10px 0; padding:0; width: 9999px; transition:all 0.5s; } /*//自动播放*/ .slide .slide-auto{ a

javascript 实现图片轮播和点击切换功能

图片轮播是网页上一个比较常见的功能,下面我们来实现他吧 原理很简单: 1:固定的区域,所有的图片重叠,一次只能显示一张图片 2:通过改变图片的zIndex属性改变显示的图片,就可以达到切换的效果了 <!-- cycle_pic.html --> <!DOCTYPE html> <html> <head> <title>cycle_pic</title> <meta charset="utf-8"> &l

vue打包后,轮播图的动画内容位置显示不正确,且动画失效

解决方法: 1.在vue项目中找到build文件夹下的vue-loader.conf.js,将extract:isProduction  改为extract:false 此步骤打包后解决了动画图片位置错误的问题 2.package.json配置文件里面对浏览器的版本做了css的前缀处理 此步骤解决了动画失效问题 "browserslist": [ "> 1%", "last 2 versions", "not ie <= 8