반응 형 이미지 맵


145

반응 형 html 레이아웃에 기존 이미지 맵이 있습니다. 이미지는 브라우저 크기에 따라 크기가 조정되지만 이미지 좌표는 분명히 고정 된 픽셀 크기입니다. 이미지 맵 좌표의 크기를 조정하려면 어떤 옵션이 필요합니까?


6
이 질문은 지리적지도가 아니라 <map> html 태그
jdog

4
이미지 맵 플러그인을 확인하십시오 . Javascript, Node 및 jQuery와 함께 작동
Travis Clarke

2
대안으로 SVG 이미지를 사용할 수 있습니다. 내가 읽어 보시기 바랍니다 대안으로 이미지 맵으로 SVG를 사용하여
Mawg 모니카 복원 말한다

1
이미지에서지도 위치를 지정할 수있는 JPEG 또는 앱과 유사한 앱을 업로드 할 수있는 기능이 있습니다 (예 : 이미지 맵 닷넷 등). . 그런 다음 맵을 SVG에 적용하고 웹 브라우저에서 JPG 위에 SVG를 렌더링하려고합니다. 브라우저가 JPG의 크기를 조정하면 SVG도 크기가 조정되고 SVG는 이미지 맵을 클릭 할 때 항상 호출되는 크기입니다. 이것의 어떤 부분에 대한 제안?
youcantryreachingme

2
그렇습니다. 2011 년에 제가 원했던 것입니다
jdog

답변:


89

반응 형 이미지 맵의 경우 플러그인을 사용해야합니다.

https://github.com/stowball/jQuery-rwdImageMaps (더 이상 유지되지 않음)

또는

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


주요 브라우저는 백분율 좌표를 올바르게 이해하지 못하며 모두 백분율 좌표를 픽셀 좌표로 해석합니다.

http://www.howtocreate.co.uk/tutorials/html/imagemaps

또한 브라우저가 구현하는지 테스트하기위한이 페이지

http://home.comcast.net/~urbanjost/IMG/resizeimg3.html


5
이 중 여전히 관련이 있습니까? 업데이트를 제공해 주시겠습니까?
Malachi

1
@Malachi 그렇습니다 이것은 여전히 ​​관련이 있습니다
Tom

Tom에게 감사합니다. CodeReview에 관한 질문에 대해 토론하고 있었으며, 이제 그 질문을 기억할 수 있기를 바랍니다 ....
Malachi

@Tom 이것은 하나의 이미지에만 작동합니다. 만약 우리가 다른 이미지를 배치하면 두 번째 및 세 번째 이미지 등에서는 작동하지 않습니다. 그냥 확인하십시오.
User2413

1
모든 주요 브라우저가 imagemapper.noc.io를
frthjf

43

이미지 맵 대신 svg를 사용할 수도 있습니다. ;)

이를 수행하는 방법에 대한 학습서가 있습니다 .

.hover_group:hover {
  opacity: 1;
}
#projectsvg {
  position: relative;
  width: 100%;
  padding-bottom: 77%;
  vertical-align: middle;
  margin: 0;
  overflow: hidden;
}
#projectsvg svg {
  display: inline-block;
  position: absolute;
  top: 0;
  left: 0;
}
<figure id="projectsvg">
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1920 1080" preserveAspectRatio="xMinYMin meet" >
<!-- set your background image -->
<image width="1920" height="1080" xlink:href="http://placehold.it/1920x1080" />
<g class="hover_group" opacity="0">
  <a xlink:href="https://example.com/link1.html">
    <text x="652" y="706.9" font-size="20">First zone</text>
    <rect x="572" y="324.1" opacity="0.2" fill="#FFFFFF" width="264.6" height="387.8"></rect>
  </a>
</g>
<g class="hover_group" opacity="0">
  <a xlink:href="https://example.com/link2.html">
    <text x="1230.7" y="952" font-size="20">Second zone</text>
    <rect x="1081.7" y="507" opacity="0.2" fill="#FFFFFF" width="390.2" height="450"></rect>
  </a>
</g>
  </svg>
</figure>


1
튜토리얼 링크가 끊어졌습니다. jsfiddle의 이미지도.
Cristiano Maia

튜토리얼 링크가 깨 졌음을 알리고 jsfiddle 및 코드 스 니펫을 업데이트했습니다. 머리 위로 주셔서 감사합니다
belgac

이것은 놀라운 솔루션입니다. 나는 그것을 성공적으로 사용했고 매력처럼 작동합니다. 감사!
Jaume Mussons Abad

3
이 코드 생성기를 사용하여 매우 간단하게 만드십시오. imagemapper.noc.io/#
Brett Donald

1
이것은 2020 년에 최고의 반응 형 솔루션이어야합니다.
신화 인코더

39

1
저와 eveyrone을위한 참고로 ... 나는 이것이 잘 작동하지만 아코디언 내부에서는 그렇지 않다는 것을 발견했습니다. 부트 스트랩 3을 사용하고 있으며 이미지에서 아코디언이 열린 상태로 페이지를로드하지 않으면 아코디언을 열면 브라우저 창의 크기가 조정되지 않으면 이미지 맵이 없습니다.
jasonflaherty

1
@jasonflaherty지도를 표시하도록 크기 조정 이벤트를 트리거 할 수 있습니까? $(window).trigger('resize');
Steve Meisner

@SteveMeisner 나는 그것을 시도하지 않았지만 ... 그것을 새로 고치지 않겠습니까?
jasonflaherty

트윗 담아 가기 바인딩하는 요소 ( window이 경우)에서 resize 이벤트를 "트리거"합니다 . 행운을 빕니다.
Steve Meisner


19

이미지 맵을 전혀 사용하지 않고 이미지 위에 절대적으로 배치 된 앵커 태그를 사용하는 솔루션을 가로 질러 실행했습니다. 유일한 단점은 핫스팟이 직사각형이어야한다는 것입니다. 그러나이 솔루션은 자바 스크립트에 의존하지 않고 CSS에만 의존한다는 것입니다. 앵커에 대한 HTML 코드를 생성하는 데 사용할 수있는 웹 사이트가 있습니다. http://www.zaneray.com/responsive-image-map/

이미지와 생성 된 앵커 태그를 상대적으로 배치 된 div 태그에 넣고 모든 것이 창 크기 조정 및 휴대 전화에서 완벽하게 작동했습니다.


2
좋은 발견! 이 목록에 기여해 주셔서 감사합니다
jdog

1
나는이 naswer를 충분히지지 할 수 없다!! 훌륭한 튜토리얼; 포괄적이고 이해하기 쉬운. 모든 내용을 읽어야하지만, 특히 흥미있는 것은 tutorials.jenkov.com/svg/scripting.html입니다.
Mawg는 Monica를 복원

클릭 할 영역이 사각형 인 경우이 방법은 정말 간단하지만 훌륭한 솔루션입니다.
user2875289

정말 대단합니다. DNN 사이트와 함께 저를 위해 일했습니다. Jeffrey가 말했듯이 방금 <img>와 생성 된 html을 상대 위치 div 안에 떨어 뜨 렸습니다. 감사!
Ted Krapf

18

직사각형 적중 영역에 문제가 없다면이 문제를 해결하는 비 JS 방법을 찾았습니다.

우선 이미지가 상대적으로 위치한 div에 있는지 확인하십시오. 그런 다음 이미지를이 div 안에 넣으십시오. 즉 div의 모든 공간을 차지합니다. 마지막으로 주 div 내에서 이미지 아래에 절대 위치 div를 추가하고 상단, 왼쪽, 너비 및 높이에 백분율을 사용하여 링크 적중 영역을 원하는 크기와 위치로 가져옵니다.

처음 작업 할 때 div에 검은 색 배경색 (이상적으로는 알파 페이딩을 사용하여 링크 된 내용을 볼 수 있음)을 제공하고 브라우저에서 코드 검사기를 사용하여 백분율을 실시간으로 조정하는 것이 가장 쉽다는 것을 알았습니다. 바로 사용할 수 있습니다.

