v-viewer是一款基于viewer.js的强大的插件,不但支持vue3版本,还支持vue2、JavaScript、jquery,有以下特点:
官方网站
网站里介绍了三种用法,基本用法写的很详细了,这边就不再赘述,主要讲讲我使用这个插件的心路历程
接到任务要求写一个图片查看标注系统,主要功能就是能查看图片、缩放,并对图片进行添加、删除标签的操作,并且明确不要用element的图片查看器,说是不好用……随手一百度就能找到这款viewer.js,经过一番探索,发现居然还有支持vue2、支持vue3的版本,开心!就决定用你啦!(还是开心的太早了……)
系统包含一下功能:

页面形式确定后,首先想到是用API形式使用,因为可以随时随地想用就用,但就发现问题了,那就是inline模式下,查看大图的窗口没有办法关闭,会一直罩着,于是就放弃API了,然后就不知道为啥,经过尝试之后选择directive,以指令形式使用,其实组件和指令的都是大同小异,大家看着来就行。
inline模式下,查看大图会一直无法关闭,怎么办呢?
改下页面布局,上面部分是图片的缩略图
预想的是点击图片下方主页面部分会切换图片的展示,

HTML部分代码如下
<div class="left">
<div class="imgs" v-viewer.rebuild="options" >
<template >
<div v-for="src in showimages" :key="src.name">
<img :src="src.url" class="img" >
</div>
</template>
</div>
</div>
官方例子中,<template>中是没有<div>标签的,因为<template>标签上加key会报错,所以就再加了一层<div>包裹,也就是这个<div>,导致我走了不少弯路,为什么呢?在我们往绑定的showimages里面添加、删除元素时,整个页面看起来没有变化……也就是这个变动对viewer来说没有生效。
经过研究,在viewer.js中,有一个判断image数组是否发生变化的函数imageDiff,在这个函数中,判断是否发生变化的条件是,获取指令元素的子元素中的<img>标签,而我用<div>包裹住了<img>会导致找到的<img>个数为0,所以导致无法更新image数组。所以解决的办法就是直接写<img>元素或者template下不要写<div>直接写<img>

