canvas实现响应式页面

大家可以看下下面这个页面,看似简单,但想要完美的实现效果却并不是那么简单,由于后面有六边形背景图且需要和我们的选择项对齐。下面我给出我写的demo

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
	<style>
		.bg{
			position: fixed;
			top:0;
			left: 0;
			bottom: 0;
			right: 0;
		}
		.canvas-box{
			width: 100%;
			height: 100%;
			background: #000;
		}
		img{
			position: absolute;
			top:0;
			left: 0;
			z-index: 9999;
		}
	</style>
</head>
<body>
		<div class="bg">
			<div class="canvas-box">
				<canvas id="canvas"></canvas >
				<img id="mapImg" class="mapImg" src="./Image/index_bg.png" width="1920" height="949" border="0" usemap="#Map" style="opacity: 0" />
				<map name="Map" id="Map">
					<area shape="poly" coords="828,564,826,703,960,768,1094,702,1093,563,962,493" href="https://www.baidu.com/?tn=93006350_hao_pg" />
					<area shape="poly" coords="409,348,412,489,549,558,682,486,683,352,540,283,539,286" href="#" />
					<area shape="poly" coords="1243,353,1241,488,1379,554,1517,486,1514,353,1381,285" href="#" />
				</map>
			</div>
		</div>
</body>
<script>
  var canvas = document.getElementById('canvas'); //画布对象
	var mapImg=document.getElementById('mapImg');
  var context = canvas.getContext('2d');//画布显示二维图片
  layout();
  window.onresize=function () {
    layout();
  }
  function drawImage(img,wWidth,wHeight) {

    context.drawImage(
      img, //规定要使用的图像、画布或视频。
      0, 0, //开始剪切的 x 坐标位置。

      wWidth, wHeight  //要使用的图像的宽度、高度
    );
  }
  function drawText(x,y,text,wWidth,wHeight,size) {
    var txtX=(wWidth/10)*x;
    var txtY=(wHeight/10)*y;
    var size=(wWidth/100)*size;
    context.fillStyle = "#FFF";
    var font="normal "+size+"px Microsoft YaHei";
    console.log(font);
    context.font = font;
    context.textBaseline = 'top';
    //填充字符串
    var txt=text;
    context.fillText(txt,txtX,txtY);
  }
  function layout() {
    var wHeight=document.documentElement.clientHeight || document.body.clientHeight;
    var wWidth=document.documentElement.clientWidth || document.body.clientWidth;
    console.log('wHeight'+wHeight);
    console.log('wWidth'+wWidth);
    canvas.height=wHeight;
    canvas.width=wWidth;
    mapImg.height=wHeight;
    mapImg.width=wWidth;
    adjust('Map','mapImg',1920,949);
    var img = new Image();
    img.src = "Image/index_bg.png";
    img.onload = function () {
      drawImage(img,wWidth,wHeight);
      drawText(2.25,6,'科技法庭系统',wWidth,wHeight,2);
      drawText(6.80,6,'运维系统',wWidth,wHeight,2);
      drawText(4.62,8.2,'视频系统',wWidth,wHeight,2);
      drawText(2.4,1,'贵州省最高人民法院视频汇聚平台',wWidth,wHeight,3.5);

      //context.fillRect(txtX,txtY,400,300);

    };
  }
  //图片map自适应
  //获取map中元素属性
  function adjust(mapId,imgClass,imgWidth,imgHeight) {
    var map = document.getElementById(mapId);
    var element = map.children;
    var itemNumber = element.length;
    for (var i = 0; i < itemNumber; i++) {
      var oldCoords = element[i].coords;
      var newcoords = adjustPosition(oldCoords,imgClass,imgWidth,imgHeight);
      element[i].setAttribute("coords", newcoords);
    }
  }

  //调整map中坐标
  function adjustPosition(position,imgClass,imgWidth,imgHeight) {
    var image = document.getElementsByClassName(imgClass);
    var currentWidth = image[0].clientWidth,//图片的现宽高
      currentHeith = image[0].clientHeight;
    var percentW = currentWidth / imgWidth,
      percentH = currentHeith / imgHeight;
    var each = position.split(",");
    //获取每个坐标点
    for (var i = 0; i < each.length; i++) {
      each[i] = Math.round(each[i] * percentW).toString();//x坐标
      i++;
      each[i] = Math.round(each[i] * percentH).toString();//y坐标
    }
    //生成新的坐标点
    var newPosition = "";
    for (var i = 0; i < each.length; i++) {
      newPosition += each[i];
      if (i < each.length - 1) {
        newPosition += ",";
      }
    }
    return newPosition;
  }
</script>
</html>

1利用canvas绘图识别屏幕宽高进行重绘

2利用map  area设置区域链接

完美解决问题,在此记录下以便之后查阅

无文字背景图index_bg.png附上

猜你喜欢

转载自blog.csdn.net/github_39274378/article/details/82014467