【问题标题】:Is it possible to style a mouseover on an image map using CSS?是否可以使用 CSS 在图像地图上设置鼠标悬停样式?
【发布时间】:2011-12-01 15:08:46
【问题描述】:

我的网页上的图片也需要链接。我正在使用图像映射来创建链接,我想知道是否有一种方法可以在鼠标悬停时设置区域形状的样式以实现轻微的交互性。这可能吗?

我试过这个没有成功:

html

<img src="{main_photo}" alt="locations map"  usemap="#location-map" />
<map name="location-map">
    <area shape="rect" coords="208,230,290,245" href="{site_url}locations/grand_bay_al" />
    <area shape="rect" coords="307,214,364,226" href="{site_url}locations/mobile_al" />
    <area shape="rect" coords="317,276,375,290" href="{site_url}locations/loxley_al" />
</map>

css

area { border: 1px solid #d5d5d5; }

有什么建议吗?

【问题讨论】:

  • 我已经做过一次,但我必须使用 JavaScript,我的区域都是突出显示的图像,裁剪所有这些图像很痛苦,但它确实有效。我认为在 CSS 中没有任何方法可以做到这一点。除非map area:hover { border: 1px solid #d5d5d5; } 有效...

标签: html css


【解决方案1】:

仅 CSS:

在我去超市的路上想想,你当然也可以跳过整个图像映射的想法,并在图像顶部的元素上使用:hover(将 div 更改为 a-blocks)。这让事情变得简单多了,不需要 jQuery...

简短说明:

  • 图片在底部
  • 2 x a 带显示:块和绝对定位 + 不透明度:0
  • 悬停时将不透明度设置为 0.2

示例:

.area {
    background:#fff;
    display:block;
    height:475px;
    opacity:0;
    position:absolute;
    width:320px;
}
#area2 {
    left:320px;
}
#area1:hover, #area2:hover {
    opacity:0.2;
}
<a id="area1" class="area" href="#"></a>
<a id="area2" class="area" href="#"></a>
<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Saimiri_sciureus-1_Luc_Viatour.jpg/640px-Saimiri_sciureus-1_Luc_Viatour.jpg" width="640" height="475" />

使用 jQuery 的原始答案

我刚刚用 jQuery 创建了类似的东西,我认为它不能只用 CSS 来完成。

简短说明:

  • 图片在底部
  • 具有绝对定位的翻转(图像或颜色)的 Divs + display:none
  • 带有实际 #map 的透明 gif 位于顶部(绝对位置)(以防止在出现翻转时调用 mouseout
  • jQuery 用于显示/隐藏 div

$(document).ready(function() {
  if ($('#location-map')) {
    $('#location-map area').each(function() {
      var id = $(this).attr('id');
      $(this).mouseover(function() {
        $('#overlay' + id).show();

      });

      $(this).mouseout(function() {
        var id = $(this).attr('id');
        $('#overlay' + id).hide();
      });

    });
  }
});
body,
html {
  margin: 0;
}

#emptygif {
  position: absolute;
  z-index: 200;
}

#overlayr1 {
  position: absolute;
  background: #fff;
  opacity: 0.2;
  width: 300px;
  height: 160px;
  z-index: 100;
  display: none;
}

#overlayr2 {
  position: absolute;
  background: #fff;
  opacity: 0.2;
  width: 300px;
  height: 160px;
  top: 160px;
  z-index: 100;
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<img src="http://www.tfo.be/jobs/axa/premiumplus/img/empty.gif" width="300" height="350" border="0" usemap="#location-map" id="emptygif" />
<div id="overlayr1">&nbsp;</div>
<div id="overlayr2">&nbsp;</div>
<img src="http://2.bp.blogspot.com/_nP6ESfPiKIw/SlOGugKqaoI/AAAAAAAAACs/6jnPl85TYDg/s1600-R/monkey300.jpg" width="300" height="350" border="0" />
<map name="location-map" id="location-map">
  <area shape="rect" coords="0,0,300,160" href="#" id="r1" />
  <area shape="rect" coords="0,161,300,350" href="#" id="r2"/>
</map>

希望对你有帮助..

【讨论】:

  • 修复你的小提琴会很棒!
  • 我个人喜欢 CSS-Only 解决方案。在我的情况下,我还将宽度参数从 .area 类移动到 #area2 块中,并制作了具有不同宽度值的附加 #areaX 块(#area1、#area3、#area4 等),因此我可以拥有具有多个悬停区域的图像不同宽度的(例如,一排房间地图的图像,每个房间都有不同的宽度,但高度都相同。
【解决方案2】:

带有伪元素。

HTML:

<div class="image-map-container">
    <img src="https://upload.wikimedia.org/wikipedia/commons/8/83/FibonacciBlocks.png" alt="" usemap="#image-map" />
    <div class="map-selector"></div>
</div>

<map name="image-map" id="image-map">
    <area alt="" title="" href="#" shape="rect" coords="54,36,66,49" />
    <area alt="" title="" href="#" shape="rect" coords="72,38,83,48" />
    <area alt="" title="" href="#" shape="rect" coords="56,4,80,28" />
    <area alt="" title="" href="#" shape="rect" coords="7,7,45,46" />
    <area alt="" title="" href="#" shape="rect" coords="10,59,76,125" />
    <area alt="" title="" href="#" shape="rect" coords="93,9,199,122" />
</map>

一些 CSS:

.image-map-container {
    position: relative;
    display:inline-block;
}
.image-map-container img {
    display:block;
}
.image-map-container .map-selector {
    left:0;top:0;right:0;bottom:0;
    color:#546E7A00;
    transition-duration: .3s;
    transition-timing-function: ease-out;
    transition-property: top, left, right, bottom, color;
}
.image-map-container .map-selector.hover {
    color:#546E7A80;
}

