图像映射在 iOS 设备上不起作用,大图像会被设备重新缩放

Posted

技术标签:

【中文标题】图像映射在 iOS 设备上不起作用,大图像会被设备重新缩放【英文标题】:image map not working on iOS devices, with large images that get rescaled by the device 【发布时间】:2011-09-30 01:25:40 【问题描述】:

我正在使用 php 在我们公司的 Intranet 上开发一个内部 Web 应用程序。该应用程序的一个部分向用户显示了几张高分辨率图像。这些图像在 5000x3500 像素的区域内。每个图像都有一个图像映射(使用矩形区域),并且在我尝试过的桌面浏览器中一切正常。

我发现的问题是,当用户通过他们的 ios 设备访问该网站时,设备上的 safari 正在重新调整图像,但是图像地图坐标没有被调整以匹配。

我的 PHP 生成的 html 示例如下:

<img src="largeimage.jpg"   usemap="#examplemap">
<map name="examplemap">
  <area shape="rect" coords="0,0,5000,500" href="blah1"/>
  <area shape="rect" coords="0,500,2500,3500" href="blah2"/>
  <area shape="rect" coords="2500,500,5000,3500" href="blah3"/>
</map>

(图像地图中的实际矩形坐标以图像大小的百分比计算)。

我知道由于设备上的内存限制,safari 正在调整图像大小,但我需要找到一种方法来缩放图像映射以适应,或者用其他可以完成相同工作的东西替换图像映射。谁能给点建议?

【问题讨论】:

我实际上正在经历同样的事情。你认为这是一个已知的错误吗?我不知道它是否有帮助,但在 iPhone 上,当我持有风景风格时,我的地图可以正常工作。尝试加载页面纵向样式会破坏地图。无论哪种风格,向相反方向旋转也会破坏它。 开始赏金来获得这个。我什至尝试过 - 我不知道该怎么做。 用php重新缩放图像是一种选择吗? 在黑暗中有点刺,但是将 添加到您的 中是否有帮助? @TheBlackBenzKid 这不是错误,而是 Mobile Safari 中的 documented limitation。 【参考方案1】:

这个话题在 *** 上解决了:jquery-image-map-alternative

最好的办法是使用绝对定位的锚点(也如 steveax 所建议的那样)而不是 imagemap。

更新

由于这是一个老问题,您现在可以考虑使用 SVG 地图。它们在所有现代浏览器中都受支持,响应式工作并且与图像地图一样易于使用。 (感谢用户 vladkras 的提醒)

【讨论】:

欣赏文章链接和cmets+repped。 文章链接到多个来源。我认为这种组合很好,因为它取决于客户/场景。我还会考虑 HTML5 画布 - 在图像周围映射画布线,并在画布元素上有链接。 这个链接最好的部分是未被注意到的未投票的answer 以及关于SVG 的文章【参考方案2】:

您为什么不改用响应式图像地图。这样,您仍然可以将多边形贴图用于形状奇特的物品。

http://mattstow.com/experiment/responsive-image-maps/rwd-image-maps.html

就像添加脚本一样简单。还有一行javascript

$('img[usemap]').rwdImageMaps();

【讨论】:

这仅适用于根据屏幕大小调整坐标大小。它不能在触摸设备上工作。 它对我来说真的很好用。我在同一条船上。我需要带有地图的大型桌面图像来缩放图像地图以及移动 safari 和移动 chrome 中的 safari 图像缩放。添加了 rwd,它们工作得很好。 此方法不适用于 iOS 版 chrome。它正在运行 safari mobile 和 chrome for android。我最终退回到绝对定位锚元素,其定位和大小的百分比值。 @Shwaydogg 它可能无法在适用于 iOS 的 chrome 上运行,因为您没有将 img 标签的“宽度”和“高度”属性显式设置为图像的原生宽度/高度,然后使用CSS 来设置你想要的实际宽度/高度。这就是我的问题。【参考方案3】:

内森的评论是正确的。您需要修复视口以防止缩放。基本上,要么指定一个固定的像素宽度,要么将比例设置为 1.0 并设置 user-scalable=no

请参阅此文档以供参考:

http://developer.apple.com/library/ios/#DOCUMENTATION/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html

使用区域标签的另一种方法是使用带有事件 x/y 和边界的 javascript 作为您的命中区域。

【讨论】:

我实际上只是将 PSD 创建为表格 - 使这些单元格链接图像并以这种方式完成。还将 display:block 和 border-collaspe 添加到表格单元格 - 而不是地图。我尝试了所有这些,但没有运气。我会推荐这个供其他人使用:econsultancy.com/uk/blog/… FWIW 这对我有用:&lt;meta name="viewport" content="user-scalable=no, width=1000" /&gt;(我的页面宽度是 1000px)【参考方案4】:

我最近在一个项目中遇到了这个限制,我们需要能够缩放,这就是我为解决这个问题所做的:

