电商放大镜
一.一些零碎知识点
1.style只可以获取行内样式,但可以修改
window.getComputedStyle可以获取在浏览器的所有样式,但不能修改
2.若运用的是子元素一定要加children[]
eg: middle.children[ 0 ].src middle下边的第一个子元素的src属性
二.html代码
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="js/js.js"></script>
<style>
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
.big{
margin: auto;
width: 350px;
height: 500px;
position: relative;
}
.middle{
width: 350px;
height: 420px;
border: solid 1px silver;
position: relative;
}
.middle img{
width: 100%;
height:100%;
}
.small{
width: 350px;
height: 80px;
font-size: 0; /*块变行级块之间会有缝隙,用font-size:0;清除缝*/
border-top: solid 1px silver; /*线*/
padding-top: 10px;
position: relative;
}
.s-photo{
display: inline-block;
width: 60px;
height: auto;
margin-left: 5px;
border: solid 3px transparent;
}
.s-chang{
width:520px;
/*margin-top: 11px;*/ /*给mar会往下移,给上边框一条线*/
margin-left: 0;
-webkit-transition: margin-left .4s linear;
-moz-transition: margin-left .4s linear ;
-o-transition: margin-left .4s linear ;
transition: margin-left .4s linear;
}
.s-duan{
width: 310px;
height: 60px;
overflow: hidden;
margin: auto;
}
.small span{
font-size: 15px;
width: 20px;
height: 78px;
line-height: 78px;
display: inline-block;
position: absolute;
text-align: center;
background: silver;
cursor: pointer;
}
.btn-left{
top: 0;
left: 0;
}
.btn-right{
top: 0;
right: 0;
}
另一种两个按钮的写法
/* /!*两种写法 一种用span,一种用伪类选择器*!/
.s-duan::before,.s-duan::after{
height: 80px;
width: 20px;
font-size: 15px;
position: absolute;
text-align: center;
line-height: 80px;
}
.s-duan::after{
content: ">";
top: 0;
right: 0;
}
.s-duan::before{
content: "<";
top: 0;
left: 0;
}*/
.mid-src{
position: absolute;
width: 150px;
height: 200px;
background: url("images/bg.png") ;
-webkit-background-size: 5px 5px;
background-size: 5px 5px;
display: none;
cursor: move; //让鼠标放上去变成移动态
}
.big-right{
width: 350px;
height: 520px;
border: solid 1px silver;
position: absolute;
left: 349px;
display: none;
background: url("images/big1.jpg") no-repeat;
}
</style>
</head>
<body>
<div class="big">
<div class="big-right"></div>
<div class="middle">
<div class="mid-src"></div><!--层-->
<img src="images/middle1.jpg" alt=""/>
</div>
<div class="small">
<span class="btn-left"><</span>
<div class="s-duan">
<div class="s-chang"> //不停的写div让图片隐藏
<div class="s-photo"><img src="images/small1.jpg" data-big="images/big1.jpg" data-src="images/middle1.jpg" alt=""/></div>
<div class="s-photo"><img src="images/small2.jpg" data-big="images/big2.jpg" data-src="images/middle2.jpg" alt=""/></div>
<div class="s-photo"><img src="images/small3.jpg" data-big="images/big3.jpg" data-src="images/middle3.jpg" alt=""/></div>
<div class="s-photo"><img src="images/small4.jpg" data-big="images/big4.jpg" data-src="images/middle4.jpg" alt=""/></div>
<div class="s-photo"><img src="images/small5.jpg" data-big="images/big5.jpg" data-src="images/middle5.jpg" alt="" /></div>
<div class="s-photo"><img src="images/small6.jpg" data-big="images/big6.jpg" data-src="images/middle6.jpg" alt=""/></div>
<div class="s-photo"><img src="images/small7.jpg" data-big="images/big7.jpg" data-src="images/middle7.jpg" alt=""/></div>
<div class="s-photo"><img src="images/small8.jpg" data-big="images/big8.jpg" data-src="images/middle8.jpg" alt=""/></div>
</div>
</div>
<span class="btn-right">></span>
</div>
</div>
</body>
</html>
二.js代码
1.实现鼠标放到小图上,小图边框变为红色
借助temp变量,存储鼠标移动后的前一个框
var temp;
window.onload=function(){
var sphoto =document.getElementsByClassName("s-photo");
var middle =document.getElementsByClassName("middle")[0];
temp=document.getElementsByClassName("s-photo")[0];
temp.style.borderColor = "red";
for(var i=0;i<sphoto.length;i++){
sphoto[i].onmouseenter = function(){
temp.style.borderColor="transparent";
this.style.borderColor="red";
temp=this;
console.log(this.children[0].getAttribute("data-src"))
middle.children[0].src = this.children[0].getAttribute("data-src");
}
}
}
2.点击左右两个span,small中的图片移动
btnleft.onclick=function(){
schang.style.marginLeft="0";
}
btnright.onclick=function(){
schang.style.marginLeft=-212+"px";
}
3.让鼠标放在midsrc(阴影层)的中间
x=x-big.offsetLeft-parseFloat(window.getComputedStyle(midsrc).width)/2; /*style只可以获取行内样式 window.get可以获取在浏览器的所有样式,但不能修改*/
y=y-big.offsetTop-parseFloat(window.getComputedStyle(midsrc).height)/2; /*左偏移量相对于父元素的偏移量*/
4.将阴影层限制在middle框中
var bigleft = (parseFloat(window.getComputedStyle(middle).width))-parseFloat(window.getComputedStyle(midsrc).width);
var bigtop = (parseFloat(window.getComputedStyle(middle).height))-parseFloat(window.getComputedStyle(midsrc).height);
/* console.log(bigleft);
console.log(bigtop);*/
if(x<=0 ){
x=0;
}
else{ /*x>0*/
if(x>=bigleft){
x=bigleft;
}
else{}
}
if(y<0){
y=0;
}
else{ /*y>0*/
if(y>=bigtop){
y=bigtop;
}
else{}
}
midsrc.style.left = x + "px";
midsrc.style.top = y + "px"
5.将图片一一对应
middle.children[1].src = this.children[0].getAttribute("data-src"); //middle下的img(第二个子元素) div下的img
bigright.style.backgroundImage="url(" + this.children[0].getAttribute("data-big") + ")"; //this指代当前所对应的sphoto
6.鼠标移动阴影层后大图也跟着移动
bigright.style.backgroundPosition = (-x / 0.4375) + "px " + (-y / 0.525) + "px";
7.完整代码如下
var temp=null;
window.onload=function(){
var sphoto =document.getElementsByClassName("s-photo");
var middle =document.getElementsByClassName("middle")[0];
var big = document.getElementsByClassName("big")[0];
var btnleft =document.getElementsByClassName("btn-left")[0];
var btnright =document.getElementsByClassName("btn-right")[0];
var schang=document.getElementsByClassName("s-chang")[0];
var midsrc=document.getElementsByClassName("mid-src")[0];
var bigright=document.getElementsByClassName("big-right")[0];
temp=document.getElementsByClassName("s-photo")[0];
temp.style.borderColor="red";
for(var i=0;i<sphoto.length;i++){
sphoto[i].onmouseenter=function(){
temp.style.borderColor="transparent";
this.style.borderColor="red";
temp=this;//将当前对象存在temp中,鼠标动下一个时,当前对象变为透明
middle.children[1].src = this.children[0].getAttribute("data-src");//middle下的img(第二个子元素) div下的img
bigright.style.backgroundImage="url(" + this.children[0].getAttribute("data-big") + ")";//this指代当前所对应的sphoto
}
}
//左右点击事件
btnleft.onclick=function(){
schang.style.marginLeft="0";
}
btnright.onclick=function(){
schang.style.marginLeft=-212+"px";
}
//mid-src移动
middle.onmouseenter=function(){
midsrc.style.display="block";
bigright.style.display="block";
}
middle.onmouseleave=function(){
midsrc.style.display="none";
bigright.style.display="none";
}
middle.onmousemove=function(e){
var x= e.pageX || e.clientX;
var y= e.pagesY || e.clientY;
/*先让鼠标随着篮框移动*/
x=x-big.offsetLeft-parseFloat(window.getComputedStyle(midsrc).width)/2; /*style只可以获取行内样式 window.get可以获取在浏览器的所有样式,但不能修改*/
y=y-big.offsetTop-parseFloat(window.getComputedStyle(midsrc).height)/2; /*左偏移量相对于父元素的偏移量*/
console.log(x);
console.log(y);
/* 限制x y;*/
var bigleft = (parseFloat(window.getComputedStyle(middle).width))-parseFloat(window.getComputedStyle(midsrc).width);
var bigtop = (parseFloat(window.getComputedStyle(middle).height))-parseFloat(window.getComputedStyle(midsrc).height);
/* console.log(bigleft);
console.log(bigtop);*/
if(x<=0 ){
x=0;
}
else{ /*x>0*/
if(x>=bigleft){
x=bigleft;
}
else{}
}
if(y<0){
y=0;
}
else{ /*y>0*/
if(y>=bigtop){
y=bigtop;
}
else{}
}
midsrc.style.left = x + "px";
midsrc.style.top = y + "px"; /*midsrc的位置就是鼠标位置计算出来,所以跟着鼠标移动*/
bigright.style.backgroundPosition = (-x / 0.4375) + "px " + (-y / 0.525) + "px";
//中图 350 420 大图 800 800 0.4375 0.525
// midsrc 150 200 303 大图与中图的比等于mid-scr与 的比
}
}