需求描述:最近开发过程中,客户需要在手机端显示图片,并可以放大缩小,随意查看。如果有报警信息,需要在图纸上具体点位标出报警。
一、功能分析:
1、实现图片放大缩小、滑动效果
2、实现图片以某一点居中定位
3、实现在图片某个点定位另一张图片
- 最后附有整体代码
二、开发过程
1、素材
需要展示的图纸一张,大小3037 * 2304
报警图片一张,大小48 * 48
2、开始实现图片的滑动效果
- 创建一个可以上下滑动的父元素【.big-box】,超出隐藏 overflow: scroll。
- 里面放入背景图为图纸【.box-image】和火焰【.box-fire】的两个div。
实现 图纸【.box-image】和 火焰【.box-fire】可以在 父元素【.big-box】中上下左右滑动的效果。
<div class="big-box">
<div class="box-image" data-level="10"></div>
<div class="box-fire"></div>
</div>
<button class="big">放大</button>
<button class="small">缩小</button>
<script>
.big-box{
height: 300px;
overflow: scroll;
position: relative;
}
.box-image{
background: url('../public/img/show.png');
background-repeat:no-repeat;
background-size: cover;
width: 3037px;
height: 2304px;
}
.box-fire{
background: url('../public/img/fire.png');
background-repeat:no-repeat;
background-size: cover;
width: 48px;
height: 48px;
position: absolute;
opacity: 0.8;
}
</script>
3、定位图纸中的报警点和火焰图片
-
获取图片、火焰、父级元素的基础宽高
-
当前报警点位为 【05-030】,在图纸中的位置为 距离顶部50%,距离左侧30%,计算图片的偏移距离。
-
此时报警点【 05-030】位于图片左上角,如果想要报警点位于中心,则分别减去父级的高宽的一半
-
将 火焰【.box-fire】基于 父元素【.big-box】绝对定位,距离顶部 【图片的高度* 0.5】,距离左边【图片的宽度* 0.3】。
-
此时图片位于红色方框内,为了美观效果,需要移动到黄色方框内,需要适量减去图片本身的高度和宽度。
<script>
//获取图片、火焰和父级元素的基础宽高
var imageBaseWidth=$('.box-image').width();
var imageBaseHeight=$('.box-image').height();
var fireBaseWidth=$('.box-fire').width();
var fireBaseHeight=$('.box-fire').height();
var boxWidth=$('.big-box').width();
var boxHeight=$('.big-box').height();
//加载图片
showImage(imageBaseWidth,imageBaseHeight);
//图片
function showImage(imageWidth,imageHeight){
//当缩小后图片的宽度小于父级的宽度的时候,
$('.big-box').scrollLeft(imageWidth*0.3-boxWidth/2)
$('.big-box').scrollTop(imageHeight*0.5-boxHeight/2)
fire(imageWidth*0.3,imageHeight*0.5);
}
//火焰
function fire(imageWidth,imageHeight){
$('.box-fire').css('top',imageHeight-fireBaseHeight/1.2)
$('.box-fire').css('left',imageWidth-fireBaseWidth/2)
}
</script>
4、实现图片的缩放功能
- 定义当前缩放等级【level】为10,点击放大按钮和缩小按钮,【level】分别自增和自减,注意【level】最小为1.
- 图片【.box-image】的高宽和 火焰【.box-fire】的高宽分别 乘以 缩放等级【level】*0.1
<script>
//放大
$('.big').click(function(){
var level=$('.box-image').data('level')+1;
change(level)
})
//缩小
$('.small').click(function(){
var level=$('.box-image').data('level')-1;
change(level==0?1:level)
})
//图片
$('.box-image').width(imageBaseWidth*level*0.1);
$('.box-image').height(imageBaseHeight*level*0.1);
//火焰
$('.box-fire').width(fireBaseWidth*level*0.1);
$('.box-fire').height(fireBaseHeight*level*0.1);
</script>
整体代码
- 当缩放过程中,当图片的长度和高度小于父级元素的长度和高度时,此时不能滑动,计算定位时,也不用减去父级的长宽的一半。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="format-detection" content="telephone=yes"/>
<meta name="msapplication-tap-highlight" content="no" />
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<style>
.big-box{
height: 300px;
overflow: scroll;
position: relative;
}
.box-image{
background: url('../public/img/show.png');
background-repeat:no-repeat;
background-size: cover;
width: 3037px;
height: 2304px;
}
.box-fire{
background: url('../public/img/fire.png');
background-repeat:no-repeat;
background-size: cover;
width: 48px;
height: 48px;
position: absolute;
opacity: 0.8;
}
</style>
</head>
<body>
<div class="big-box">
<div class="box-image" data-level="10"></div>
<div class="box-fire"></div>
</div>
<button class="big">放大</button>
<button class="small">缩小</button>
<script>
$(function(){
var imageBaseWidth=$('.box-image').width();
var imageBaseHeight=$('.box-image').height();
var fireBaseWidth=$('.box-fire').width();
var fireBaseHeight=$('.box-fire').height();
var boxWidth=$('.big-box').width();
var boxHeight=$('.big-box').height();
showImage(imageBaseWidth,imageBaseHeight);
//放大
$('.big').click(function(){
var level=$('.box-image').data('level')+1;
change(level)
})
//缩小
$('.small').click(function(){
var level=$('.box-image').data('level')-1;
change(level==0?1:level)
})
//加载图片
function showImage(imageWidth,imageHeight,level=10){
$('.big-box').scrollLeft((imageWidth<boxWidth)?imageWidth*0.3:imageWidth*0.3-boxWidth/2)
$('.big-box').scrollTop((imageHeight<boxHeight)?imageHeight*0.5:imageHeight*0.5-boxHeight/2)
fire(imageWidth*0.3,imageHeight*0.5,level);
}
//改变图片
function change(level){
var imageWidth=imageBaseWidth*level*0.1
var imageHeight=imageBaseHeight*level*0.1
$('.box-image').data('level',level);
$('.box-image').width(imageWidth);
$('.box-image').height(imageHeight);
showImage(imageWidth,imageHeight,level);
}
//火焰
function fire(imageWidth,imageHeight,level){
$('.box-fire').width(fireBaseWidth*level*0.1);
$('.box-fire').height(fireBaseHeight*level*0.1);
$('.box-fire').css('top',imageHeight-fireBaseHeight*level*0.1/1.2)
$('.box-fire').css('left',imageWidth-fireBaseWidth*level*0.1/2)
}
})
</script>
</body>
</html>