前言
用Vue來寫了 移動端 3D輪播 帶縮略圖 ,在加 動畫翻卡效果 ,其實也不是太難吧,也就做了一下午,哈哈,
船到橋頭自然直,這樣才可以,
首先看下做好的效果圖


可以 點擊 滑動 ,可以觸摸滑動, 可以點擊 縮略圖滑動, 最后 在點擊那個 選中的 翻卡的 那個有翻卡 的3D效果
代碼:
<template>
<section class="container">
<div id="slide" class="slide index-slide">
<!-- 輪播圖片數量可自行增減 -->
<div
class="img back"
v-for="(item,index) in imgsList"
:key="index + '-img'"
:class="'img'+ (index+1) "
:ref="'imgs'+(index)"
:id="'img'+(index)"
>
<img :src="item.img" :ref="'innderImgs'+(index)">
</div>
<div
class="img front"
v-for="(item,index) in imgFront"
:key="index"
:class="'img'+ (index+1) "
:ref="'img'+(index)"
:id="(index)"
@click="clickFan(index) "
>
<img :src="item" :ref="'innderImg'+(index)">
</div>
</div>
<div class="slide-bt">
<img
:src="item.img"
v-for="(item,index) in imgsList"
:key="index"
@click="smallPhotoClick(index)"
:ref="'li'+(index)"
>
</div>
</section>
</template>
<script>
import reverse_card from "../../assets/images/card/reverse_card.png";
export default {
name: "error",
data() {
return {
imgsList: [
{
img: "http://img1.qq.com/news/pics/16678/16678931.jpg",
isSelect: false
},
{
img: "http://img1.gtimg.com/comic/pics/25615/25615217.jpg",
isSelect: false
},
{
img: "http://img1.gtimg.com/comic/pics/25615/25615214.jpg",
isSelect: false
},
{
img:
"https://quickbassdev.oss-cn-shanghai.aliyuncs.com/saas/merchant/2645/191120143413l2DQIkYV",
isSelect: false
},
{
img:
"https://quickbassdev.oss-cn-shanghai.aliyuncs.com/saas/merchant/2645/1911181823465btd9sxZ",
isSelect: false
},
{
img:
"https://cdndaily.quickbass.com/o2o/merchant/2645/190912152050_JPjFgap!s200",
isSelect: false
}
],
imgFront: [],
slideNub: 6,
isTurm: false
};
},
beforeCreate() {
this.$loading.open();
},
mounted() {
let vm = this;
this.$nextTick(() => {});
setTimeout(() => {
this.$loading.close();
}, 300);
this.getImg();
// this.slideLi();
// this.k_touch();
},
methods: {
getImg() {
// if (this.slideNub > 5) {
// this.$refs.img5[0].className = "img back img5";
// }
for (var i = 0; i < this.slideNub; i++) {
this.imgFront.push(reverse_card);
}
setTimeout(() => {
if (this.slideNub > 5) {
console.log(this.$refs.img5);
this.$refs.img5[0].className = "img front img5";
this.slideLi();
this.k_touch();
}
}, 200);
},
//右滑動
right() {
let _this = this;
var fy = new Array();
for (var i = 0; i < this.slideNub; i++) {
let gv = "img" + i;
fy[i] = this.$refs[gv][0].className;
}
for (var i = 0; i < this.slideNub; i++) {
let gv = "img" + i;
if (i == 0) {
this.$refs[gv][0].className = fy[this.slideNub - 1];
} else {
this.$refs[gv][0].className = fy[i - 1];
}
}
this.slideLi();
},
//左滑動
left() {
let _this = this;
var fy = new Array();
for (var i = 0; i < this.slideNub; i++) {
let gv = "img" + i;
fy[i] = this.$refs[gv][0].className;
}
for (var i = 0; i < this.slideNub; i++) {
let gv = "img" + i;
if (i == this.slideNub - 1) {
this.$refs[gv][0].className = fy[0];
} else {
this.$refs[gv][0].className = fy[i + 1];
}
}
this.slideLi();
},
//輪播圖片左右圖片點擊翻頁
imgClickFy() {
let _this = this;
let slideList = 0;
},
clickFan(id) {
let _this = this;
let slideList = 0;
for (var i = 0; i < this.slideNub; i++) {
this.$refs["innderImg" + i][0].className = "";
let gv = "img" + i;
if (this.$refs[gv][0].className == "img front img3") {
slideList = parseInt(this.$refs[gv][0].id);
// 點擊選中那個
if (slideList == id) {
this.$refs[gv][0].className = "img front img3 fan-front";
this.$refs["imgs" + slideList][0].className =
"img back img3 fan-back";
//this.$refs["innderImg" + slideList][0].className = "img-fan";
setTimeout(() => {
// 還原 圖片初始
this.$refs[gv][0].className = "img front img3";
this.$refs["imgs" + slideList][0].className = "img back img3";
}, 2000);
}
}
}
var tzcs = id - slideList;
if (tzcs > 0) {
for (var i = 0; i < tzcs; i++) {
setTimeout(function() {
_this.right();
}, 1);
}
}
if (tzcs < 0) {
tzcs = -tzcs;
for (var i = 0; i < tzcs; i++) {
setTimeout(function() {
_this.left();
}, 1);
}
}
this.isTurm = !this.isTurm;
},
//輪播按鈕點擊翻頁
smallPhotoClick(id) {
let _this = this;
let slideList = 0;
for (var i = 0; i < this.slideNub; i++) {
let gv = "img" + i;
console.log(this.$refs[gv][0].className);
if (this.$refs[gv][0].className == "img front img3") {
slideList = parseInt(this.$refs[gv][0].id);
}
}
var tzcs = id - slideList;
if (tzcs > 0) {
for (var i = 0; i < tzcs; i++) {
setTimeout(function() {
_this.right();
}, 1);
}
}
if (tzcs < 0) {
tzcs = -tzcs;
for (var i = 0; i < tzcs; i++) {
setTimeout(function() {
_this.left();
}, 1);
}
}
_this.slideLi();
},
//修改當前最中間圖片對應按鈕選中狀態
slideLi() {
var slideList = 0;
for (var i = 0; i < this.slideNub; i++) {
let gv = "img" + i;
if (this.$refs[gv][0].className == "img front img3") {
slideList = parseInt(this.$refs[gv][0].id);
// slideList = parseInt(this.$refs[gv][0].id) + 1;
}
}
for (var i = 0; i < this.slideNub; i++) {
let gv = "li" + i;
this.$refs[gv][0].className = "";
}
if (slideList == 6) {
slideList = 0;
}
this.$refs["li" + slideList][0].className = "on";
},
//觸摸滑動模塊
k_touch() {
let _this = this;
var _start = 0,
_end = 0,
_content = document.getElementById("slide");
_content.addEventListener("touchstart", touchStart, false);
_content.addEventListener("touchmove", touchMove, false);
_content.addEventListener("touchend", touchEnd, false);
function touchStart(event) {
var touch = event.targetTouches[0];
_start = touch.pageX;
}
function touchMove(event) {
var touch = event.targetTouches[0];
_end = _start - touch.pageX;
}
function touchEnd(event) {
if (_end < -100) {
_this.left();
_end = 0;
} else if (_end > 100) {
_this.right();
_end = 0;
}
}
}
}
};
</script>
<style lang="scss" scoped>
.container {
width: 100%;
}
.slide {
width: 100%;
overflow: hidden;
position: relative;
height: 9.38rem;
perspective: 500;
-webkit-perspective: 500; // 3D
}
.back {
transform: rotateY(-180deg);
}
.fan-front {
transform: rotateY(-180deg);
}
.fan-back {
transform: rotateY(-360deg);
}
.slide .img {
overflow: hidden;
position: absolute;
transition: width 0.4s, height 0.4s, top 0.4s, left 0.4s, z-index 0.4s;
-webkit-perspective: 10000;
backface-visibility: hidden;
transition: all 1s;
}
.slide .img img {
width: calc(100% - 14px);
height: calc(100% - 14px);
margin: 7px;
}
.slide .img1 {
width: 40%;
height: 40%;
top: 30%;
left: -110%;
z-index: 1;
opacity: 0.4;
}
.slide .img2 {
width: 60%;
height: 60%;
top: 20%;
left: -50%;
z-index: 2;
opacity: 0.4;
}
.slide .img3 {
width: 80%;
height: 80%;
top: 10%;
left: 10%;
z-index: 3;
}
.slide .img4 {
width: 60%;
height: 60%;
top: 20%;
left: 90%;
z-index: 2;
opacity: 0.4;
}
.slide .img5 {
width: 40%;
height: 40%;
top: 30%;
left: 150%;
z-index: 1;
opacity: 0.4;
}
button {
width: 50px;
margin: 20px;
}
.slide-bt {
position: absolute;
left: 0%;
bottom: -30%;
z-index: 10;
img {
width: 1.2rem;
height: 1.5rem;
margin-top: .2rem;
margin-left: 0.05rem;
border-radius: 0.02rem;
}
.on {
border: 0.04rem solid red;
//background: #ffd200;
}
}
.slide-bt span {
width: 24px;
height: 8px;
background: #c9caca;
float: left;
margin: 5px;
border-radius: 4px;
}
.slide .slide-bt .on {
background: #ffd200;
}
.img-fan {
// animation:play 1s linear infinite;
animation: play 1.5s ease-in-out;
transform: translate3d(0, 0, 0);
}
@keyframes play {
0% {
transform: rotateY(0deg);
}
100% {
transform: rotateY(360deg);
}
}
</style>
翻卡:
原理:這個卡片翻轉效果是利用背面的內容一開始就先翻轉180度,等正面翻轉的時候背面再翻轉360度,這樣子背面翻轉到面對屏幕的時候內容卻是正的而不是反的
代碼解析:
這里主要用到了CSS3的一些新的屬性:perspective;
backface-visibility:hidden;
transition:all 2s;
transform:rotateY(Ndeg);
下面對這些屬性進行詳細的說明.
1.perspective:number|none(默認)
主要用來表示3D元素距離視圖的距離,單位是像素,定義在父元素上,子元素就會獲得透視效果,目前瀏覽器都在不支持,chrom和safari支持擴展的-webkit-perspectiv.
這個屬性能查到的資料上基本上都是這么講的,感覺不是很理解什么事透視效果,在我看來,使用這個屬性就是在3D轉換的時候能夠看到立體的3D效果,可以配合perspective-origion來使用,可惜的是目前只有chrom和safari支持帶有瀏覽器屬性前綴的該屬性.
2.backface-visibility:visiale|hidden
該屬性用來定義當元素不面向屏幕的時候是否可見,可用來設置旋轉元素是否希望用來看到背面.IE10+和Firefox支持該屬性,Opera 15+、Safari 和 Chrome 支持替代的 -webkit-backface-visibility 屬性
3.transition:css屬性名稱 完成動畫的時間 規定速度效果的速度曲線 定義過渡效果何時開始
transition是一個簡寫屬性,用來設置四個屬性:transition-property, transition-duration, transition-timing-function, transition-delay,一般為了省事直接就會寫作transition:all 2s。過渡時間必須設置,否則不會產生過渡效果。IE10+,chrome,opera,Firefox支持transition屬性,Safari支持替代的-webkit-transition屬性
transition-timing-function:linear(勻速)|ease(默認.慢速開始,加快,慢速結束)|ease-in(慢速開始)|ease-out(慢速結束)|ease-in-out(慢速開始,慢速結束)|cubic-bezier(n,n,n,n)貝賽爾曲線
4.transform:rotateY(Ndeg)
兼容性不說那么多了,感覺反正用的時候全部加上瀏覽器前綴好啦.
主要是用來定義各種變換的,translate,scale,rotate,skew,可惜熟悉使用一下,用的還是比較多的
這就是 2019年最后一遍博客啦,
來年咱們繼續加油呀 ,奮斗的少年
永遠在路上
