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

495 阅读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>