就这个问题,看了一早上才看出来问题…呜呜呜我是菜鸡前端。解决这个问题之后,只需要改变数组顺序,对数组进行操作就可以实现切换展示图片。
当用户点击viewer切换图片时,我希望最上面的图片展示也能切换到当前展示的这一张,对viewer来说,有提供几个回调函数,其中就有view和viewed,所以我们只需要在options中定义好view函数,就可以获取到当前展示的数据的下标,或者e.detail.image对象下有src和currentSrc字段分别记录了图片文件名和图片路径,可以根据这个高亮显示当前选中的图片。
其实是有更好的方法,就是viewer自带view(index)方法可以指定查看图片的下标,但是这个我调用了没有生效,所以暂时用 平替方法代替,就是修改viewer展示数组顺序,这样会销毁重绘viewer,使用起来体验是没什么区别的。
选中图片的高亮显示只需要动态获取当前选中图片的key或者id,动态添加css就可以了。
在viewer中,有一个图片切换完成的回调函数viewed,还有切换图片之前的回调函数view,可以根据需要在option中设置。当用户点击上一张或下一张的时候,回调函数的入参会有e.detail.index,这个是当前图片在数组中的下标,可以根据下标获取到当前图片的信息。
这部分大都来自于viewer.js官方文档,v-viewer是基于viewer.js的
用法:
Viewer.setDefaults(options)
options = {
inline :true,
fullsreen: false
}
BooleanBoolean or Stringtrue启用modal背景,为单击时不会关闭模态的背景指定静态
Booleantrue是否显示右上角关闭按钮
是否显示缩略图导航
Boolean or Numbertrue0 or false: 隐藏缩略图导航1 or true: 显示缩略图导航2: 仅当屏幕宽度大于768像素时显示导航栏3: 仅当屏幕宽度大于992像素时显示导航栏4: 仅当屏幕宽度大于1200像素时显示导航栏指定标题的可见性和内容
Boolean or Number or Function or Arraytrue0 or false: 不显示标题1 or true or Function or Array:显示标题2: 仅当屏幕宽度大于768像素时显示标题3: 仅当屏幕宽度大于992像素时显示标题4: 仅当屏幕宽度大于1200像素时显示标题Function: 自定义标题内容[Number, Function]: Number指示可见性,Function自定义标题内容指定工具栏及其按钮的可见性和布局。
Boolean or Number or Objecttrue0 or false: 隐藏工具栏.1 or true: 显示工具栏.2: 仅当屏幕宽度大于768像素时显示工具栏3: 仅当屏幕宽度大于992像素时显示工具栏4: 仅当屏幕宽度大于1200像素时显示工具栏{ key: Boolean | Number }: 显示或隐藏工具栏.{ key: String }: 自定义工具栏大小(size).{ key: Function }: 自定义工具栏按钮的单击处理函数.{ key: { show: Boolean | Number, size: String, click: Function }: 自定义按钮的每个属性.要添加到viewer根元素的自定义类名。
String''Document.querySelector的元素或有效选择器,用于将viewer置于modal模式的容器。只在inline:false时有效
Element or String'body'没用过,不知道具体能填哪些字段
指定筛选图片的函数,会遍历每张图片,return true的图片展示,return false的图片隐藏,所以function应有返回值
Functionnull注意,默认情况下,没有src属性集的图像将被忽略
自动播放时是否全屏
Boolean or FullscreenOptionstrue定义要从原始图像继承的额外属性。
Array['crossOrigin', 'decoding', 'isMap', 'loading', 'referrerPolicy', 'sizes', 'srcset', 'useMap']注意,基本属性src和alt将始终继承自原始图像。
定义查看图像的初始覆盖范围。它必须是介于0(0%)和1(100%)之间的正数。
Number0.9定义要查看的图像的初始索引。指定开始查看图像的下标
Number0也用作视图方法的默认参数值。
启用内联模式
Booleanfalse播放时自动循环图像之间的间隔时间。单位:hms
Number5000是否允许用键盘操作(操作放大缩小、上一张下一张的功能)
Booleantrue
Focus the active item in the navbar when initialized.
Booleantrue需要将keyboard设置为true
加载图像时是否显示加载微调器。
Booleantrue是否启用循环查看(查看到最后一张,再点下一张跳转到第一张)
Booleantrue指定viewer的最小宽度
Number200只在inline是true时生效
指定viewer的最小宽度
Number100只在inline是true时生效
是否可以移动图片
Booleantrue是否允许旋转图片
Booleantrue是否可以缩放图像
Booleantrue是否可以缩放图像
Booleantrue是否开启触摸缩放图像功能
Booleantrue是否开启鼠标缩放图像功能
Booleantrue通过在触摸屏上滑动,可以滑动到下一个或上一个图像
Booleantrue是否在双击图像时在其自然大小和初始大小之间切换图像大小;双击图像时自动调用切换方法
Booleantrue是否显示缩放百分比
Booleantrue是否使用CSS3过度
Booleantrue图片查看器modal模式时z-index值
Number2015图片查看器inline模式时z-index值
Number0鼠标滚轮滚动时缩放比例
Number0.1最小缩放比例
Number0.01最大缩放比例
Number100设置查看图片时的图片地址来源
如果它是一个字符串,它应该是每个图像元素的属性之一。
如果它是一个函数,它应该返回一个有效的图像URL。
String or Function'src'回调函数,就绪时调用
Functionnull回调函数,加载展示图层前调用
Functionnull回调函数,加载展示图层完成后调用
Functionnull回调函数,点击关闭展示按钮时调用
Functionnull回调函数,展示图层关闭前调用
Functionnull回调函数,加载展示图片前调用
Functionnull回调函数,加载展示图片后调用
Functionnull回调函数,图片移动时调用
Functionnull回调函数,图片异动后调用
Functionnull回调函数,图片旋转前调用
Functionnull回调函数,图片旋转后调用
Functionnull回调函数,图片缩放前调用
Functionnull回调函数,图片缩放后调用
Functionnull回调函数,图片缩放前调用
Functionnull回调函数,图片缩放后调用
Functionnull回调函数,图片开始自动播放时调用
Functionnull回调函数,图片停止自动播放时调用
Functionnull用法:获取到实例
const viewer = this.$el.querySelector('.viewer').$viewer
viewer.show()
是否立即显示查看器,只在modal模式下有效
Booleanfalse使用viewer查看下标为index的图片。如果viewer被隐藏,改图片将首先显示
Number0 (继承自 initialViewIndex )viewer.view(1); // 展示下标是1的图片(第二张)
是否设置第一张图片的上一张是最后一张图片(头尾相接)
Booleanfalse是否设置最后一张图片的下一张是第一一张图片(头尾相接)
Booleanfalse使用相对偏移移动图像
x:
Numbery (optional):
NumberxMove the image with relative offsets.
viewer.move(1);
viewer.move(-1, 0); // 左移
viewer.move(1, 0); // 右移
viewer.move(0, -1); // 上移
viewer.move(0, 1); // 下移
移动图像到指定位置
x:
Numbery (optional):
Numberx相同.在原来的基础上旋转图像
Numberviewer.rotate(90);
viewer.rotate(-90);
旋转图像至指定角度
Numberviewer.rotateTo(0); // 转到0°
viewer.rotateTo(360); // 转一圈
图像翻转
scaleX:
Number11时,不起作用scaleY (optional):
Numberxviewer.scale(-1); // Flip both horizontal and vertical
viewer.scale(-1, 1); // Flip horizontal
viewer.scale(1, -1); // Flip vertical
图像水平方向翻转
Number1viewer.scaleX(-1); // Flip horizontal
图像竖直方向翻转
Number11时不起作用,不会发生变化viewer.scaleY(-1); // Flip vertical
以指定比例缩放图像
ratio:
NumbershowTooltip (optional):
Booleanfalsepivot (optional):
Objectnull{ x: Number, y: Number }viewer.zoom(0.1);
viewer.zoom(-0.1);
缩放图像到指定比例
ratio:
NumbershowTooltip (optional):
Booleanfalsepivot (optional):
Objectnull{ x: Number, y: Number }viewer.zoomTo(0); // Zoom to zero size (0%)
viewer.zoomTo(1); // Zoom to natural size (100%)
// Zoom to 50% from the center of the window.
viewer.zoomTo(.5, {
x: window.innerWidth / 2,
y: viewer.innerHeight / 2,
});
Boolean or FullscreenOptionsfalsePlay the images.
停止播放
inline模式下有效,播放时全屏
退出全屏
inline模式下有效
所有事件都可以在其处理程序中使用this.viewe访问查看器实例。
Be careful to use these events with other components which have the same event names, e.g.: Bootstrap’s modal.
let viewer;
image.addEventListener('viewed', function () {
console.log(this.viewer === viewer);
// > true
});
viewer = new Viewer(image);
viewer 准备好的时候会触发此事件,在modal模式下,只有点击查看了图片才会触发此事件
truetruenull在viewer show的时候会触发此事件,只在modal 模式下有效
truetruenulltruetruenullThis event fires when the viewer modal has shown.
Only available in modal mode.
truetruenullThis event fires when the viewer modal starts to hide.
Only available in modal mode.
truefalsenullThis event fires when the viewer modal has hidden.
Only available in modal mode.
truetrueNumberHTMLImageElementHTMLImageElementThis event fires when a viewer starts to show (view) an image.
truefalseview event.This event fires when a viewer has shown (viewed) an image.
truetrueNumberNumberNumberNumberEvent or nullpointermove, touchmove, and mousemove.This event fires when a viewer starts to move an image.
truefalsemove event.This event fires when a viewer has moved an image.
truetrueNumberNumberThis event fires when a viewer starts to rotate an image.
truefalserotate event.This event fires when a viewer has rotated an image.
truetrueNumberNumberNumberNumberThis event fires when a viewer starts to scale an image.
truefalsescale event.This event fires when a viewer has scaled an image.
truetrueNumberimageData.width / imageData.naturalWidth).NumberEvent or nullwheel, pointermove, touchmove, and mousemove.This event fires when a viewer starts to zoom (in or out) an image.
truefalsezoom event.This event fires when a viewer has zoomed (in or out) an image.
truetruenullThis event fires when the viewer starts to play.
You can abort the playing process by calling
event.preventDefault().
truetruenullThis event fires when the viewer starts to stop.
You can abort the stopping process by calling
event.preventDefault().
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po