.map-selector:after {
    content: '';
    position: absolute;
    top: inherit;right: inherit;bottom: inherit;left: inherit;
    background: currentColor;
    transition-duration: .3s;
    transition-timing-function: ease-out;
    transition-property: top, left, right, bottom, background;
    pointer-events: none;
}

JS:

$('#image-map area').hover(
    function () { 
        var coords = $(this).attr('coords').split(','),
            width = $('.image-map-container').width(),
            height = $('.image-map-container').height();
        $('.image-map-container .map-selector').addClass('hover').css({
            'left': coords[0]+'px',
            'top': coords[1] + 'px',
            'right': width - coords[2],
            'bottom': height - coords[3]
        })
    },
    function () { 
        $('.image-map-container .map-selector').removeClass('hover').attr('style','');
    }
)

https://jsfiddle.net/79ebt32x/1/

【讨论】:

    【解决方案3】:

    我认为仅使用 CSS(至少不能跨浏览器)这是不可能的,但 jQuery 插件 ImageMapster 会满足您的需求。您可以在图像地图上为悬停/活动状态勾勒、着色或使用替代图像。

    http://www.outsharked.com/imagemapster/examples/usa.html

    【讨论】:

    • 有可能,请参阅下面的 Jason 回答
    • 这很狡猾。
    【解决方案4】:

    这是一个使用 + 下一个兄弟选择器、:hoverpointer-events 的纯 CSS。从技术上讲,它不使用图像映射,但 rect 的概念完全继承了:

    .hotspot {
        position: absolute;
        border: 1px solid blue;
    }
    .hotspot + * {
        pointer-events: none;
        opacity: 0;
    }
    .hotspot:hover + * {
        opacity: 1.0;
    }
    .wash {
        position: absolute;
        top: 0;
        left: 0;
        bottom: 0;
        right: 0;
        background-color: rgba(255, 255, 255, 0.6);
    }
    <div style="position: relative; height: 188px; width: 300px;">
        <img src="http://demo.cloudimg.io/s/width/300/sample.li/boat.jpg">
            
        <div class="hotspot" style="top: 50px; left: 50px; height: 30px; width: 30px;"></div>
        <div>
            <div class="wash"></div>
            <div style="position: absolute; top: 0; left: 0;">A</div>
        </div>
            
        <div class="hotspot" style="top: 100px; left: 120px; height: 30px; width: 30px;"></div>
        <div>
            <div class="wash"></div>
            <div style="position: absolute; top: 0; left: 0;">B</div>
        </div>
    </div>

    【讨论】:

    • 谢谢!我没想过为此使用兄弟连接器。这是个好主意!
    【解决方案5】:

    您可以通过更改 html 来做到这一点。这是一个例子:

    <hmtl>
      <head>
        <title>Some title</title>
      </head>
      <body> 
      <map name="navigatemap">
        <area shape="rect"  
              coords="166,4,319,41" 
              href="WII.htm"  
              onMouseOut="navbar.src='Assets/NavigationBar(OnHome).png'" 
              onMouseOver="navbar.src='Assets/NavigationBar(OnHome,MouseOverWII).png'" 
        />
        <area shape="rect"
              coords="330,4,483,41" 
              href="OT.htm"  
              onMouseOut="navbar.src='Assets/NavigationBar(OnHome).png'" 
              onMouseOver="navbar.src='Assets/NavigationBar(OnHome,MouseOverOT).png'" 
        />
    
        <area shape="rect" 
              coords="491,3,645,41" 
              href="OP.htm"  
              onMouseOut="navbar.src='Assets/NavigationBar(OnHome).png'" 
              onMouseOver="navbar.src='Assets/NavigationBar(OnHome,MouseOverOP).png'" 
       />
      </map> 
    
      <img src="Assets/NavigationBar(OnHome).png" 
         name="navbar" 
         usemap="#navigatemap" />
      </body>
    </html>
    

    【讨论】:

      【解决方案6】:

      很抱歉在游戏后期才回答这个问题,但我有一个关于不规则(非矩形)形状的答案。我使用 SVG 解决了它,以生成我想要附加事件的位置的掩码。

      这个想法是将事件附加到内联的 SVG,超级便宜,甚至用户友好,因为有很多程序可以生成 SVG。 SVG 可以有一层图像作为背景。

      http://jcrogel.com/code/2015/03/18/mapping-images-using-javascript-events/

      【讨论】:

      • 链接返回 403 Forbidden 错误。
      【解决方案7】:

      你可以使用画布

      在 HTML 中,只需添加一个画布

      <canvas id="locations" width="400" height="300" style="border:1px solid #d3d3d3;">
      Your browser can't read canvas</canvas>
      

      在Javascript中(只是一个例子,会在图片上画一个矩形)

      var c = document.getElementById("locations");
      var ctx = c.getContext("2d");
      var img = new Image(); 
      img.src = '{main_photo}';
      img.onload = function() {    // after the pic is loaded
          ctx.drawImage(this,0,0); // add the picture
          ctx.beginPath();         // start the rectangle
          ctx.moveTo(50,50);
          ctx.lineTo(200,50);
          ctx.lineTo(200,200);
          ctx.lineTo(50,200);
          ctx.lineTo(50,50);
      
          ctx.strokeStyle = "sienna"; // set color
          ctx.stroke();               // apply color
          ctx.lineWidth = 5;
          // ctx.closePath();
      };
      

      【讨论】:

        猜你喜欢
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 2013-08-08
        • 1970-01-01
        • 2011-12-02
        • 1970-01-01
        相关资源
        最近更新 更多