JavaScript实现热区自适应图片大小变化

437 阅读1分钟

效果如下:

代码如下:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body>    <div>        <img id="myImg" src="./b398c4c6c7789286fa6cb5bcd3814c9a.jpg" alt="" width="100%" usemap="#Map" onload="init()" />        <map name="Map">            <area shape="poly" coords="290,404,221,561,360,580,372,494,371,406" href="#1">            <area shape="poly" coords="65,402,225,340,244,374,281,398,213,556,125,495" href="#2">            <area shape="poly" coords="181,249,173,287,181,332,19,395,4,292,23,183" href="#3">            <area shape="poly" coords="227,240,68,172,128,85,221,23,283,185,251,203" href="#4">            <area shape="poly" coords="293,179,230,18,302,5,372,4,372,178,336,171" href="#5">        </map>    </div>    <script type="text/javascript">        function init(){            return setTimeout(function () {                adjust({                    name: 'Map',                    img: {                        originalWidth: 395,                        originalHeight: 607                    }                })            }, 100);        }        // init()        var timeout = null; // onresize触发次数过多,设置定时器          window.onresize = function () {            clearTimeout(timeout);            timeout = init() // 页面大小变化,重新加载页面以刷新MAP          }        //获取MAP中元素属性          function adjust({                    name,                    img = {                        originalWidth: 100,                        originalHeight: 100                    }                }) {            var map = document.querySelector(`[name="${name}"]`);            var element = [...map.childNodes].filter(item => item.coords);            let originalArea            if (!map.getAttribute('original-area')) {                originalArea = element[0].coords                map.setAttribute('original-area', originalArea)            } else {                originalArea = map.getAttribute('original-area')            }            var coefficient = {                width: parseFloat(element[0].coords.split(',')[0]) / parseFloat(originalArea.split(',')[0]),                height: parseFloat(element[0].coords.split(',')[1]) / parseFloat(originalArea.split(',')[1]),            };            var myImg = document.querySelector(`[usemap="#${name}"]`)            var ratio = {                                width: myImg.width / img.originalWidth,                height: myImg.height / img.originalHeight            }            for (var i = 0; i < element.length; i++) {                var oldCoords = element[i].coords;                var newCoords = adjustPosition(oldCoords, coefficient, ratio);                element[i].setAttribute("coords", newCoords);            }        }        //调整MAP中坐标          function adjustPosition(position, coefficient = { height: 1, width: 1 }, ratio = { height: 1, width: 1 }) {            var each = position.split(",");            //获取每个坐标点              for (var i = 0; i < each.length; i++) {                each[i] = Math.round(parseFloat(each[i]) / coefficient.width * ratio.width).toString();//x坐标                  i++;                each[i] = Math.round(parseFloat(each[i]) / coefficient.height * ratio.height).toString();//y坐标              }            //生成新的坐标点              var newPosition = "";            for (var i = 0; i < each.length; i++) {                newPosition += each[i];                if (i < each.length - 1) {                    newPosition += ",";                }            }            return newPosition;        }    </script></body></html>