英文:
How to make responsive imagemap WITH highlight on mouseover?
问题
I need to make responsive imagemap with highlight when the mouse is over the specific part of the image. Can it be done (and how) using ONLY JavaScript, html and CSS ? I found some threads here but only for the part with the responsive imagemap and they used some jQuery plugins. Please, help
I used image-map.net but that didnt resolve the problem.
<section>
<div>
<img id="Image-Maps-Com-image-maps-2023-03-03-153207" src="https://www.linkpicture.com/q/A1C-PBOBiFL._AC_SL1500.jpg" width="1396" height="940" orgWidth="1396" orgHeight="940" usemap="#image-maps-2023-03-03-153207" alt="" />
<map name="image-maps-2023-03-03-153207" id="ImageMapsCom-image-maps-2023-03-03-153207">
<area shape="rect" coords="1394,938,1396,940" alt="Image Map" style="outline:none;" title="Image Map" href="brazil.html" />
<area alt="" title="" href="brazil.html" shape="poly" coords="477,473,499,484,509,501,539,513,561,522,551,552,538,590,512,597,478,593,452,600,437,596,428,581,418,571,394,545,384,521,389,501,397,477,401,462,412,449,443,455" style="outline:none;" target="_self" onmouseover="function highlight() {
'some code here for highlighting'
}" />
</map>
</div>
</section>
* {
box-sizing: border-box;
}
body {
margin: 0;
overflow: hidden;
min-height: 100%;
min-width: 100%;
}
section img {
position: fixed;
flex-shrink: 0;
width: 100vw;
height: 100vh;
}
(请注意,JavaScript 部分未提供,需要您自行添加以实现鼠标悬停时的高亮效果。)
英文:
I need to make responsive imagemap with highlight when the mouse is over the specific part of the image. Can it be done (and how) using ONLY JavaScript, html and CSS ? I found some threads here but only for the part with the responsive imagemap and they used some jQuery plugins. Please, help
I used image-map.net but that didnt resolve the problem.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-css -->
* {
box-sizing: border-box;
}
body {
margin: 0;
overflow: hidden;
min-height: 100%;
min-width: 100%;
}
section img {
position: fixed;
flex-shrink: 0;
width: 100vw;
height: 100vh;
}
<!-- language: lang-html -->
<section>
<div>
<img id="Image-Maps-Com-image-maps-2023-03-03-153207" src="https://www.linkpicture.com/q/A1C-PBOBiFL._AC_SL1500.jpg" width="1396" height="940" orgWidth="1396" orgHeight="940" usemap="#image-maps-2023-03-03-153207" alt="" />
<map name="image-maps-2023-03-03-153207" id="ImageMapsCom-image-maps-2023-03-03-153207">
<area shape="rect" coords="1394,938,1396,940" alt="Image Map" style="outline:none;" title="Image Map" href="brazil.html" />
<area alt="" title="" href="brazil.html" shape="poly" coords="477,473,499,484,509,501,539,513,561,522,551,552,538,590,512,597,478,593,452,600,437,596,428,581,418,571,394,545,384,521,389,501,397,477,401,462,412,449,443,455" style="outline:none;" target="_self"
onmouseover="function highlight(){
'some code here for highlighting'}" />
</map>
</section>
<!-- end snippet -->
答案1
得分: 2
你最好的选择可能是使用SVG。您可以使其可访问,响应式,并且可以轻松使用CSS进行样式设计。
如何创建响应式和可访问的SVG地图:
- 将SVG的
viewBox
设置为图像的自然宽度和高度(例如,如果您的地图宽度为1396,高度为940,那么将viewBox
设置为viewBox="0 0 1396 940"
)。 - 将SVG的高度和宽度都设置为100%,以便填充放置它的容器并保持其宽高比。
- 确保将图像标签的高度和宽度属性都设置为100%,以便SVG中的图像填充SVG的
viewBox
。 - 在图像后面添加一个
<polygon />
,这样在渲染时它就位于地图图像的上方。 - 将
points
属性设置为图像地图中区域多边形的相同值。 - 将多边形的
fill
属性设置为transparent
,以便可以进行悬停操作。 - 在JavaScript中使用
onclick
属性或事件监听器创建点击处理程序。 - 使用CSS进行样式设计。
- 要使多边形可访问,添加一个
<title>
并将其和多边形包装在自己的组内(例如:
<g>
<title id="title" lang="en">点击访问关于巴西的页面</title>
<polygon ... />
</g>
工作示例:
<main>
<h1>将鼠标悬停/点击巴西</h1>
<svg viewBox="0 0 1396 940" width="100%" height="100%">
<image x="0" y="0" width="100%" height="100%" xlink:href="https://www.linkpicture.com/q/A1C-PBOBiFL._AC_SL1500.jpg" />
<polygon onclick="gotolink('brazil.html')" points="477,473,499,484,509,501,539,513,561,522,551,552,538,590,512,597,478,593,452,600,437,596,428,581,418,571,394,545,384,521,389,501,397,477,401,462,412,449,443,455" fill="transparent" stroke-miterlimit="10" />
</svg>
</main>
英文:
Your best bet would probably be an SVG. You can make it accessible, responsive and you can style it easily with CSS.
How to create a responsive and accessible SVG map:
- Set the SVG
viewBox
to the natural width and height of your image (e.g. your map had a width of 1396 and a height of 940, so I set the viewBox toviewBox="0 0 1396 940"
). - Set the SVG height and width to 100% so that it fills whatever container you put it in and retain its aspect ratio.
- Make sure to set the image tag height and width properties both to 100% so that the image in the SVG fills the SVG viewBox.
- Add a
<polygon />
after the image so it is on top of the map image when rendered. - Set the
points
property to the same values as your area poly in your image map. - Set the
fill
property of the poly totransparent
so that it is hoverable. - Use an onclick property or event listener in your JavaScript to create the click handler.
- Use CSS to style it as you want.
- To make the polygon accessible add a
<title>
and wrap both it and the polygon in its own group (<g>
), such as:
<g>
<title id="title" lang="en">Click to visit a page about Brazil</title>
<polygon ... />
</g>
Working example:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
function gotolink(link) {
// use window.location or similar to go to the link
console.log(link);
}
<!-- language: lang-css -->
main {
max-width: 60rem;
margin: auto;
}
polygon:hover {
stroke: hsl(320 80% 50%);
stroke-width: 2px;
fill: hsl(320 80% 50% /0.5);
}
<!-- language: lang-html -->
<main>
<h1>Hover over/click on Brazil</h1>
<svg viewBox="0 0 1396 940" width="100%" height="100%">
<image x="0" y="0" width="100%" height="100%" xlink:href="https://www.linkpicture.com/q/A1C-PBOBiFL._AC_SL1500.jpg" />
<polygon onclick="gotolink('brazil.html')" points="477,473,499,484,509,501,539,513,561,522,551,552,538,590,512,597,478,593,452,600,437,596,428,581,418,571,394,545,384,521,389,501,397,477,401,462,412,449,443,455" fill="transparent" stroke-miterlimit="10" />
</svg>
</main>
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论