图片的定位、滚动、缩放

需求描述:最近开发过程中,客户需要在手机端显示图片,并可以放大缩小,随意查看。如果有报警信息,需要在图纸上具体点位标出报警。

一、功能分析:

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>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值