【问题标题】:Make a div into a link将一个 div 变成一个链接
【发布时间】:2010-10-22 05:14:12
【问题描述】:

我有一个 <div> 块,其中包含一些我不想更改的精美视觉内容。我想让它成为一个可点击的链接。

我正在寻找类似 @​​987654323@ 的东西,但那是有效的 XHTML 1.1。

【问题讨论】:

  • 一个很好的理由是 div 中的背景图片
  • 我有一个很好的工作示例,基于投票最多的答案。检查小提琴here
  • 在 HTML5 中,diva 下是完全有效的。

标签: css html xhtml anchor


【解决方案1】:

将您的div 包含在锚标记<a href></a> 中就像魅力一样:

    <a href="">
      <div>anything goes here will turn into a link</div>
    </a>

【讨论】:

    【解决方案2】:

    尚未提及的一个选项是使用 flex。通过将flex: 1 应用于a 标记,它会扩展以适应容器。

    div {
      height: 100px;
      width: 100px;
      display: flex;
      border: 1px solid;
    }
    
    a {
      flex: 1;
    }
    <div>
      <a href="http://google.co.uk">Link</a>
    </div>

    【讨论】:

      【解决方案3】:

      最简洁的方法是将 jQuery 与 HTML 中引入的数据标签一起使用。使用此解决方案,您可以在所需的每个标签上创建链接。首先用数据链接标签定义标签(例如div):

      <div data-link="http://www.google.at/">Some content in the div which is arbitrary</div>
      

      现在您可以随意设置 div 的样式。而且您还必须为“链接”类似的行为创建样式:

      [data-link] {
        cursor: pointer;
      }
      

      最后把这个 jQuery 调用放到页面上:

      $(document).ready(function() {
        $("[data-link]").click(function() {
          window.location.href = $(this).attr("data-link");
          return false;
        });
      });
      

      使用此代码,jQuery 将点击监听器应用于页面上具有“data-link”属性的每个标签,并重定向到 data-link 属性中的 URL。

      【讨论】:

      【解决方案4】:

      虽然我不建议在任何情况下这样做,但这里有一些将 DIV 变成链接的代码(注意:此示例使用 jQuery 并且为简单起见删除了某些标记):

      <script type="text/javascript" src="jquery-1.3.2.min.js"></script>
      <script type="text/javascript">
      
      $(document).ready(function() {
          $("div[href]").click(function () {
              window.location = $(this).attr("href");
          });
      });
      
      </script>
      <div href="http://www.google.com">
           My Div Link
      </div>
      

      【讨论】:

      • 同样,这是一个功能性解决方案,但并不真正符合针对 XHTML 解决方案的原始问题的精神。虽然不是什么大问题,但您的回答确实开始给问题增加噪音。
      【解决方案5】:
      <a href="…" style="cursor: pointer;"><div> … </div></a>
      

      【讨论】:

        【解决方案6】:

        这对我有用:

        HTML:

        <div>
        
          WHATEVER YOU WANT
        
          <a href="YOUR LINK HERE">
            <span class="span-link"></span>
          </a>
        
        </div>
        

        CSS:

        .span-link {
          position:absolute;
          width:100%;
          height:100%;
          top:0;
          left: 0;
          z-index: 9999;
        }
        

        这会添加一个不可见元素(跨度),它覆盖整个 div,并且在 z-index 上高于整个 div,因此当有人点击该 div 时,点击本质上是被链接的不可见的“span”层拦截。

        注意:如果您已经对其他元素使用 z-index,只需确保此 z-index 的值高于您希望它“放在”其“顶部”的任何值。

        【讨论】:

        • 为我工作。只是不要忘记相对定位父元素。
        【解决方案7】:

        不确定这是否有效,但它对我有用。

        代码:

        <div style='position:relative;background-color:#000000;width:600px;height:30px;border:solid;'>
          <p style='display:inline;color:#ffffff;float:left;'> Whatever </p>     
          <a style='position:absolute;top:0px;left:0px;width:100%;height:100%;display:inline;' href ='#'></a>
        </div>

        【讨论】:

        • 我不得不说,这种方法与样式表上的 css 类一样干净。就我而言,这是正确且最简单的解决方案。
        • 这是最好的一个
        【解决方案8】:

        来到这里是希望找到比我更好的解决方案,但我不喜欢这里提供的任何解决方案。我想你们中的一些人误解了这个问题。 OP 希望使一个充满内容的 div 表现得像一个链接。这方面的一个例子是 facebook 广告 - 如果你看,它们实际上是正确的标记。

        对我来说,禁忌是:javascript(不应该仅仅用于链接,并且非常糟糕的 SEO/可访问性);无效的 HTML。

        本质上是这样的:

        • 使用普通的 CSS 技术和有效的 HTML 构建您的面板。
        • 如果用户单击面板,您希望在其中的某个链接成为默认链接(您也可以有其他链接)。
        • 在该链接中,放置一个空的 span 标签(&lt;span&gt;&lt;/span&gt;,而不是 &lt;span /&gt; - 感谢@Campey)
        • 给出面板位置:相对
        • 将以下 CSS 应用于空范围:

          { 
            position:absolute; 
            width:100%;
            height:100%;
            top:0;
            left: 0;
          
            z-index: 1;
          
            /* fixes overlap error in IE7/8, 
               make sure you have an empty gif */
            background-image: url('empty.gif');
          }   
          

          它现在将覆盖面板,并且由于它位于 &lt;A&gt; 标记内,因此它是一个可点击的链接

        • 在面板位置提供任何其他链接:相对和合适的 z-index (>1) 以将它们带到默认跨度链接的前面

        【讨论】:

        • 谢谢,效果很好。如果在 IE8 中出现了可怕的问题(就像他们对我所做的那样),请确保您有一个开始和结束跨度标记 (),而不是一个空跨度 ( )。
        • 对于像我这样愚蠢并误读某些东西的人来说,这是一个小提琴:jsfiddle.net/hf75B/1
        • 你在IE9中试过这个吗?我喜欢这种方法,并且正在使用它,但我只是在 IE9 中测试了它(包括来自@AlexMA 的小提琴),我看到的是您可以单击文本中除文本外的任何 div 中的任何位置。当您将鼠标悬停在文本上时,光标将变为标准文本光标,当您单击文本时它什么也不做。由于用户倾向于点击文本元素(并且当文本元素填满大部分 div 时),这使得该解决方案在 IE9 中无法使用。有其他人经历过这种情况或有解决方案吗?
        • 我被困了一段时间,发现我的包装 div 必须有{ position: relative }
        • 有人知道如何让 :hover css 与这个解决方案一起工作吗?也许指的是放在小提琴中的答案?
        【解决方案9】:

        这是 BBC 网站和《卫报》使用的最佳方式:

        我在这里找到了技术: http://codepen.io/IschaGast/pen/Qjxpxo

        这里是html

        <div class="highlight block-link">
              <h2>I am an example header</h2>
              <p><a href="pageone" class="block-link__overlay-link">This entire box</a> links somewhere, thanks to faux block links. I am some example text with a <a href="pagetwo">custom link</a> that sits within the block</p>
        
        </div>
        

        这是 CSS

        /**
         * Block Link
         *
         * A Faux block-level link. Used for when you need a block-level link with
         * clickable areas within it as directly nesting a tags breaks things.
         */
        
        
        .block-link {
            position: relative;
        }
        
        .block-link a {
          position: relative;
          z-index: 1;
        }
        
        .block-link .block-link__overlay-link {
            position: static;
            &:before {
              bottom: 0;
              content: "";
              left: 0;
              overflow: hidden;
              position: absolute;
              right: 0;
              top: 0;
              white-space: nowrap;
              z-index: 0;
            }
            &:hover,
            &:focus {
              &:before {
                background: rgba(255,255,0, .2);
              }
            }
        }
        

        【讨论】:

          【解决方案10】:

          此选项不需要 empty.gif,因为在最受好评的答案中:

          HTML:

           <div class="feature">
                 <a href="http://www.example.com"></a>
           </div>
          

          CSS:

           div.feature {
                  position: relative;
              }
          
              div.feature a {
                  position: absolute;
                  width: 100%;
                  height: 100%;
                  top: 0;
                  left: 0;
                  text-decoration: none; /* No underlines on the link */
                  z-index: 10; /* Places the link above everything else in the div */
                  background-color: #FFF; /* Fix to make div clickable in IE */
                  opacity: 0; /* Fix to make div clickable in IE */
                  filter: alpha(opacity=1); /* Fix to make div clickable in IE */
              }
          

          正如http://www.digitalskydesign.com/how-to-make-an-entire-div-a-link-using-css/所建议的那样

          【讨论】:

          • 谢谢! Chris Jumonville 的解决方案在 Andriod 和 iPhone 上运行良好。示例:gastateparks.org/specials
          • 不应该是div.feature &gt; a,以防“其他所有”部分也包含隐藏在深处的链接吗?
          • 这应该是选择的答案,也适用于引导程序
          • 这很好用,非常流畅,也可以很好地与屏幕阅读器一起使用,符合 HTML5,即使您在父对象上进行转换也可以工作,并且本质上使光标成为指针(正如您所期望的可点击对象)
          【解决方案11】:

          这是一个古老的问题,但我想我会回答它,因为这里的每个人都有一些疯狂的解决方案。其实非常非常简单...

          一个锚标签是这样工作的 -

          <a href="whatever you want"> EVERYTHING IN HERE TURNS INTO A LINK </a>
          

          太好了……

          <a href="whatever you want"> <div id="thediv" /> </a>
          

          虽然我不确定这是否有效。如果这就是口头解决方案背后的原因,那么我道歉......

          【讨论】:

          • 只要&lt;div&gt;不包含任何交互式内容(其他&lt;a&gt;元素、&lt;button&gt;元素等),它就是有效的HTML。
          • 您的示例不是有效的 HTML - 内联元素中包含的块元素 - 除非您使用的是 HTML5,它对链接做了例外处理。
          • 这是一个 bad 示例,因为 a 标记所做的是获取 div 中的所有文本并在其下划线......这可以通过样式,但最佳答案更好。
          • a #thediv{font-weight:normal;text-decoration:none;} 是你所需要的风格。
          • 试过这个并且它有效,但是它破坏了元素的定位。是的,文档类型是 Chrome 中的 HTML5(一些 2014 版本)..
          【解决方案12】:

          为什么不呢? use &lt;a href="bla"&gt; &lt;div&gt;&lt;/div&gt; &lt;/a&gt; 在 HTML5 中工作正常

          【讨论】:

          • 它不会通过 HTML 验证。订单项无法存储块项目。
          • 我的意思是,&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt; 有效,&lt;span&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt; 无效。您不应该将 display: inline; 类型的项目放入 display: block; 项目中。 &lt;a&gt; 标签是内联框。
          • 是的,它可以工作,因为您可以通过多种方式(更好或更坏)来做到这一点。这个特殊的解决方案不好,因为旧的 HTML 验证:)。
          • “旧的 HTML 验证”没有通过这个有关系吗?现在允许使用 html5,为什么不使用它呢?我认为这个解决方案很好(它通常需要删除 div 内容的下划线,但仍然如此)。
          • @Todilo 因为&lt;a&gt;&lt;div&gt;&lt;/div&gt;&lt;/a&gt; 有效且有效,&lt;a&gt;&lt;div&gt;&lt;a&gt;&lt;/a&gt;&lt;/div&gt;&lt;/a&gt; 无效且无效。
          【解决方案13】:

          实际上你现在需要包含 JavaScript 代码, 检查this tutorial 这样做。

          但是有一个棘手的方法可以使用 CSS 代码来实现这一点 你必须在你的 div 标签内嵌套一个锚标签,并且你必须将这个属性应用到它,

          display:block;
          

          当你这样做时,它将使整个宽度区域可点击(但在锚标签的高度内),如果你想覆盖整个 div 区域,你必须将锚标签的高度精确设置为div标签的高度,例如:

          height:60px;
          

          这将使整个区域都可以点击,然后您可以将text-indent:-9999px应用于锚标签以实现目标。

          这真的很棘手而且很简单,它只是使用 CSS 代码创建的。

          这是一个examplehttp://jsfiddle.net/hbirjand/RG8wW/

          【讨论】:

            【解决方案14】:

            我知道这篇文章很旧,但我只需要解决同样的问题,因为简单地编写一个普通的链接标签并将显示设置为阻止不会使整个 div 在 IE 中可点击。所以解决这个问题比使用 JQuery 要简单得多。

            首先让我们了解为什么会发生这种情况:IE 不会让空的 div 可点击它只会使该 div/a 标签内的文本/图像可点击。

            解决方案:用背景图像填充 div 并将其隐藏在查看器中。

            怎么样? 你问了很好的问题,现在听好了。 将此背景样式添加到 a 标签

            > "background:url('some_small_image_path')
            > -2000px -2000px no-repeat;"
            

            你有了它,整个 div 现在可以点击了。这对我来说是最好的方法,因为我将它用于我的照片库,让用户单击图像的一半以向左/向右移动,然后放置一个小图像以达到视觉效果。所以对我来说,我还是用左右图像作为背景图像!

            【讨论】:

            • 谢谢!我需要在图像上模拟一个带有空锚点的图像映射,而 IE 只会让你点击如果有内容。这解决了它。
            【解决方案15】:

            您不能让div 本身成为链接,但可以让&lt;a&gt; 标记充当block,与&lt;div&gt; 具有相同的行为。

            a {
                display: block;
            }
            

            然后你可以设置它的宽度和高度。

            【讨论】:

            • 但是,这不会将“div”变成链接。它使链接成为块元素。有点不一样。
            • 这是您的问题的解决方案。因为你可以修改div可以像超链接一样点击,但是不能设置cursor(=hand)在所有浏览器中显示(只有IE支持!)。
            • jjnguy:怎么样?我不喜欢在链接中包含大量内容,但这也可以是导航菜单或类似内容的一部分。锚元素 () 不一定是纯文本,不是吗?将它变成一个块在哪方面是错误?它在语义上是正确的,可以用来显示你想要的。
            • 这是一个模糊问题的完美解决方案。实际上,您可以简单地将锚元素包裹在 div 周围,但这在语义上是不正确的。 (内联元素中的块元素)。
            • jjnguy:这是很常见的做法。我不是说用链接替换 ​​div,但从问题的声音来看,他只是想要一个块,他可以像按钮或其他东西一样点击。
            【解决方案16】:

            这是最简单的方法。

            说,这是我想要点击的div 块:

            <div class="inner_headL"></div>
            

            所以放一个href如下:

            <a href="#">
             <div class="inner_headL"></div>
            </a>
            

            只需将div 块视为普通的html 元素并启用通常的href 标记。
            它至少适用于 FF。

            【讨论】:

              【解决方案17】:

              这个例子对我有用:

              <div style="position: relative; width:191px; height:83px;">
                  <a href="link.php" style="display:block; width:100%; height:100%;"></a>
              </div>
              

              【讨论】:

                【解决方案18】:

                你可以用href标签包围元素,或者你可以使用jquery并使用

                $('').click(function(e){
                e.preventDefault();
                //DO SOMETHING
                });
                

                【讨论】:

                  【解决方案19】:

                  您可以通过以下方法提供指向您的 div 的链接:

                  <div class="boxdiv" onClick="window.location.href='https://www.google.co.in/'">google</div>
                  <style type="text/css">
                  .boxdiv {
                      cursor:pointer;
                      width:200px;
                      height:200px;
                      background-color:#FF0000;
                      color:#fff;
                      text-align:center;
                      font:13px/17px Arial, Helvetica, sans-serif;
                      }
                  </style>
                  

                  【讨论】:

                    【解决方案20】:

                    要使同行的答案在 IE 7 及更高版本中工作,需要进行一些调整。

                    1. 如果元素没有背景色,IE 将不支持 z-index,因此链接不会与包含内容的包含 div 的部分重叠,只会与空白部分重叠。为了解决这个问题,添加了不透明度为 0 的背景。

                    2. 由于某种原因,在链接方法中使用 span 时,IE7 和各种兼容模式完全失败。但是,如果链接本身被赋予样式,它就可以正常工作。

                    .blockLink  
                    {  
                        position:absolute;  
                        top:0;  
                        left: 0;  
                        width:100%;  
                        height:100%;  
                        z-index: 1;  
                        background-color:#ffffff;   
                        -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";  
                        filter: alpha(opacity=0);  
                        opacity:0;  
                    }
                    
                    <div style="position:relative">  
                        <some content>  
                        <a href="somepage" class="blockLink" />  
                    <div>
                    

                    【讨论】:

                      【解决方案21】:

                      您也可以尝试包装一个锚点,然后将其高度和宽度设置为与其父级相同。这对我来说非常有效。

                      <div id="css_ID">
                          <a href="http://www.your_link.com" style="display:block; height:100%; width:100%;"></a>
                      </div>
                      

                      【讨论】:

                      【解决方案22】:

                      我的聪明裤回答:

                      “对“如何使块级元素成为超链接并在 XHTML 1.1 中进行验证”的回避回答

                      只需使用 HTML5 DOCTYPE DTD。”

                      实际上并不适用于 ie7

                      onclick="location.href='page.html';"

                      适用于 IE7-9、Chrome、Safari、Firefox,

                      【讨论】:

                      • 他在寻找“我正在寻找一种 XHTML 1.1 有效的方式”
                      【解决方案23】:

                      我引入了一个变量,因为我的链接中的某些值会根据用户来自的记录而改变。 这适用于测试:

                         <div onclick="location.href='page.html';"  style="cursor:pointer;">...</div> 
                      

                      这也有效:

                         <div onclick="location.href='<%=Webpage%>';"  style="cursor:pointer;">...</div> 
                      

                      【讨论】:

                      • 代码由于某种原因没有显示我使用带有 jsp 变量的 onclick 来创建动态链接
                      【解决方案24】:

                      这对我有用:

                      <div onclick="location.href='page.html';"  style="cursor:pointer;">...</div>
                      

                      【讨论】:

                        【解决方案25】:

                        只需将链接放在块中并使用 jquery 增强它。对于没有 javascript 的任何人,它都会优雅地降级 100%。使用 html 执行此操作并不是最好的解决方案恕我直言。 例如:

                        <div id="div_link">
                        <h2><a href="mylink.htm">The Link and Headline</a></h2>
                        <p>Some more stuff and maybe another <a href="mylink.htm">link</a>.</p>
                        </div>
                        

                        然后使用 jquery 使块可点击(通过web designer wall):

                        $(document).ready(function(){
                        
                            $("#div_link").click(function(){
                              window.location=$(this).find("a").attr("href"); return false;
                            });
                        
                        });
                        

                        那么你所要做的就是将光标样式添加到 div 中

                            #div_link:hover {cursor: pointer;}
                        

                        只有在通过向 div、body 或其他任何内容添加“js_enabled”类来启用 javascript 时才应用这些样式。

                        【讨论】:

                        • 我想使用它,但我在 div 中有 2 个链接...我怎样才能修改它以便能够点击这两个链接? (如果我也点击第二个链接,它目前会将我带到“mylink.html”..)
                        【解决方案26】:

                        如果一切都可以这么简单......

                        #logo {background:url(../global_images/csg-4b15a4b83d966.png) no-repeat top left;background-position:0 -825px;float:left;height:48px;position:relative;width:112px}
                        
                        #logo a {padding-top:48px; display:block;}
                        
                        
                        
                        <div id="logo"><a href="../../index.html"></a></div>
                        

                        跳出框框思考一下 ;-)

                        【讨论】:

                          【解决方案27】:

                          这是实现您想要的“有效”解决方案。

                          <style type="text/css">
                          .myspan {
                              display: block;
                          }
                          </style>
                          <a href="#"><span class="myspan">text</span></a>
                          

                          但最有可能您真正想要的是将&lt;a&gt; 标记显示为块级元素。

                          我不建议使用 JavaScript 来模拟超链接,因为这违背了标记验证的目的,最终是为了提高可访问性(按照适当的语义规则发布格式良好的文档可以最大限度地减少同一文档被不同的人解释的可能性)浏览器)。

                          最好发布一个不验证但在所有浏览器上都能正常呈现和运行的网页,包括禁用 JavaScript 的网页。此外,使用onclick 不会为屏幕阅读器提供语义信息来确定 div 是否用作链接。

                          【讨论】:

                            【解决方案28】:

                            需要一点 JavaScript。 但是,您的 div 将是可点击的。

                            <div onclick="location.href='http://www.example.com';" style="cursor:pointer;"></div>
                            

                            【讨论】:

                            • 虽然会导致页面语义不好,所以即使技术上可行,我也会避免这种情况。
                            • 我想过使用这个解决方案,但它有点难看。我喜欢涉及 display: block better 的解决方案。
                            • 这看起来像一个链接,但不是真正的链接。它存在严重的可用性和可访问性问题,是一个非常糟糕的解决方案。
                            • 最佳解决方案。我们只需要运行脚本并将“this”发送给它。
                            • 如果他们没有启用 js,你就失去了功能。以及对 SEO 不利。
                            猜你喜欢
                            • 2023-02-16
                            • 1970-01-01
                            • 2016-04-27
                            • 2015-08-18
                            • 1970-01-01
                            • 2015-06-30
                            • 2015-09-13
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多