Отзывчивая карта изображения не работает. Нужно другое решение [дублировать]

Обновите версию своего узла.

Функции стрелок теперь работают в узле (версия 4.0.0), см. здесь: ECMAScript 2015 (ES6) в Node.js

Проверьте, какая версия, с которой вы работаете с node -v

Вероятно, вам нужно обновить таблицу совместимости здесь, чтобы узнать, что еще доступно:

Таблица совместимости узлов

26
задан ultrazoid 10 November 2012 в 12:04
поделиться

9 ответов

Если вы выполняете задачу с помощью JavaScript, вот кросс-браузерный код, чтобы изменить размеры всех областей в элементе 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();
}

previousWidth должен быть равен ширине исходного изображения. Вам также нужно использовать некоторые относительные единицы в HTML:

<div style="width:100%;">
<img id="Image-Maps_5201211070133251" src="Site.png" usemap="#Image-Maps_5201211070133251" border="0" width="100%" alt="" />

Рабочее демо в jsFiddle . Если вы откроете скрипт в IE, вы можете увидеть AREA s при нажатии на них.

35
ответ дан Áxel Costas Pena 1 September 2018 в 08:54
поделиться

В качестве класса (ES6):

class ResponsiveImageMap {
    constructor(map, img, width) {
        this.img = img;
        this.originalWidth = width;
        this.areas = [];

        for (const area of map.getElementsByTagName('area')) {
            this.areas.push({
                element: area,
                originalCoords: area.coords.split(',')
            });
        }

        window.addEventListener('resize', e => this.resize(e));
        this.resize();
    }

    resize() {
        const ratio = this.img.offsetWidth / this.originalWidth;

        for (const area of this.areas) {
            const newCoords = [];
            for (const originalCoord of area.originalCoords) {
                newCoords.push(Math.round(originalCoord * ratio));
            }
            area.element.coords = newCoords.join(',');
        }

        return true;
    };
}

Использование:

var map = document.getElementById('myMapId');
var image = document.getElementById('myImageId');
new ResponsiveImageMap(map, image, 800);
1
ответ дан Andriy Kuba 1 September 2018 в 08:54
поделиться

Я написал небольшую небольшую библиотеку, чтобы сохранить масштабируемое изображение с масштабируемым изображением, поэтому карта остается в синхронизации, когда изображение масштабируется. Полезно, если вы хотите сопоставить процентное масштабированное изображение и т. Д.

Его можно использовать с jQuery или без него.

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

, и вы можете видеть, что он работает.

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

32
ответ дан David Bradshaw 1 September 2018 в 08:54
поделиться

Вы можете использовать спрайты CSS для достижения этого. У вас будут части изображения, вписывающиеся в одно изображение, и таким образом вы просто будете делать один HTTP-запрос для загрузки всех изображений. Этот метод не требует javascript, и вы просто будете использовать свойство background-position; для перемещения ваших изображений.

Это эффективный метод оптимизации страницы.

0
ответ дан defau1t 1 September 2018 в 08:54
поделиться

У меня была та же проблема на прошлой неделе, и я закончил писать плагин jQuery для этого.

Вот проект gitHub:

https://github.com / etienne-martin / mapify

Основное использование:

$("img[usemap]").mapify();

Пример в реальном времени

http://emartin.ca/ mapify /

1
ответ дан Etienne Martin 1 September 2018 в 08:54
поделиться

Вы можете попытаться использовать процент в координатах, но он не будет работать в большинстве браузеров (если не все). Поэтому вы должны использовать JavaScript. Или используйте абсолютные позиционные divs с процентными координатами вместо карты.

0
ответ дан JAre 1 September 2018 в 08:54
поделиться

Я тестировал это только для прямоугольных координат, но я думаю, что он должен обобщать на круглые или многоугольники

function wrap ( img, map ) {
  var originalCoords = [ ],
      test = new Image();

  for ( var i = 0; i < map.areas.length; ++i ) {
    var coords = map.areas[i].coords;
    originalCoords.push( coords.split( "," ).map( parseFloat ) );
  }

  function resize () {
    var ratio = img.width / test.width;
    for ( var i = 0; i < map.areas.length; ++i ) {
      map.areas[i].coords = originalCoords[i].map( function ( n ) {
        return ratio * n;
      } ).join( "," );
    }
  }

  test.addEventListener( "load", function () {
    window.addEventListener( "resize", resize, false );
    resize();
  }, false );

  test.src = img.src;
}

var imgs = document.querySelectorAll( "img[usemap]" );
for ( var i = 0; i < imgs.length; ++i ) {
  var map = document.querySelector( "map[name=" + imgs[i].useMap.substring( 1 ) + "]" );
  wrap( imgs[i], map );
}
0
ответ дан moron4hire 1 September 2018 в 08:54
поделиться

Вот еще один плагин, который я только что написал для управления картами изображений: https://github.com/gestixi/pictarea

. Помимо всего прочего, области автоматически масштабируются в зависимости от размер изображения. Обратите внимание, что для отображения областей используется холст.

Основное использование:

$(function() {
  $('#map').pictarea({
    rescaleOnResize: true
  });
});
0
ответ дан Nicolas BADIA 1 September 2018 в 08:54
поделиться

, для этого вам нужно иметь атрибут data-original-coords, имеющий coords к исходному изображению

$(function () {
    function adjeustCoords() {
        var image=$('img'); //change that to your image selector
        var originalWidth=image[0].naturalWidth;
        var currentWidth=image.width();
        var ratio=currentWidth/originalWidth;
        $("map area").each(function(){
            //change that to your area selector
            var coords=$(this).attr('data-original-coords').split(',');
            coords = coords.map(function (x) {
                return Math.round(x*ratio);
                //i don't know if all browsers can accept floating point so i round the result
            });
            $(this).attr('coords',coords.join());
        });
    }
    adjeustCoords();
    $(window).resize(function(){
        adjeustCoords();
    });
});

, это работает с хромовыми, firefox и крайними наименьшими версиями

0
ответ дан robert 1 September 2018 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: