Адаптивная карта изображений
У меня есть существующая карта изображений в адаптивном HTML-макете. Изображения масштабируются в соответствии с размером браузера, но координаты изображения, очевидно, фиксированные размеры пикселей. Какие параметры я должен изменить размер координат карты изображения?
15 ответов:
для адаптивных карт изображений вам нужно будет использовать плагин:
https://github.com/stowball/jQuery-rwdImageMaps (больше не поддерживается)
или
https://github.com/davidjbradshaw/imagemap-resizer
никакие основные браузеры не понимают процентные координаты правильно, и все интерпретировать процентные координаты как пиксель координирует.
http://www.howtocreate.co.uk/tutorials/html/imagemaps
а также эта страница для проверки браузеров реализовать
вы также можете использовать svg вместо карты изображений. ;)
есть учебник на как это делать.
- вот jsfiddle с некоторыми хорошими эффектами наведения, описание и ссылки:http://jsfiddle.net/eLbpmsaj/
.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>
Я столкнулся с решением, которое вообще не использует карты изображений, а скорее привязывает теги, которые абсолютно расположены над изображением. Единственным недостатком было бы то, что точка доступа должна быть прямоугольной, но плюс в том, что это решение не зависит от Javascript, а только от CSS. Есть сайт, который можно использовать для генерации HTML кода для якорей:http://www.zaneray.com/responsive-image-map/
я помещаю изображение и сгенерированные теги привязки в a относительно расположенный тег div, и все отлично работало на изменении размера окна и на моем мобильном телефоне.
Дэвид Брэдшоу написал милую маленькую библиотеку, которая решает эту проблему. Он может быть использован с или без jQuery.
следующий метод отлично работает для меня, так что вот моя полная реализация:
<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>
вы можете получить отзывчивое изображение карты, используя ссылку ниже
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 = document.body.clientWidth; return true; }; window.onresize = this.resize; }, imageMap = new ImageMap(document.getElementById('map_ID'), document.getElementById('img_ID')); imageMap.resize(); return; }<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>
Работа для меня (не забудьте изменить 3 вещи в коде):
previousWidth (исходный размер изображения)
map_ID (идентификатор вашей карты изображений)
img_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>Javascript:
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/
http://home.comcast.net / ~urbanjost/semaphore.html это верхняя страница для обсуждения, и на самом деле имеет ссылки на JavaScript-решение проблемы. Я получил уведомление этот HTML будет поддерживать процентные единицы в будущем, но я не видел никакого прогресса в этом через некоторое время (вероятно, прошло уже больше года с тех пор, как я услышал, что поддержка будет оказана), поэтому работа вокруг, вероятно, стоит посмотреть, если вам удобно с JavaScript / ECMAScript.
я сталкиваюсь с тем же требованием, где,Я хочу показать отзывчивую карту изображений, которая может изменять размер с любым размером экрана, и важно то, что я хочу выделить эти координаты.
поэтому я попробовал много библиотек, которые могут изменять координаты в зависимости от размера экрана и события. И я получил лучшее решение(jquery.imagemapster.минута.js), который отлично работает почти со всеми браузерами. Также я интегрировал его с Лето 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/[email protected]/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>надеюсь помочь кому-нибудь.
Это зависит, вы можете использовать jQuery для регулировки диапазонов пропорционально я думаю. Кстати, почему вы используете карту изображений? Вы не можете использовать масштабирование divs или другие элементы для этого?
для тех, кто не хочет прибегать к JavaScript, вот пример нарезки изображения:
http://codepen.io/anon/pen/cbzrK
когда вы масштабируете окно, изображение клоуна будет масштабироваться соответственно, и когда это произойдет, нос клоуна остается гиперссылкой.
Проверьте изображения-карты плагин на Github. Он работает как с ванильным JavaScript, так и в качестве плагина jQuery.
$('img[usemap]').imageMap(); // jQuery ImageMap('img[usemap]') // JavaScriptПроверьте демо.
похоже на ответ Орланда здесь: https://stackoverflow.com/a/32870380/462781
в сочетании с кодом Криса здесь: https://stackoverflow.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.
по какой-то причине ни одно из этих решений не сработало для меня. У меня был лучший успех с помощью преобразований.
transform: translateX(-5.8%) translateY(-5%) scale(0.884);
Comments