HTML热区map坐标,随窗口大小自适应办法(javascript)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/themes/blue/bi/bi.ui.core.css" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/themes/blue/jquery-ui.css">
<link rel="stylesheet" type="text/css" href="${bipagecontext.skinPath }/bi/bi.ui.image.css">
<script type="text/javascript" src="<%=request.getContextPath() %>/jquery/jquery.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/jquery/jquery-ui.custom.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/jquery/widget/bi.core.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/jquery/widget/dialog/bi.ui.opendialog.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/jquery/widget/toppanel/bi.ui.toppanel.js"></script>
<title>点击图片</title>
<style type="text/css">
*{
	margin :0;
	padding:0;
	border: 0;


}
html,body{
	width: 100%;
	height: 100%;
}
body{
	background-color: #FFFFFF;/*背景颜色*/
}
a,img{
	width: 100%;
	height: 100%;
	display: block;
}
/*去除点击边框*/
map area{ outline: red; }
</style>
<script type="text/javascript">


var oldPicW = 3840; //原始图片宽
var oldPicH = 2160; //原始图片高


$(function(){
/********************************计算area标签的位置比例系数************************************/
	//获取map标签里的所有area标签
	var $area = $("#planetmap").find("area");
	$.each($area,function(index,data){
		var shape = $(data).attr("shape"); //获取area标签的shape属性(矩形rect,圆形circle,多边形poly)
		var coordsArray  = $(data).attr("coords").replace(/\"/g,"").split(","); //将area标签的coords转换成数组
		var class_ = $(data).attr("class"); //获取area标签的class属性
		if(shape=="rect"){ //矩形rect
			//根据每个area标签的位置坐标计算出在整张图片的位置比例系数
			var coords_Array = [],ratio_Array = []; //coords_Array用于存放根据coords计算出来的比例系数数组
			for(var j=0,len=coordsArray.length;j<len;j++){
				if(j % 2 === 0){ //X坐标值
					coords_Array.push(decimal_common(coordsArray[j]/oldPicW,4));
				}else{ //Y坐标值
					coords_Array.push(decimal_common(coordsArray[j]/oldPicH,4));
				}
			}
			//ratio_Array作为比例系数数组形参重新计算位置坐标
			ratio_Array = coords_Array.concat(ratio_Array);
			reCoords_(class_,ratio_Array,shape,0);
			$(window).resize(function() {
			 	reCoords_(class_,ratio_Array,shape,0);
			});
		}else if(shape=="poly"){ //多边形poly
			//根据每个area标签的位置坐标计算出在整张图片的位置比例系数
			var coords_Array = [],ratio_Array = [];
			for(var j=0,len=coordsArray.length;j<len;j++){
				if(j % 2 === 0){ //X坐标值
					coords_Array.push(decimal_common(coordsArray[j]/oldPicW,4));
				}else{ //Y坐标值
					coords_Array.push(decimal_common(coordsArray[j]/oldPicH,4));
				}
			}
			ratio_Array = coords_Array.concat(ratio_Array);
			reCoords_(class_,ratio_Array,shape,0);
			$(window).resize(function() {
			 	reCoords_(class_,ratio_Array,shape,0);
			});
		}else if(shape=="circle"){ //圆形circle
			//根据每个area标签的位置坐标计算出在整张图片的位置比例系数
			var coords_Array = [],ratio_Array = [];
			for(var j=0;j<2;j++){ //圆只有两个坐标值和一个半径,半径以最大的比率去缩放
				if(j % 2 === 0){ //X坐标值
					coords_Array.push(decimal_common(coordsArray[j]/oldPicW,4));
				}else{ //Y坐标值
					coords_Array.push(decimal_common(coordsArray[j]/oldPicH,4));
				}
			}
			coords_Array.push(coords_Array[0]>=coords_Array[1]?coords_Array[0]:coords_Array[1]);//设置半径的比率


			ratio_Array = coords_Array.concat(ratio_Array);
			reCoords_(class_,ratio_Array,shape,coordsArray[2]);
			$(window).resize(function() {
			 	reCoords_(class_,ratio_Array,shape,coordsArray[2]);
			});
		}
	});
/********************************三个鼠标点击的区域方法************************************/
	$(".img_map_area01").on('click',function(){
		var href_ = $(this).attr("href_");
		var class_ = $(this).attr("class");
		var setting ={
				id :class_,
				url:href_,
				width : 560,
				height :360,
				draggable : true
			 
			}
		$.bi.ui.frameDialog2(setting);
	});


	$(".img_map_area02").on('click',function(){
		var href_ = $(this).attr("href_");
		var class_ = $(this).attr("class");
		var setting ={
				id :class_,
				url:href_,
				width : 560,
				height :360,
				draggable : true
			 
			}
		$.bi.ui.frameDialog2(setting);
	});
	
/********************************鼠标悬浮的区域方法************************************/	
	$(".img_map_area03").hover(
			function(){//鼠标悬浮在元素范围内执行该函数
				var href_ = $(this).attr("href_");
				var class_ = $(this).attr("class");
				var setting ={
						id :class_,
						url:href_,
						width : 560,
						height :360,
						modal : false,
						draggable : true,
						position : {
							my: "left+5 top+5",//左上位置
						    of: event,
						    collision: "fit"
						}
					}
				$.bi.ui.frameDialog2(setting);
			},
			function(){//鼠标移出元素范围内执行该函数
				$.bi.ui.closeDialog("img_map_area03");
			}
		);
		
	$(".img_map_area04").hover(
			function(){
				var href_ = $(this).attr("href_");
				var class_ = $(this).attr("class");
				var setting ={
						id :class_,
						url:href_,
						width : 560,
						height :360,
						modal : false,
						draggable : true,
						position : {
							my: "left+5 top+5",//左上位置
						    of: event,
						    collision: "fit"
						}
					}
				$.bi.ui.frameDialog2(setting);
			},
			function(){
				$.bi.ui.closeDialog("img_map_area04");
			}
		);
	
});


/**
 * [根据比例系数数组重新计算位置坐标coords]
 * @param  {[type]} class_      [area的class]
 * @param  {[type]} ratio_Array [area的比例系数数组]
 * @param  {[type]} shape       [area的shape属性]
 * @param  {[type]} radius      [area为circle时的半径]
 * @return {[type]}             [description]
 */
function reCoords_(class_,ratio_Array,shape,radius){
	var picw = $("#pic").width(); //当前图片的宽度
	var pich = $("#pic").height(); //当前图片的高度
	if(shape=="rect"){
		//根据每个area标签的位置比例系数计算出新的坐标位置
		var xy_arr = ratio_Array.map(function(item,index){
			if(index % 2 === 0){ //X坐标值
				return parseInt(picw*item);
			}else{ //Y坐标值
				return parseInt(pich*item);
			}	
	 	});
		var xy_str = xy_arr.join(","); //拼接出新的坐标位置coords
	 	$("."+class_).attr("coords",'"'+xy_str+'"');
	}else if(shape=="poly"){
		//根据每个area标签的位置比例系数计算出新的坐标位置
		var xy_arr = ratio_Array.map(function(item,index){
			if(index % 2 === 0){ //X坐标值
				return parseInt(picw*item);
			}else{ //Y坐标值
				return parseInt(pich*item);
			}	
	 	});
		var xy_str = xy_arr.join(","); //拼接出新的坐标位置coords
	 	$("."+class_).attr("coords",'"'+xy_str+'"');
	}else if(shape=="circle"){
		//根据每个area标签的位置比例系数计算出新的坐标位置
		var xy_arr = ratio_Array.map(function(item,index){
			if(index == 0){ //X坐标值
				return parseInt(picw*item);
			}else if(index == 1){ //Y坐标值
				return parseInt(pich*item);
			}else{
				return parseInt(radius*item);
			}
	 	});
		var xy_str = xy_arr.join(","); //拼接出新的坐标位置coords
	 	$("."+class_).attr("coords",'"'+xy_str+'"');
	}				
}
 
 /**
  * 小数保留n位,四舍五入
  * @param  {[type]} decimal [十进制小数]
  * @param  {[type]} n       [保留小数点后有效位]
  * @return {[type]}         [十进制保留小数点后n位]
  */
function decimal_common(decimal,n){
	var pv = Math.pow(10,n);
	return Math.round(decimal*pv)/pv;
}
/* 
 * 计算比例像素
 */
/* $(function(){
	var k1 = 780,h1 = 280;
	var k2 = 150,h2 = 414;
	console.log("k1取值为:"+k1/1735*3840);
	console.log("h1取值为:"+h1/976*2160);
	console.log("k2取值为:"+k2/1735*3840);
	console.log("h2取值为:"+h2/976*2160);
}) */
</script>
</head>
<body>
	<img src="page_xbjc.png"  id="pic" usemap="#planetmap">
 		 
	<map name="planetmap" id="planetmap">
	
 		<!-- 三个鼠标点击的区域 -->
		<area class="img_map_area01" shape="rect" coords="2421,1411,2724,1590" href_ ="image.jsp" alt="汉堡王"/>
		<area class="img_map_area02" shape="rect" coords="2582,1064,2675,1199" href_ ="image.jsp" alt="维多利亚的秘密"/>
		<!-- 鼠标悬浮的区域 -->
		
		<area class="img_map_area03" shape="poly" coords="2755,1261,2755,1095,2917,1095,3246,765,3246,620,3375,620,3375,929,3038,1261" href_ ="image.jsp" alt="中国东方航空贵宾休息室"/>
		<area class="img_map_area04" shape="circle" coords="660,1020,100" href_ ="image.jsp" alt="心如莲花"/>
		
	</map>
</body>
</html>

文章中的点击事件函数和鼠标悬浮事件函数,可以自己定义,本人用的是公司封装之后的dialog弹出框,如有什么不懂的可以给我留言~
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现HTMLmap坐标随图片大小适应,可以通过以下步骤: 1. 在HTML中,为图片设置一个容器div,并将图片作为div的背景图。设置该div的宽度和高度,以及background-size为contain或cover,使图片大小适应容器。 2. 使用JavaScript获取图片的实际宽度和高度,计算出图片缩放比例。 3. 遍历所有坐标,将坐标乘以缩放比例,以适应图片缩放后的大小。 以下是示例代码: HTML部分: ```html <div id="image-container"> <img src="image.jpg" alt="" id="image" /> <map name="hotspots"> <area shape="rect" coords="10,10,50,50" href="#" /> <area shape="rect" coords="60,60,100,100" href="#" /> </map> </div> ``` JavaScript部分: ```javascript const container = document.getElementById('image-container'); const image = document.getElementById('image'); const map = document.getElementsByName('hotspots')[0]; // 获取图片实际尺寸 const imgWidth = image.naturalWidth; const imgHeight = image.naturalHeight; // 计算缩放比例 const scaleX = container.offsetWidth / imgWidth; const scaleY = container.offsetHeight / imgHeight; const scale = Math.min(scaleX, scaleY); // 遍历所有坐标,乘以缩放比例 const coords = map.getElementsByTagName('area'); for (let i = 0; i < coords.length; i++) { const coord = coords[i].getAttribute('coords').split(','); for (let j = 0; j < coord.length; j++) { coord[j] = Math.round(coord[j] * scale); } coords[i].setAttribute('coords', coord.join(',')); } ``` 以上代码会根据图片实际大小和容器大小计算出缩放比例,然后遍历所有坐标,将坐标乘以缩放比例调整大小

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值