vue實(shí)現(xiàn)商品詳情頁(yè)放大鏡功能
本文實(shí)例為大家分享了vue實(shí)現(xiàn)商品詳情頁(yè)放大鏡的具體代碼,供大家參考,具體內(nèi)容如下
templates中內(nèi)容
<div class="productLeft">
<!-- 左側(cè)中圖 -->
<div class="mdImg">
<img :src="require('../assets/imgs/details/'+mdImgUrl)" alt="">
</div>
<!-- 遮罩層 -->
<div v-show="isShow" class="marks" :style="{top:top+'px',left:left+'px'}"></ div>
<!-- 遮罩層 玻璃板 superMarks-->
<div @mouseenter="enter" @mouseleave="leave" @mousemove="marks" class="superMarks" ></div>
<!--左側(cè)小圖 -->
<div class="smImg" >
<!--左按鈕 -->
<div @click="prev" class="button-prev">
<img src="../assets/icon/prev.png" >
</div>
<div class="smImgUl">
<ul :style="{'margin-left':marginLeft+'px'}">
<li @mouseenter="enterLi(index)" v-for="(item,index) of list" :key="index">
< img :src="require('../assets/imgs/details/'+item.sm)" alt="">
</li>
</ul>
</div>
<!-- 右按鈕 -->
<div @click="next" class="button-next">
<img src="../assets/icon/next.png" >
</div>
</div>
<!-- 左側(cè)大圖 -->
<div v-show="isShow" class="lgImg">
<img :src="require('../assets/imgs/details/'+lgImgUrl)" alt="" :style="{top:topLgImg+'px',left:leftLgImg+'px'}">
</ div>
</div>
js:
< script>
import headerT from "./common/headerT.vue"
import header from "./common/Header.vue"
export default {
data() {
return {
list:[{"sm":"s1.png","md":"s1.png","lg":"s1.png"},
{"sm":"s2.png","md":"s2.png","lg":"s2.png"},
{"sm":"s3.png","md":"s3.png","lg":"s3.png"},
{"sm":"s4.png","md":"s4.png","lg":"s4.png"},
{"sm":"s5.png","md":"s5.png","lg":"s5.png"},
{"sm":"s6.png","md":"s6.png","lg":"s6.png"},
{"sm":"s7.png","md":"s7.png","lg":"s7.png"},
{"sm":"s8.png","md":"s8.png","lg":"s8.png"}],
mdImgUrl:"s1.png",
lgImgUrl:"s1.png",
ulIndex:0,//向左移動(dòng)幾個(gè)li
marginLeft:0, //向左向右移動(dòng)的距離
isShow:false, //控制遮罩層marks和大圖片是否顯示"
left:0, //marks左移位置
top:0, //marks下移位置
leftLgImg:0, //大圖lgImg移動(dòng)的位置
topLgImg:0 //大圖lgImg移動(dòng)的位置
}
},
methods: {
//鼠標(biāo)進(jìn)入小圖時(shí)事件,顯示對(duì)應(yīng)的中圖
enterLi(e){
//e是對(duì)應(yīng)的下標(biāo)
//console.log(e);
this.mdImgUrl=this.list[e].md;
this.lgImgUrl=this.list[e].lg;
},
//點(diǎn)擊左右按鈕事件ul的li移動(dòng),每個(gè)li寬74px,ul寬370顯示5個(gè)li
prev(){
//向左移動(dòng)-
if(this.ulIndex>-(this.list.length-5)){
this.ulIndex--;
this.marginLeft=this.ulIndex*74;
//console.log(this.ulIndex)
}
},
next(){
//向右移動(dòng)++
if(this.ulIndex<0){
this.ulIndex++;
this.marginLeft=this.ulIndex*74;
//console.log(this.ulIndex)
}
},
//鼠標(biāo)進(jìn)入和離開
enter(){
this.isShow=true
},
leave(){
this.isShow=false
},
//遮罩層放大鏡
marks(e){
//console.log(e.offsetX,e.offsetY) //鼠標(biāo)移入時(shí)的位置·
var marksWidth=200;//marks的寬
var marksHeight=200;//marks的高
this.left=e.offsetX-marksWidth/2;
this.top=e.offsetY-marksHeight/2;
//console.log(this.left,this.top)
if(this.left<0){
this.left=0;
}else if(this.left>250){
this.left=250;
}
if(this.top<0){
this.top=0;
}else if(this.top>250){
this.top=250;
}
//console.log(this.left,this.top)
//中圖片div寬高450,大圖片div寬高800
this.leftLgImg=-this.left*800/450;
this.topLgImg=-this.top*800/450;
}
},
computed: {
},
components:{
"headerone":headerT,
"headertwo":header
},
watch: {
},
}
</ script>
CSS:
<style scoped>
.content{
width:1200px;
margin:0 auto;
}
.content>.product{
display: flex;
justify-content: space-between;
}
/* 左側(cè)大小圖樣式 */
.productLeft{
width:450px;
position: relative;
}
/* 左側(cè)中圖 */
.mdImg,.mdImg>img{
width:450px;
height:450px;
}
/*遮罩層superMarks */
.superMarks{
width:450px;
height:450px;
background-color:rgba(220, 220, 220, 0);
position:absolute;
top:0px;
left:0px;
}
/* 遮罩層 */
.marks{
width:200px;
height:200px;
position:absolute;
background-color:rgba(220, 220, 220, 0.5);
/*top:0px; //內(nèi)聯(lián)設(shè)置了動(dòng)態(tài)的top,left
left:0px;*/
}
/* 左側(cè)小圖 */
.smImg{
display:flex;
align-items: center;
justify-content: space-between;
overflow:hidden;
}
.smImgUl{
overflow:hidden;
width:370px;
}
.smImg ul{
display: flex;
width:370px;
margin:0;
padding:0;
}
.smImg ul>li{
padding:0 3px;
}
.smImg img{
height:60px;
margin:4px;
}
/* 左側(cè)隱藏大圖 */
.lgImg{
width:400px;
height:400px;
overflow: hidden;
position:absolute;
top:0px;
left:450px;
border:2px solid #aaa;
background-color:#fff;
}
.lgImg img{
width:800px;
height:800px;
position:absolute;
/*top:100px;
left:100px;*/
}
/* product右側(cè) */
.productRight{
width:700px;
}
/* 左右按鈕 */
.button-prev,.button-next{
width:35px;
height:35px;
line-height: 30px;
border:1px solid #ddd;
border-radius:50%;
text-align:center;
}
.button-prev:hover,.button-next:hover{
background-color:#eee;
}
.button-prev>img,.button-next>img{
width:20px;
height:20px;
}
</style>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
uniapp-ios開發(fā)之App端與webview端相互通信的方法以及注意事項(xiàng)
在uni-app與Webview之間進(jìn)行數(shù)據(jù)交互是非常常見的需求,下面這篇文章主要給大家介紹了關(guān)于uniapp-ios開發(fā)之App端與webview端相互通信的方法以及注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下2024-07-07
Vue2實(shí)時(shí)監(jiān)聽表單變化的示例講解
今天小編就為大家分享一篇Vue2實(shí)時(shí)監(jiān)聽表單變化的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
vue-resource?獲取本地json數(shù)據(jù)404問(wèn)題的解決
這篇文章主要介紹了vue-resource?獲取本地json數(shù)據(jù)404問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
vue子元素綁定的事件, 阻止觸發(fā)父級(jí)上的事件處理方式
這篇文章主要介紹了vue子元素綁定的事件, 阻止觸發(fā)父級(jí)上的事件處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
詳解element-ui 組件el-autocomplete使用踩坑記錄
最近使用了el-autocomplete組件,本文主要介紹了element-ui 組件el-autocomplete使用踩坑記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Vue.js中輕松解決v-for執(zhí)行出錯(cuò)的三個(gè)方案
v-for標(biāo)簽可以用來(lái)遍歷數(shù)組,將數(shù)組的每一個(gè)值綁定到相應(yīng)的視圖元素中去,下面這篇文章主要給大家介紹了關(guān)于在Vue.js中輕松解決v-for執(zhí)行出錯(cuò)的三個(gè)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06