작업 할 수있는 기본 개요는 다음과 같습니다. 백분율로 모든 작업을 수행하면 요소가 모두 이미지 배율과 동일한 상대 크기 및 위치를 유지하게됩니다.

<div style="position: relative;">
  <img src="background-image.png" style="width: 100%; height: auto;">
  <a href="/link1"><div style="position: absolute; left: 15%; top: 20%; width: 12%; height: 8%; background-color: rgba(0, 0, 0, .25);"></div></a>
  <a href="/link2"><div style="position: absolute; left: 52%; top: 38%; width: 14%; height: 20%; background-color: rgba(0, 0, 0, .25);"></div></a>
</div>

Chrome 또는 선택한 브라우저에서 코드 관리자와 함께이 코드를 사용하고 상자가 제대로 표시 될 때까지 백분율을 조정하십시오 (소수 백분율을 더 정확하게 사용할 수 있음). 또한 선택 background-color의를 transparent당신이 당신의 히트 영역은 눈에 보이지 않는되고 싶어하기 때문에 그것을 사용할 준비가되면.


이것은 훌륭한 솔루션입니다! 감사합니다
xims

좋은 해결책! UIkit은 마커에 대해 동일한 기술을 사용합니다. getuikit.com/docs/marker
xela84

훌륭한 솔루션, 공유해 주셔서 감사합니다! 나는 이것을 모바일 앱에서 사용하고 있으며 다른 화면의 문제를 해결합니다.
JohnGIS


7

다음 방법은 완벽하게 작동하므로 여기에 전체 구현이 있습니다.

<img id="my_image" style="display: none;" src="my.png" width="924" height="330" border="0" usemap="#map" />

<map name="map" id="map">
    <area shape="poly" coords="774,49,810,21,922,130,920,222,894,212,885,156,874,146" href="#mylink" />
    <area shape="poly" coords="649,20,791,157,805,160,809,217,851,214,847,135,709,1,666,3" href="#myotherlink" />
</map>

<script>
$(function(){
    var image_is_loaded = false;
    $("#my_image").on('load',function() {
        $(this).data('width', $(this).attr('width')).data('height', $(this).attr('height'));
        $($(this).attr('usemap')+" area").each(function(){
            $(this).data('coords', $(this).attr('coords'));
        });

        $(this).css('width', '100%').css('height','auto').show();

        image_is_loaded = true;
        $(window).trigger('resize');
    });


    function ratioCoords (coords, ratio) {
        coord_arr = coords.split(",");

        for(i=0; i < coord_arr.length; i++) {
            coord_arr[i] = Math.round(ratio * coord_arr[i]);
        }

        return coord_arr.join(',');
    }
    $(window).on('resize', function(){
        if (image_is_loaded) {
            var img = $("#my_image");
            var ratio = img.width()/img.data('width');

            $(img.attr('usemap')+" area").each(function(){
                console.log('1: '+$(this).attr('coords'));
                $(this).attr('coords', ratioCoords($(this).data('coords'), ratio));
            });
        }
    });
});
</script>

4

나를 위해 일하고 (코드에서 3 가지를 변경해야 함) :

  • previousWidth (원본 이미지 크기)

  • map_ID (이미지 맵의 ID)

  • img_ID (이미지의 ID)

HTML :

<div style="width:100%;">
    <img id="img_ID" src="http://www.gravatar.com/avatar/0865e7bad648eab23c7d4a843144de48?s=128&d=identicon&r=PG" usemap="#map" border="0" width="100%" alt="" />
</div>
<map id="map_ID" name="map">
<area shape="poly" coords="48,10,80,10,65,42" href="javascript:;" alt="Bandcamp" title="Bandcamp" />
<area shape="poly" coords="30,50,62,50,46,82" href="javascript:;" alt="Facebook" title="Facebook" />
<area shape="poly" coords="66,50,98,50,82,82" href="javascript:;" alt="Soundcloud" title="Soundcloud" />
</map>

