动态调整图像映射和图像的大小

ult*_*oid 33 html javascript image map

我正在尝试在我的网站上制作一个根据窗口大小调整大小的图像映射...我想知道是否有任何方式使用HTML来执行此操作或者我是否必须使用Javascript或其他方法执行此操作语言.

<div style="text-align:center; width:1920px; margin-left:auto; margin-right:auto;">
<img id="Image-Maps_5201211070133251" src="Site.png" usemap="#Image-Maps_5201211070133251" border="0" width="1920" height="1080" alt="" />
<map id="_Image-Maps_5201211070133251" name="Image-Maps_5201211070133251">
<area shape="poly" coords="737,116,1149,118,944,473," href="http://essper.bandcamp.com" alt="Bandcamp" title="Bandcamp"   />
<area shape="poly" coords="1006,589,1418,590,1211,945," href="http://soundcloud.com/essper" alt="Soundcloud" title="Soundcloud"   />
<area shape="poly" coords="502,590,910,591,708,944," href="http://facebook.com/the.essper" alt="Facebook" title="Facebook"   />
</map>
Run Code Online (Sandbox Code Playgroud)

Tee*_*emu 42

如果你最终做JavaScript的任务,这里是一个跨浏览器codesnippet来调整在各领域的MAP元素.

window.onload = function () {
    var ImageMap = function (map) {
            var n,
                areas = map.getElementsByTagName('area'),
                len = areas.length,
                coords = [],
                previousWidth = 1920;
            for (n = 0; n < len; n++) {
                coords[n] = areas[n].coords.split(',');
            }
            this.resize = function () {
                var n, m, clen,
                    x = document.body.clientWidth / previousWidth;
                for (n = 0; n < len; n++) {
                    clen = coords[n].length;
                    for (m = 0; m < clen; m++) {
                        coords[n][m] *= x;
                    }
                    areas[n].coords = coords[n].join(',');
                }
                previousWidth = document.body.clientWidth;
                return true;
            };
            window.onresize = this.resize;
        },
        imageMap = new ImageMap(document.getElementById('map_ID'));
    imageMap.resize();
}
Run Code Online (Sandbox Code Playgroud)

previousWidth必须等于原始图像的宽度.您还需要在HTML中使用一些相对单位:

<div style="width:100%;">
<img id="Image-Maps_5201211070133251" src="Site.png" usemap="#Image-Maps_5201211070133251" border="0" width="100%" alt="" />
Run Code Online (Sandbox Code Playgroud)

jsFiddle上工作演示.如果你在IE中打开小提琴,你可以AREA在点击时看到s.


Dav*_*haw 41

我写了一个小的lib来保持imageMap缩放到可调整大小的图像,因此图像在图像缩放时保持同步.想要映射百分比缩放图像等时很有用

它可以与jQuery一起使用或不与jQuery一起使用.

https://github.com/davidjbradshaw/imagemap-resizer

你可以看到它在工作.

http://davidjbradshaw.com/imagemap-resizer/example/

  • 这太棒了!我希望我可以多次投票 (7认同)
  • 这绝对是太棒了......像魅力一样工作,为我节省了很多时间!@craphunter:在我看来,应该编写一个不同的插件来突出显示,这个由David提供的lib非常好! (2认同)
  • 感谢你为此掠夺我救我:D (2认同)

Nag*_*tán 5

这是我最简单的解决方案。不需要 jquery 或任何插件。注意,此解决方案不处理标记中的任何错误或大小不成比例的图像。

function mapResizer(maps) {
    if (!maps) {maps = document.getElementsByTagName('map');}
    for (const map of maps) {
        map.img = document.querySelectorAll(`[usemap="#${map.name}"]`)[0];
        map.areas = map.getElementsByTagName('area');
        for (const area of map.areas) {
            area.coordArr = area.coords.split(',');
        }
    }
    function resizeMaps() {
        for (const map of maps) {
            const scale = map.img.offsetWidth / (map.img.naturalWidth || map.img.width);
            for (const area of map.areas) {
                area.coords = area.coordArr.map(coord => Math.round(coord * scale)).join(',');
            }
        }
    }
    window.addEventListener('resize', () => resizeMaps());
    resizeMaps();
}
if (document.readyState == 'complete') {
    mapResizer();
} else {
    window.addEventListener('load', () => mapResizer());
}
Run Code Online (Sandbox Code Playgroud)