将图像分成 4 个象限

将 4 张图片放入 div 中,widthheight 设置为 50% 和 position: absolute;

绝对定位&lt;a&gt; 元素在象限的父元素中使用 百分比值和高z-index

像这样:

CSS

#map-frame  position: relative; 
.map 
    display: block;
    position: absolute;
    width: 5%;
    height: 3%;
    z-index: 99;

.q 
    position: absolute;
    width: 50%;
    height: 50%;

.q img 
    display: block;
    max-width: 100%;

.q1 
    top: 0;
    left: 0;

.q2 
    top: 0;
    right: 0;

.q3 
    bottom: 0;
    left: 0;

.q4 
    bottom: 0;
    right: 0;

HTML

<div id="map-frame">
    <a class="map" href="foo.html" style="top: 20%; left: 20%;">
    <a class="map" href="foo.html" style="top: 40%; left: 20%;">
    <a class="map" href="foo.html" style="top: 20%; left: 40%;">
    <a class="map" href="foo.html" style="top: 40%; left: 40%;">
    <div id="q1" class="q">
        <img  src="q1.jpg" />
    </div>
    <div id="q2" class="q">
        <img  src="q2.jpg" />
    </div>
    <div id="q3" class="q">
        <img  src="q3.jpg" />
    </div>
    <div id="q4" class="q">
        <img  src="q4.jpg" />
    </div>
</div>

【讨论】:

【参考方案5】:

将所有内容放在一个表中。设置为 100% 宽度。 iphone 似乎没有缩放表格......我正在努力解决这个问题,因为我的图像只是丢失了,或者在一个 div 中。 没有一个矩形坐标链接工作。但是当我把所有东西都放在一张桌子里时......好吧,试试看吧:)

【讨论】:

【参考方案6】:

我挖掘了这篇文章,因为我刚刚找到了一个让图像映射在 iOS 上工作的解决方案。

将您的地图放在一个锚点内并在其上监听点击/点击事件,以检查目标元素是否与地图的区域匹配。

HTML

<a id="areas" href="#">
    <img src="example.jpg" usemap="#mymap"  >
    <map name="mymap">
        <area id="area1" shape="poly" coords="X1,Y1,X2,Y2...">
        <area id="area2" shape="poly" coords="X1,Y1,X2,Y2...">
        <area id="area3" shape="poly" coords="X1,Y1,X2,Y2...">
    </map>
</a>

JAVASCRIPT

$("#areas").on("click tap", function (evt) 
    evt.preventDefault();
    if (evt.target.tagName.toLowerCase() == "area") 
        console.log("Shape " + evt.target.id.replace("area", "") + " clicked!");
    
);

在 iPad4 上使用移动 safari 6.0 测试

【讨论】:

【参考方案7】:

不要使用 Default &lt;img usemap="#map"&gt;&lt;map name="map"&gt; 更改它。喜欢&lt;img usemap="#mapLink"&gt;&lt;map name="mapLink"&gt;。它正在工作!!!

【讨论】:

有什么区别?【参考方案8】:

usemap 属性中简单地使用# 似乎可以解决iPhone 上的问题。

例如&lt;img usemap="#mapLink"&gt;&lt;map name="mapLink"&gt;

【讨论】:

【参考方案9】:

我的解决方案很简单。我刚刚在 DIV 的 css 中分配了一个高度和宽度以匹配图像的大小,一切正常。原始图像尺寸为 825 x 1068,所以

    <div style= width: 825px; height: 1068px;">
    ...
    </div>

希望对你有帮助。

【讨论】:

【参考方案10】:

我只用 1 行代码解决了这个问题,没有 JavaScript。只有 CSS,你需要使用 zoom 属性来缩放你的图像,一切都会正常,就像这样

img 
    zoom: 0.3;

【讨论】:

【参考方案11】:
<img src="largeimage.jpg"   usemap="#examplemap">
<map name="examplemap">
  <area shape="rect" coords="0,0,100%,10%" href="blah1"/>
  <area shape="rect" coords="0,10%,50%,70%" href="blah2"/>
  <area shape="rect" coords="50%,10%,100%,70%" href="blah3"/>
</map>

请尝试在坐标内使用百分比值

【讨论】:

coords中的值需要表达as CSS pixels @steveax 就在这里,因为我尝试使用百分比 - 它不起作用。

以上是关于图像映射在 iOS 设备上不起作用,大图像会被设备重新缩放的主要内容,如果未能解决你的问题,请参考以下文章

颤振图像上传在真实设备上不起作用,虽然它适用于模拟器

突然 fcm 通知在某些 iOS 设备上不起作用

为啥 tailwind css 在 iPhone ios 设备上不起作用?

transform:翻译动画在 iOS 15.1 设备上不起作用

iOS setContentOffset 在 ipad 上不起作用

一些 javascript 函数在 iOS 设备(iPhone、iPad)上不起作用