자바 스크립트 :

window.onload = function () {
    var ImageMap = function (map, img) {
            var n,
                areas = map.getElementsByTagName('area'),
                len = areas.length,
                coords = [],
                previousWidth = 128;
            for (n = 0; n < len; n++) {
                coords[n] = areas[n].coords.split(',');
            }
            this.resize = function () {
                var n, m, clen,
                    x = img.offsetWidth / 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 = img.offsetWidth;
                return true;
            };
            window.onresize = this.resize;
        },
        imageMap = new ImageMap(document.getElementById('map_ID'), document.getElementById('img_ID'));
    imageMap.resize();
    return;
}

JSFiddle : http://jsfiddle.net/p7EyT/154/


3

나는 어떤 화면 크기로도 크기를 조정할 수있는 반응 형 이미지 맵을 표시하고 싶은 중요한 요구 사항을 가지고 있으며, 그 좌표를 강조하고 싶습니다 .

그래서 화면 크기와 이벤트에 따라 좌표의 크기를 조정할 수있는 많은 라이브러리를 시도했습니다. 그리고 거의 모든 브라우저에서 잘 작동하는 최고의 솔루션 (jquery.imagemapster.min.js)을 얻었습니다. 또한 이미지 맵을 만드는 Summer Plgin 과 통합했습니다 .

 var resizeTime = 100;
 var resizeDelay = 100;    

$('img').mapster({
        areas: [
            {
                key: 'tbl',
                fillColor: 'ff0000',
                staticState: true,
                stroke: true
            }
        ],
        mapKey: 'state'
    });

    // Resize the map to fit within the boundaries provided

    function resize(maxWidth, maxHeight) {
        var image = $('img'),
            imgWidth = image.width(),
            imgHeight = image.height(),
            newWidth = 0,
            newHeight = 0;

        if (imgWidth / maxWidth > imgHeight / maxHeight) {
            newWidth = maxWidth;
        } else {
            newHeight = maxHeight;
        }
        image.mapster('resize', newWidth, newHeight, resizeTime);
    }

    function onWindowResize() {

        var curWidth = $(window).width(),
            curHeight = $(window).height(),
            checking = false;
        if (checking) {
            return;
        }
        checking = true;
        window.setTimeout(function () {
            var newWidth = $(window).width(),
                newHeight = $(window).height();
            if (newWidth === curWidth &&
                newHeight === curHeight) {
                resize(newWidth, newHeight);
            }
            checking = false;
        }, resizeDelay);
    }

    $(window).bind('resize', onWindowResize);
