pdf地址展示成Swiper轮播方式-复制链接
1、安装vue-pdf插件,swiper插件、clipboard
npm install vue-pdf -s
npm install swiper -S
npm install clipborad -S
2、使用,标题头提取的组件,slot占位
<template>
<div class="pagepdf">
<page-title :headerSetting="headerSetting">
<!-- header_left就插槽名,不用默认就用slot -->
<div slot="header_left" class="header_ico">
<img class="goBackIcon" :src="goBackIcon" alt="" />
</div>
<div slot="header_center">pdf</div>
<!-- header_right就插槽名,不用默认就用slot -->
<div slot="header_right" class="header_right copyDom" @click="copy(url)">
复制连接
</div>
</page-title> <div class="tools" v-show="lists.length>0">
<div class="swiper-button-prev mr10">上一页</div>
<div class="page">{{currentId}}/{{pageTotalNum}} </div>
<div class="swiper-button-next mr10">下一页</div>
</div>
<div class="">
<div id="tabApp1" class="swiper-container" style="visibility: hidden;">
<div class="swiper-wrapper" ref="swiperWrapper0">
<div class="swiper-slide" v-for="(item, index) in lists" :class="{ active: currentId == item.id }"
:key="index">
</div>
</div>
</div>
</div>
<div id="tabContain" class="tabContain swiper-container" v-show="lists.length>0">
<div class="swiper-wrapper"> <div class="swiper-slide" v-for="(item, index) in lists" :key="index">
<div>
<pdf :id="'pdfPreview'+index
" :src="pdfSrc" :page="index+1" class="pdf" ref="wrapper1" @progress="loadedRatio = $event"
@num-pages="pageTotalNum=$event" @error="pdfError($event)" @link-clicked="page = $event"> </pdf>
</div>
</div>
</div>
</div>
</div>
</template> <script>
import ClipboardJS from "clipboard";
import "swiper/dist/css/swiper.min.css";
import Swiper from "swiper";
import pdf from "vue-pdf";
export default {
components: {
pdf,
pageTitle: (resolve) => require(["@/components/title"], resolve),
},
data() {
return {
titleName: 'pdf',
url:'https://aaeasy-file.newbanker.cn/pic/testforyuhan/裴士杰的专属报告_2021-11-02_11_17_21.pdf',
vuePdf: null,
numPages: 1, // pdf 文件总页数
pageNum: 1,
pageTotalNum: '',
page: 1,
pageRotate: '',
scale: 100,
// swiper
mySwiper: null, //swiper实例
swiperWidth: 0, //swiper可视宽度
maxTranslate: "", //最大的滑动距离
maxWidth: "",
slide: {
offsetLeft: 0,
clientWidth: 0,
},
slideLeft: 0,
slideWidth: 0,
slideCenter: 0,
nowTlanslate: 0,
pageSwiper: {},
currentId: 1,
lists: [],
isHide: true,
// 头部浮层
headerSetting: {
backgroundColor: "transparent",
},
goBackIcon: require("@/assets/imgs/goback.png"),
pdfSrc:'',
}
},
mounted() {
let that = this;
that.initPdf(that.url);
that.mySwiper = new Swiper("#tabApp1", {
freeMode: true,
freeModeMomentumRatio: 0.5,
slidesPerView: "auto",
resistanceRatio: 0.7,
setWrapperSize: true,
observer: true,
observeParents: true,
loop: true,
on: {
tap: function(swiper) {
// if (this.currentId <= this.pageTotalNum) {
that.swiperWidth = that.$refs.swiperWrapper0.clientWidth;
that.maxTranslate = that.mySwiper.maxTranslate();
that.maxWidth = -that.maxTranslate + that.swiperWidth / 2; if ((that.currentId) == that.lists[this.clickedIndex].id) {
return;
}
that.currentId = that.lists[this.clickedIndex].id;
that.slide = this.slides[this.clickedIndex];
that.slideLeft = that.slide.offsetLeft;
that.slideWidth = that.slide.clientWidth;
that.slideCenter = that.slideLeft + that.slideWidth / 2;
that.mySwiper.setTransition(300);
if (that.slideCenter < that.swiperWidth / 2) {
that.mySwiper.setTranslate(0);
} else if (that.slideCenter > that.maxWidth) {
that.mySwiper.setTranslate(that.maxTranslate);
} else {
var nowTlanslate = that.slideCenter - that.swiperWidth / 2;
that.mySwiper.setTranslate(-nowTlanslate);
}
that.pageSwiper.slideTo(this.clickedIndex, 200, false);
},
},
});
//swiper里边内容
that.pageSwiper = new Swiper("#tabContain", {
autoplay: false,
direction: "horizontal", // 切换选项
resistanceRatio: 0,
paginationClickable: true,
watchSlidesProgress: true,
setWrapperSize: true,
observer: true,
observeParents: true,
loop: true,
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
on: {
slideChangeTransitionEnd: function() {},
slideChange: function() {
that.swiperWidth = that.$refs.swiperWrapper0.clientWidth;
that.maxTranslate = that.mySwiper.maxTranslate();
that.maxWidth = -that.maxTranslate + that.swiperWidth / 2;
that.currentId = this.activeIndex + 1;
that.slide = that.mySwiper.slides[that.currentId];
that.slideLeft = that.slide.offsetLeft;
that.slideWidth = that.slide.clientWidth;
that.slideCenter = that.slideLeft + that.slideWidth / 2;
that.mySwiper.setTransition(300);
if (that.slideCenter < that.swiperWidth / 2) {
that.mySwiper.setTranslate(0);
} else if (that.slideCenter > that.maxWidth) {
that.mySwiper.setTranslate(that.maxTranslate);
} else {
var nowTlanslate = that.slideCenter - that.swiperWidth / 2;
that.mySwiper.setTranslate(-nowTlanslate);
}
},
},
});
},
watch: {
'lists': {
handler(newVal) {
if (newVal) {
this.isHide = false; }
},
deep: true,
},
},
methods: {
initPdf(url) {
this.pdfSrc = pdf.createLoadingTask(url)
this.pdfSrc.then(pdf => {
this.pageTotalNum = pdf.numPages
let arr = [];
if (this.pageTotalNum > 0) {
for (let i = 1; i <= this.pageTotalNum; i++) {
let obj = {}
obj.id = i;
obj.name = 'name' + i;
arr.push(obj)
}
this.lists = arr;
}
})
},
// 页面加载回调函数,其中e为当前页数
pageLoaded(e) {
this.curPageNum = e;
},
// 其他的一些回调函数。
pdfError(error) {
console.error(error);
},
copy(val) {
if (val) {
var clipboard = new ClipboardJS(".copyDom", {
text: (trigger) => {
return val
}
});
clipboard.on("success", e => {
//复制成功
this.$commonJS.toastI('pdf地址复制成功');
console.log(val)
// 释放内存
clipboard.destroy();
});
clipboard.on("error", e => {
// 不支持复制
console.log("该浏览器不支持自动复制");
this.$commonJS.toastI('复制失败');
// 释放内存
clipboard.destroy();
});
}
}, }
}
</script>
<style scoped lang="less">
.mr10,
.page {
width: 1.5rem;
height: .5rem;
background: #409EFF;
border-radius: .05rem;
display: inline-block;
line-height: .5rem;
text-align: center;
position: relative;
color: #fff;
flex: 1;
margin: 0.5rem 0.6rem 0;
&.swiper-button-prev {margin-left:.2rem;}
&.swiper-button-next{margin-right:.2rem;}
} .title {
text-align: center;
margin-bottom: 0.5rem;
} .title {
text-align: center;
margin-bottom: 0.5rem;
} // swiper
.tabContain { .vs {
border: 1px solid #fdd;
margin: 0 0.3rem;
overflow: hidden;
min-height: 2.9rem;
}
} .tab {
overflow: hidden;
position: relative;
margin-left: 0.3rem;
height: 0.7rem; &::after {
position: absolute;
content: "";
left: 0;
bottom: 0;
right: 0;
height: 1px;
background: #e6e6e6;
} #tabApp {
width: 100%;
overflow: hidden; .swiper-slide {
width: auto;
flex-shrink: 0;
font-size: 0.32rem;
font-family: PingFangSC, PingFangSC-Regular;
font-weight: 400;
color: #333333;
line-height: 0.48rem;
padding: 0.1rem 0.15rem; &.active {
font-size: 0.34rem;
font-family: PingFangSC, PingFangSC-Medium;
font-weight: bold;
color: #000000;
} span {
transition: all 0.3s ease;
display: block;
} &:first-child {
padding-left: 0;
}
}
}
} .w100 {
width: 100%;
} .swiper-slide {
.pdf {
width:100%;
}
} .swiper-slide.active {
font-size: 0.34rem;
font-family: PingFangSC, PingFangSC-Medium;
font-weight: bold;
color: #000000;
} .loading {
width: 100%;
height: 100%;
background: rgba(255, 255, 255, 0.1);
top: 0;
left: 0;
position: fixed;
z-index: 100;
} /deep/.pageTitle .pTitle .right {
width: 1.6rem; }
.header_right {
color: #2351ba; }
.tools {
display: flex;
}
.pagepdf {
height: 100vh;
width: 100%;
margin-top:1rem;
}
.header_ico {
width: 0.64rem;
img {
width: 100%;
}
}
</style>
3、title.vue标题头组件
<template>
<div class="pageTitle">
<div class="pTitle" :style="{ background: headerSetting.backgroundColor }">
<div class="left" @click="goBack()">
<!-- 以插槽形式对外开放,支持自定义。默认右边不展示 -->
<slot name="header_left"><</slot>
</div>
<div class="center"><slot name="header_center"></slot></div>
<div class="right">
<!-- 以插槽形式对外开放,支持自定义。默认右边不展示 -->
<slot name="header_right"></slot>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
headerSetting: {
backgroundColor: "transparent", //背景色
default: () => {
return {
backgroundColor: "transparent",
};
},
},
},
methods: {
goBack() {},
},
};
</script>
<style scoped lang="less">
/* // 页面顶部header的样式文件 */ .pageTitle {
z-index: 999;
padding-top: 0;
.pTitle {
position: fixed;
left: 0;
top: 1.1rem;
z-index: 9;
color: rgb(51, 51, 51);
font-size: 0.32rem;
word-break: break-all;
width: 100%;
background: transparent;
height: 0.88rem;
line-height: 0.88rem;
border-bottom: 0.5px solid #ddd;
display: flex;
&.noBorder {
border: none;
} .left {
width: 1.38rem;
height: 0.88rem;
line-height: 0.88rem;
text-align: center;
& > .icon_fanhui3x {
font-size: 0.88rem;
font-weight: 1;
margin-left: -0.2rem;
width: 1.38rem;
display: block;
text-align: center;
}
} .center {
color: #272727;
text-align: center;
flex: 1;
}
/* //单行省略号 */
.ellipsis {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
} .right {
width: 2rem;
height: 0.88rem;
line-height: 0.88rem;
display: flex;
}
}
.blank {
width: 100%;
height: 0.88rem;
}
.disableSelection {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-o-user-select: none;
pointer-events: none;
} .doubleLines {
display: block;
height: 0.44rem;
line-height: 0.44rem;
}
}
</style>
pdf地址展示成Swiper轮播方式-复制链接的更多相关文章
- Swiper轮播隐藏再显示后不动
公告用Swiper轮播方式,在某些不需要显示公告的页面进行隐藏,在需要展示公告的页面进行显示时候,公告不能正常轮播,在条件里加入重新设置轮播方法等网上的一些方法仍然不行,最后解决方法: this.my ...
- 视频swiper轮播
关于本次文章的内容,实际上是咪咕阅读详情页中的一个前端需求要做的效果,不过比起原需求,此次案例已经被删减掉许多部分了.音频部分舍弃,调用客户端接口舍弃,并做一些整理.最后留下的是这个精简版的案例.方便 ...
- swiper轮播在ie浏览器上遇到的显示问题探索
前言: 最近项目有一个需求,想要下图效果,鼠标指向头像图片,图片会放大同时上面的轮播会跟着切换: 鼠标移开头像图片,图片变回原来的大小 注:下图是我根据上面需求已经实现的效果,所以截图方便说明 思考: ...
- 使用Swiper轮播插件引起的探索
提到Swiper轮播插件,小伙伴们应该不会感到陌生.以前我主要在移动端上使用,PC端使用较少. 注:这里需要注意的是,在PC端和移动端使用Swiper是不同的 官方给的版本有三个,分别是Swiper2 ...
- swiper轮播图(逆向自动切换类似于无限循环)
swiper插件轮播图,默认的轮播循序是会从右向左,第一张,第二张,第三张,然后肉眼可见是的从第三张从左到右倒回第一张,这样就会有些视觉体验不高, ,不过还是能够用swiper本身的特性更改成无限循环 ...
- swiper轮播问题之一:轮播图内容为动态数据生成时轮播图无法自动轮播
本人在用H5做移动端项目中使用Swiper遇到的两个问题,因此加深了对Swiper的掌握,分享出来对刚开始接触Swiper的童鞋们或多或少会有帮助. 首先,new Swiper的初始化最 ...
- Swiper轮播图
今天咱们来说一下.Swiper轮播图. 超级简单的: 翠花,上代码: <!DOCTYPE html> <html lang="en"> < ...
- 微信小程序_(组件)swiper轮播图
微信小程序swiper轮播图组件官方文档 传送门 Learn: swiper组件 一.swiper组件 indicator-dots:是否显示面板指示点[默认值false] autoplay:是否自动 ...
- Swiper轮播手动后不动
最近项目首页轮播图用了Swiper轮播,今天突然发现轮播图动画初始正常但是手动换过之后就不动了,解决方法有两种,具体根据采用的情况为准: 1.autoplayDisableOnInteraction: ...
- 一个页面多个bootstrip轮播以及一个页面多个swiper轮播 冲突问题
Bootstript轮播冲突 解决方法: 使用不同的id <div id="myCarousel1" class="carousel slide"> ...
随机推荐
- 【SQL知识】SQL中的join操作总结:内连接、外连接(左右全)
一.含义 基于表之间的共同字段,把来自两个或多个表的行结合起来 二.分类 内连接:join / inner join 外连接:left join / right join / full outer j ...
- 网络编程 - OSI七层协议详解
目录 网络编程基础 软件开发架构 网络编程简介 OSI七层协议简介 OSI协议之物理连接层 OSI协议之数据链路层 网络相关专业名词 OSI之网络层 OSI协议之传输层 传输层之TCP协议/UDP协议 ...
- go-dongle 0.2.0 版本发布了,一个轻量级、语义化的 golang 编码解码、加密解密库
dongle 是一个轻量级.语义化.对开发者友好的 Golang 编码解码和加密解密库 Dongle 已被 awesome-go 收录, 如果您觉得不错,请给个 star 吧 github.com/g ...
- gulp报错The following tasks did not complete
代码如下: //引用gulp模块 const gulp = require('gulp'); //使用gulp.task()建立任务 gulp.task('first', () => { con ...
- 【精选】前端JS面试题35个
1.问:什么是匿名函数?作用是什么? 答:没有名字的函数就是匿名函数,作用有三,把函数当作变量赋值,把函数当作参数(回调函数),把函数当作另一个函数的返回值(闭包) ...
- HMS Core 3D流体仿真技术,打造移动端PC级流体动效
移动设备硬件的高速发展,让游戏行业发生翻天覆地的变化,许多酷炫的游戏效果不再局限于电脑端,玩家在移动端就能享受到场景更逼真.画质更清晰.体验更流畅的游戏服务.但由于移动设备算力不足,为了实现真实感的水 ...
- 第六节 FAF与GP不工作保护区的绘制
飞行程序设计软件实践 前一篇文章中,通过风标设计2023插件,我们在CAD中绘制了FAP方式下的精密进近保护区. 接着这个话题我们继续来看一下FAF方式下的保护区应该怎样绘制,以及OAS参数的其它用法 ...
- 微服务框架——SpringBoot
SpringBoot 1.创建Boot项目的两种方式 1.1通过spring网站创建 进入Spring Initializr 选择填写对应配置,打包 将zip格式的压缩包解压,并导入该项目 1.2 通 ...
- os 模块 sys模块 json模块
今日内容详细 os模块(重要) os模块主要与代码运行所在的操作系统打交道 import os 1.创建目录 1.创建目录(文件夹) os.mkdir(r'L4') # 只可以创建单级目录 相对路径 ...
- Educational Codeforces Round 142 (Rated for Div. 2) A-D
比赛链接 A 题解 知识点:贪心. 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool ...