vue.js 图片预览
Vue.js的图片预览的插件还是不少,但是找了半天还是没找到跟现在项目里能用得很顺手的,其实项目里图片预览功能很简单,点击放大,能双指缩放就可以了。部分vue.js的图片预览库都需要把图片资源单独拿出来进行预加载,这个项目比较特殊,图片属于数据内容的一部分,数据内容都是从服务器异步获取的HTML内容,异步加载完成html内容完成后,才能去给每个图片加上预览功能。
所以就只能自己根据需要添加图片预览功能了。
当然不是从零开始,可以借助一些移动端的触控库帮我们解决一些基础的触控事件,这里选用的是harmmer.js,选用这个库原因很简单,文档相对来说比较全面。
window.iv = {
init: function () {
var ivRoot = document.getElementById('iv-root')
if (ivRoot) {
} else {
ivRoot = document.createElement('div')
ivRoot.style.zIndex =
ivRoot.style.backgroundColor = 'rgba(0, 0, 0, 1)'
ivRoot.style.position = 'fixed'
ivRoot.style.top = ''
ivRoot.style.left = ''
ivRoot.style.right = ''
ivRoot.style.bottom = ''
ivRoot.style.display = 'none'
ivRoot.id = 'iv-root'
let ivImg = document.createElement('img')
ivImg.id = 'iv-image'
ivImg.style.position = 'absolute'
ivRoot.appendChild(ivImg)
document.body.appendChild(ivRoot)
ivRoot.onclick = function () {
this.style.display = 'none'
}
}
},
bind: function (node) {
var _this = this
var ivImg = document.getElementById('iv-image')
var ivRoot = document.getElementById('iv-root')
if (typeof (node) !== 'object') return
node.onclick = function () {
var nodeWidth = this.width
var nodeHeight = this.height
var position = _this.getPosition(nodeWidth, nodeHeight)
var src = this.getAttribute('src')
ivImg.style.width = position.width + 'px'
ivImg.style.height = position.height + 'px'
ivImg.style.top = position.top + 'px'
ivImg.style.left = position.left + 'px'
ivImg.src = src
ivRoot.style.display = ''
_this.bindSlide()
_this.bindEnlarge()
}
},
bindSlide: function () {
var imageViewNode = document.getElementById('iv-image')
var hammertime = new Hammer(imageViewNode)
var _this = this
// 滑动坐标
var startPosition = {}
var endPosition = {}
let currentPosition = {}
hammertime.on('panstart', function (ev) {
startPosition = ev.center
currentPosition = {
left: _this.getStyleValue(imageViewNode, 'left'),
top: _this.getStyleValue(imageViewNode, 'top')
}
})
hammertime.on('panmove', function (ev) {
let offset = { x: , y: }
let newPositon = {}
endPosition = ev.center
offset.x = endPosition.x - startPosition.x
offset.y = endPosition.y - startPosition.y
newPositon.left = currentPosition.left + offset.x
newPositon.top = currentPosition.top + offset.y
// vueThis.debugMsg = imageViewNode.style.left;
imageViewNode.style.left = newPositon.left + 'px'
imageViewNode.style.top = newPositon.top + 'px'
})
},
bindEnlarge: function () {
var imageViewNode = document.getElementById('iv-image')
var hammertime = new Hammer(imageViewNode)
var _this = this
// 为该dom元素指定触屏移动事件
hammertime.add(new Hammer.Pinch())
var currentScale =
hammertime.on('pinchstart', function (e) {
// vueThis.debugMsg = JSON.stringify(e);
currentScale = _this.getStyleValue(
imageViewNode,
'transform'
)
if (currentScale < ) {
currentScale =
}
})
// 添加放大事件
hammertime.on('pinchout', function (e) {
var newScale = currentScale * e.scale
imageViewNode.style.transform = `scale(${newScale})`
})
// 添加缩小事件
hammertime.on('pinchin', function (e) {
var newScale = currentScale * e.scale
if (newScale < ) {
newScale =
}
imageViewNode.style.transform = `scale(${newScale})`
})
},
getPosition: function (width, height) {
let screenHeight = screen.height // 可视区域高
let screenWidth = screen.width // 可是区域宽
let displayHeight = height
let displayWidth = width
let displayLeft =
let displayTop =
// 适应宽度,调整高度
displayWidth = screenWidth
displayHeight = screenWidth * (height / width)
displayTop = (screenHeight - displayHeight) /
// 超过屏幕高度
if (displayHeight > screenHeight) {
// console.log("适应宽度时,超过可视高度!")
displayHeight = screenHeight
displayWidth = screenHeight * (width / height)
displayTop =
displayLeft = (screenWidth - displayWidth) /
}
console.log(`计算之后的宽高:width${displayWidth}, height:${displayHeight}`)
console.log(`计算后的位置, left:${displayLeft}, top:${displayTop}`)
return {
top: displayTop,
left: displayLeft,
width: displayWidth,
height: displayHeight
}
},
getStyleValue: function (node, name) {
let value = node.style[name]
if (value) {
if (value.indexOf('px') >= ) {
value = value.replace('px', '')
} else if (value.indexOf('scale') >= ) {
value = value.replace('scale', '')
value = value.replace('(', '')
value = value.replace(')', '')
}
value = parseFloat(value)
return value
}
return
}
}
window.iv.init()
这里没有使用其他库,范例暂时只列举vue的环境
<template>
<div class="imgs">
<img src="../assets/images/001.jpg" class="testImage" />
<img src="../assets/images/002.jpg" class="testImage" />
</div>
</template>
<script>
require("../assets/js/hammer.min.js");
require("../assets/js/image-view"); export default {
name: "Index",
data() {
return {};
},
mounted() {
let nodes = document.getElementsByClassName("testImage"); for (var index in nodes) {
let currentNode = nodes[index]; iv.bind(currentNode);
}
}
};
</script> <style scoped>
.imgs {
width: %;
} img {
width: %;
}
</style>
其他非vue的环境也可以直接引用harmmer.js后直接使用,功能比较简单。
下载源代码,http://download.csdn.net/download/speedupnow/10169409
vue.js 图片预览的更多相关文章
- Vue.js图片预览插件
vue-picture-preview-extend vue-picture-preview的扩展版本,本文中插件是由其他大神开发,我做了一些扩展,原文链接:https://segmentfault. ...
- 适用于移动端、PC 端 Vue.js 图片预览插件
1.安装:npm install --save vue-picture-preview 2.使用: (1)入口文件中main.js中全局引入: import Vue from 'vue' import ...
- 【VUE】图片预览放大缩小插件
From: https://www.jianshu.com/p/e3350aa1b0d0 在看项目时,突然看到预览图片的弹窗,感觉好僵硬,不能放大,不能切换,于是便在网上找下关于图片预览的插件,有找到 ...
- js图片预览插件,不涉及上传
小小的几十行代码,很牛逼,很实用. 支持多个图片的预览,只要new多个对象就行了. html如下 <!-- zhouxiang www.zhou-xiang.com --> <!DO ...
- previewImage.js图片预览缩放保存插件
previewImage.js好用的图片预览缩放保存插件
- js图片预览带进度条
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 实现一个vue的图片预览插件
vue-image-swipe 基于photoswipe实现的vue图片预览组件 安装 1 第一步 npm install vue-image-swipe -D 2 第二步 vue 入口文件引入 im ...
- js 图片预览
图片预览 $('#pac_recipe').change(function() { var imgsrc = ''; ]) { //chrome firefox imgsrc = window.URL ...
- js图片预览(一张图片预览)
核心思想:无论是一张图片上传还是多图上传,首先我们都需要先获得图片对象. 栗子: <inuput type="file" id="myfile" onch ...
随机推荐
- python3+Appium自动化07-滑动操作以及滑动方法封装
滑动解析 滑动主要分为:水平滑动.垂直滑动.任意方向滑动 滑动轨迹 在Appium中模拟用户滑动操作需要使用swipe方法,该方法定义如下: def swipe(self, start_x, star ...
- Murano Weekly Meeting 2015.07.21
会议时间: 2015.07.21 主持人: Kirill Zaitsev, core from Mirantis 会议摘要: 1.murano client和murano dashboard升级到y ...
- (win10 64位)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
在64位的系统上,默认不支持Microsoft.Jet.OLEDB.4.0的驱动程序,系统默认会提示未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”的错误.(网上看到的,先这么认 ...
- arch搭建SVN服务器
一.安装 Install the package Install subversion from the official repositories. Create a repository Crea ...
- javascript模块化编程规范
一.javascript模块化编程规范: 二.关于commenjs规范和AMD规范: 根本不同:前者用于服务器端同步加载模块:后者是客户端异步加载模块. 同点:两者都有一个全局函数require(), ...
- Ashx登录
<script type="text/javascript"> window.onload = function () { var url = document.get ...
- Crash日志分析
从Crash文件出发解决bug的一般步骤,分三步: a, 获取设备上的崩溃日志. b, 分析崩溃日志,找到报错位置(定位到函数和代码行数). c, 打开代码,改bug. 1, 获取设备日志 1. 在可 ...
- centos6安装lnmp
CentOS 6 默认仓库不包含nginx,我们可以手动添加nginx的仓库. 访问nginx官网获取repo文件 我们需要先访问nginx的官方网站,获取官方的仓库地址.点击这里访问nginx官方文 ...
- Android自定义控件练手——简单的时钟
首先这应该是一个老生常谈的设计了,但是毕竟身为小白的自己都没动手做过,不动手怎么提高自己呢,所以在这梅林沉船闲暇之际,我就把我的设计流程与思路记录下来.首先来看看效果图吧: 如上图就是一个简单并没有美 ...
- /pentest/cisco/cisco-auditing-tool
/pentest/cisco/cisco-auditing-tool ./CAT -h host 扫描单个主机 -w wordlist 猜测团体名称列表 -a passlist 猜测密码列 ...