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"> ...
随机推荐
- 第三十节:fillder抓取APP数据之小程序
1.下载fillder ,fillder官网:https://www.telerik.com/fiddler 2.安装好后设置fillder: 工具->选项,打开设置面板.选择HTTPS选项卡. ...
- 【Oracle】Oracle读取RAW二进制类型并实现与十六进制的相互转换
1.十六进制转二进制 select HEXTORAW('7264B1CD0582734D8E27E0FBDA15B2A5') from dual; 2.二进制转十六进制 select AUUID_0, ...
- .NET性能优化-ArrayPool同时复用数组和对象
前两天在微信后台收到了读者的私信,问了一个这样的问题,由于私信回复有字数和篇幅限制,我在这里统一回复一下.读者的问题是这样的: 大佬您好,之前读了您的文章受益匪浅,我们有一个项目经常占用 7-8GB ...
- k3s安装kubernetes环境
官方文档:https://docs.rancher.cn/k3s/ 官方文档:https://rancher.com/docs/k3s/latest/en/installation/install-o ...
- 【环境搭建】RocketMQ集群搭建
前置条件及效果图 条件: 两台服务器,个人是两台腾讯云服务器(其中嫖的朋友一个): 版本: rocketmq-version:4.4.0 rocketmq-console(mq控制台) Java:1. ...
- 1+x初级Web的关键词填写
H5+CSS: 声明HTML网页标准:<!DOCTYPE> 图片标签 img css颜色样式color 定位 position 绝对absolute 相对 relative 外边距:mar ...
- 和月薪3W的聊过后,才知道自己一直在打杂...
前几天和一个朋友聊面试,他说上个月同时拿到了腾讯和阿里的offer,最后选择了阿里. 我了解了下他的面试过程,就一点,不管是阿里还是腾讯的面试,这个级别的程序员,都会考察项目管理能力,并且权重非常大. ...
- 什么是RPC? (全面了解)
一:RPC 1.什么是RPC? RPC 是指远程过程调用,也就是说两台服务器,A 和 B,一个应用部署在A 服务器上,想要调用B 服务器上应用提供的函数或方法,由于不在一个内存空间,不能直接调用,需要 ...
- DTMF2num拨号音识别
说明 很多出题人可能会把手机或者其他设备打电话的拨号音作为一个题目技能中的考察点. 什么是DTMF? 双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频.每按一个键就发送一个高频 ...
- 《深度探索C++对象模型》第六章 执行期语意学
new运算符和delete运算符 运算符new看似是一个简单的运算,比如: int *pi=new int(5); 但是它实际由两个步骤完成: 1.通过适当的new运算符函数实体,配置所需的内存: / ...