img[usemap] {
        border: none;
        height: auto;
        max-width: 100%;
        width: auto;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/jquery-imagemapster@1.2.10/dist/jquery.imagemapster.min.js"></script>

<img src="https://discover.luxury/wp-content/uploads/2016/11/Cities-With-the-Most-Michelin-Star-Restaurants-1024x581.jpg" alt="" usemap="#map" />
<map name="map">
    <area shape="poly" coords="777, 219, 707, 309, 750, 395, 847, 431, 916, 378, 923, 295, 870, 220" href="#" alt="poly" title="Polygon" data-maphilight='' state="tbl"/>
    <area shape="circle" coords="548, 317, 72" href="#" alt="circle" title="Circle" data-maphilight='' state="tbl"/>
    <area shape="rect" coords="182, 283, 398, 385" href="#" alt="rect" title="Rectangle" data-maphilight='' state="tbl"/>
</map>

누군가에게 도움을 바랍니다.


2

http://home.comcast.net/~urbanjost/semaphore.html 은 토론의 최상위 페이지이며 실제로 문제에 대한 JavaScript 기반 솔루션에 대한 링크가 있습니다. 나는 HTML이 미래에 퍼센트 단위를 지원할 것이라는 통지를 받았지만 꽤 오랜 시간 동안 이것에 대한 진전을 보지 못했다. JavaScript / ECMAScript에 익숙한 지 살펴볼 가치가 있습니다.


2

Github 에서 이미지 맵 플러그인을 확인하십시오 . 그것은 바닐라 JavaScript와 jQuery 플러그인으로 작동합니다.

$('img[usemap]').imageMap();     // jQuery

ImageMap('img[usemap]')          // JavaScript

데모를 확인하십시오 .


1

jQuery를 사용하여 비례 적으로 범위를 조정할 수 있습니다. 그런데 왜 이미지 맵을 사용합니까? 스케일링 div 또는 다른 요소를 사용할 수 없습니까?


정확한 솔루션은 확장 된 div에서 작동하지만 이미지 맵은 "컨텐츠 관리"이며 모든 종류의 영역을 허용합니다. 감사합니다, jquery를 확인하겠습니다.
jdog

1

JavaScript에 의존하고 싶지 않은 사람들을 위해 이미지 슬라이싱 예제가 있습니다.

http://codepen.io/anon/pen/cbzrK

창의 크기를 조정하면 광대 이미지가 그에 따라 크기가 조정되며, 그럴 경우 광대의 코는 하이퍼 링크로 유지됩니다.


2
악몽에 감사드립니다!
jerrygarciuh

1
이미지 링크가 모두 끊어졌습니다.
Tyler Forsythe

0

여기 Orland의 답변과 유사합니다 : https://stackoverflow.com/a/32870380/462781

여기에 Chris의 코드와 결합되어 있습니다 : https : //.com/a/12121309/462781

영역이 격자에 맞으면 가로 세로 비율을 유지하는 너비 (%)를 사용하여 투명한 그림으로 영역을 오버레이 할 수 있습니다.

    .wrapperspace {
      width: 100%;
      display: inline-block;
      position: relative;
    }
    .mainspace {
      position: absolute;
      top: 0;
      bottom: 0;
      right: 0;
      left: 0;
    }
<div class="wrapperspace">
 <img style="float: left;" title="" src="background-image.png" width="100%" />
 <div class="mainspace">
     <div>
         <img src="space-top.png" style="margin-left:6%;width:15%;"/>
     </div>
     <div>
       <a href="http://www.example.com"><img src="space-company.png" style="margin-left:6%;width:15%;"></a>
     </div>
  <div>
   <a href="http://www.example.com"><img src="space-company.png" style="margin-left:6%;width:10%;"></a>
   <a href="http://www.example.com"><img src="space-company.png" style="width:20%;"></a>
  </div>
 </div>
</div>

여백을 %로 사용할 수 있습니다. 또한 "공간"이미지는 3 단계 div 내에서 나란히 배치 할 수 있습니다.


0

어떤 이유로 든 이러한 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 나는 변환을 사용하여 최고의 성공을 거두었습니다.

transform: translateX(-5.8%) translateY(-5%) scale(0.884);

0

반응 형 너비 및 높이

window.onload = function () {
        var ImageMap = function (map, img) {
                var n,
                    areas = map.getElementsByTagName('area'),
                    len = areas.length,
                    coords = [],
                    imgWidth = img.naturalWidth,
                    imgHeight = img.naturalHeight;
                for (n = 0; n < len; n++) {
                    coords[n] = areas[n].coords.split(',');
                }
            this.resize = function () {
                var n, m, clen,
                    x = img.offsetWidth / imgWidth,
                    y = img.offsetHeight / imgHeight;
                    imgWidth = img.offsetWidth;
                    imgHeight = img.offsetHeight;
                for (n = 0; n < len; n++) {
                    clen = coords[n].length;
                    for (m = 0; m < clen; m +=2) {
                        coords[n][m] *= x;
                        coords[n][m+1] *= y;
                    }
                    areas[n].coords = coords[n].join(',');
                }
                    return true;
                };
                window.onresize = this.resize;
            },
        imageMap = new ImageMap(document.getElementById('map_region'), document.getElementById('prepay_region'));
        imageMap.resize();
        return;
    }

2015 년 코드와 Niente0의 답변 의 차이점을 보여주는 내용을 더 추가 할 수 있습니까 ?
Michael-Clay는 어디에 있습니까 Shirky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.