用徽标图像替换 H1 文本:SEO 和可访问性的最佳方法?

Replacing H1 text with a logo image: best method for SEO and accessibility?

提问人:Andrew 提问时间:3/20/2009 最后编辑:animusonAndrew 更新时间:10/15/2022 访问量:266467

问:

似乎有几种不同的技术,所以我希望得到一个“明确”的答案......

在网站上,通常的做法是创建链接到主页的徽标。我想做同样的事情,同时最好地针对搜索引擎、屏幕阅读器、IE 6+ 和禁用 CSS 和/或图像的浏览器进行优化。

示例一:不使用 h1 标签。对SEO来说不那么好,对吧?

<div id="logo">
    <a href="">
        <img src="logo.png" alt="Stack Overflow" />
    </a>
</div>

示例二:在某处找到了这个。CSS似乎有点笨拙。

<h1 id="logo">
    <a href="">Stack Overflow</a>
</h1>
/* css */
#logo {
    padding: 70px 0 0 0;
    overflow: hidden;
    background-image: url("logo.png");
    background-repeat: no-repeat;
    height: 0px !important;
    height /**/:70px;
}

示例三:相同的 HTML,使用文本缩进的不同方法。这是图像替换的“Phark”方法。

<h1 id="logo">
    <a href="">Stack Overflow</a>
</h1>
/* css */
#logo {
    background: transparent url("logo.png") no-repeat scroll 0% 0%;
    width: 250px;
    height: 70px;
    text-indent: -3333px;
    border: 0;
    margin: 0;
}

#logo a {
    display: block;
    width: 280px; /* larger than actual image? */
    height: 120px;
    text-decoration: none;
    border: 0;
}

示例四:Leahy-Langridge-Jefferies 方法。当图像和/或 css 关闭时显示。

<h1 id="logo" class="logo">
    <a href="">Stack Overflow</a>
</h1>
/* css */
h1.logo {
    margin-top: 15px; /* for this particular site, set this as you like */
    position: relative; /* allows child element to be placed positioned wrt this one */
    overflow:hidden; /* don’t let content leak beyond the header - not needed as height of anchor will cover whole header */
    padding: 0; /* needed to counter the reset/default styles */
}

h1.logo a {
    position: absolute; /* defaults to top:0, left:0 and so these can be left out */
    height: 0; /* hiding text, prevent it peaking out */
    width: 100%; /* 686px; fill the parent element */
    background-position: left top;
    background-repeat: no-repeat;
}

h1#logo {
    height: 60px; /* height of replacement image */
}

h1#logo a {
    padding-top: 60px; /* height of the replacement image */
    background-image: url("logo.png"); /* the replacement image */
}

对于这种事情,什么方法最好?请在您的答案中提供 html 和 css。

CSS XHTML 图像 搜索引擎优化

评论

0赞 meo 6/7/2010
您应该查看此主题以:stackoverflow.com/questions/1874895/...
15赞 troynt 10/31/2010
马特·卡茨(Matt Cutts)回答了这个问题。youtu.be/fBLvn_WkDJ4
2赞 bobo 3/4/2012
属性不是应该在 ?title<a>
30赞 MikeMurko 9/17/2012
这个问题不应该被标记为偏离主题。这是一个关于CSS和搜索引擎优化的非常明确的问题。仅仅因为它不是 C# 并不意味着它不是代码。
3赞 TheBlackBenzKid 3/13/2013
@troynt我发现马特·卡茨有时会给出误导性的建议。因此,我倾向于不看他。

答:

17赞 Rob Knight 3/20/2009 #1

我主要像上面一样这样做,但出于可访问性的原因,我需要支持在浏览器中禁用图像的可能性。因此,我没有将链接中的文本缩进页面,而是通过绝对定位到整个宽度和高度来覆盖它,并用于按堆叠顺序将其放置在链接文本上方。<span><a>z-index

价格是空的,但我愿意把它放在那里,以获得像.<span><h1>

<h1 id="logo">
  <a href="">Stack Overflow<span></span></a>
</h1>
#logo a {
   position:relative;
   display:block;
   width:[image width];
   height:[image height]; }

#logo a span {
   display:block;
   position:absolute;
   width:100%;
   height:100%;
   background:#ffffff url(image.png) no-repeat left top;
   z-index:100; /* Places <span> on top of <a> text */  }

评论

1赞 ckarbass 3/25/2009
缩进有什么问题?我的假设是,尽管有缩进,屏幕阅读器和爬虫仍然会拾取文本。
2赞 Rob Knight 4/12/2009
对不起,我花了这么长时间才回到这里。缩进的唯一问题是,如果在用户的浏览器中禁用了图像,但 CSS 处于打开状态,则不会显示任何内容、文本或图像。这是一种边缘情况,但对我来说很重要,在大学网站上工作。
0赞 Andrew 6/18/2009
嗯。。。我无法让它工作。锚文本不断出现在图像顶部。
0赞 Chris Missal 3/4/2010
<nitpicker> 改用 #logo span,浏览器渲染 </nitpicker 会更有效率>
1赞 Marcus 11/16/2010
在某些情况下,您需要 {top:0} 来 #logo 跨度。
11赞 se_pavel 3/22/2009 #2

如果可访问性原因很重要,则使用第一个变体(当客户希望看到没有样式的图像时)

<div id="logo">
    <a href="">
        <img src="logo.png" alt="Stack Overflow" />
    </a>
</div>

无需符合想象中的SEO要求,因为上面的HTML代码具有正确的结构,只有您应该决定这是否适合您的访问者。

此外,您可以使用具有较少 HTML 代码的变体

<h1 id="logo">
  <a href=""><span>Stack Overflow</span></a>
</h1>
/* position code, it may be absolute position or normal - depends on other parts of your site */
#logo {
  ...
}

#logo a {
   display:block;
   width: actual_image_width;
   height: actual_image_height;
   background: url(image.png) no-repeat left top;
}

/* for accessibility reasons - without styles variant*/
#logo a span {display: none}

请注意,我已经删除了所有其他 CSS 样式和技巧,因为它们与任务不对应。它们可能仅在特定情况下有用。

评论

6赞 KPM 10/27/2014
display:none无法访问。
0赞 Oriol 11/18/2015
最好的方法是将徽标包装在 div 下,因为它具有可访问性、可用性和 SEO 优化,并且主要用于大型网络组织。Twitter、Amazon、Mozilla 不使用 <h1> 作为其徽标,而是使用主要标题来更好地捕捉页面价值。bit.ly/1MR4fr5
3赞 Ross 3/22/2009 #3

我想你会对 H1 辩论感兴趣。这是一个关于是否将 h1 元素用于页面标题或徽标的争论。

就我个人而言,我会接受你的第一个建议,大致如下:

<div id="header">
    <a href="http://example.com/"><img src="images/logo.png" id="site-logo" alt="MyCorp" /></a>
</div>

<!-- or alternatively (with css in a stylesheet ofc-->
<div id="header">
    <div id="logo" style="background: url('logo.png'); display: block; 
        float: left; width: 100px; height: 50px;">
        <a href="#" style="display: block; height: 50px; width: 100px;">
            <span style="visibility: hidden;">Homepage</span>
        </a>
    </div>
    <!-- with css in a stylesheet: -->
    <div id="logo"><a href="#"><span>Homepage</span></a></div>
</div>


<div id="body">
    <h1>About Us</h1>
    <p>MyCorp has been dealing in narcotics for over nine-thousand years...</p>
</div>

当然,这取决于你的设计是否使用页面标题,但这是我在这个问题上的立场。

评论

0赞 Joe Phillips 3/22/2009
我很确定 IMG 被视为内容,而 css 背景图像则不是。这就是为什么我倾向于使用背景图像来获取站点范围的图像以及未明确用于该页面内容的此类性质的内容。
0赞 Ross 3/22/2009
@d03boy:在这种情况下,您可以制作一个内联 div,该 div 具有正确的徽标大小,并为其提供背景。它内部的跨度(具有可见性:隐藏;)将提供“替代文本”替换。
6赞 alex 7/8/2010
H1 辩论现在是一个死环节
252赞 Rahul 3/22/2009 #4

您缺少以下选项:

<h1>
  <a href="http://stackoverflow.com">
    <img src="logo.png" alt="Stack Overflow" />
  </a>
</h1>

href 和 img 到 h1 的标题非常非常重要!

评论

21赞 Andrew 6/18/2009
用替代文本将 H1 包裹在图像周围是否与用 H1 包裹的纯文本具有相同的权重(SEO 方面)?
12赞 Boris Guéry 3/31/2010
顺便说一句,它是相关的,徽标是您网站内容的一部分,它不用于装饰,因此请使用带有 alt 属性的 <img> 而不是 CSS 作为您的徽标。
1赞 its_me 2/4/2013
@Dracorat 不对。(例如,YouTube和互联网上大多数最大的网站)
38赞 ahsteele 3/5/2013
不幸的是,@troynt留下的评论中的链接现在已损坏。这是指向内容的新永久链接:youtu.be/fBLvn_WkDJ4
15赞 bjunix 11/21/2016
对于所有想知道链接视频中有什么的人:Matt Cutts 基本上说,您应该使用 img 标签的 alt 属性,而不是使用 css 隐藏文本。
-1赞 Daniel Boundy 2/2/2010 #5
<div class="logo">
    <h1><a href="index.html"><span>Insert Website Name</span></a></h1>
    <p>Insert Slogan Here</p>
</div>
#header .logo h1 {
    background: red; /* replace with image of logo */
    display:block;
    height:40px; /* image height */
    width:220px; /* image width */
}

#header .logo h1 a {
    display:block;
    height:40px; /* image height */
    width:220px; /* image width */
}

#header .logo h1 a span {
    display:none;
}
2赞 4 revs, 4 users 60%30ml #6

您错过了元素中的标题。<a>

<h1 id="logo">
  <a href="#" title="..."><span>Stack Overflow</span></a>
</h1>

我建议将标题放在元素中,因为客户想知道该图像的含义是什么。因为您已经设置了测试,所以前端用户可以将鼠标悬停在徽标上时获取主徽标的信息。<a>text-indent<h1>

0赞 Taswiz 2/26/2011 #7

我不知道,但这是使用的格式......

<h1>
    <span id="site-logo" title="xxx" href="#" target="_self">
        <img src="http://www.xxx.com/images/xxx.png" alt="xxx" width="xxx" height="xxx" />
        <a style="display:none">
            <strong>xxx</strong>
        </a>
    </span>
</h1>

很简单,据我所知,它并没有对我的网站造成任何伤害。你可以css它,但我没有看到它的加载速度更快。

-1赞 Rodrigo Reis 3/7/2013 #8
<h1><a href="/" title="Some title">Name</a></h1>
h1 a{
  width: {logo width};
  height: {logo height};
  display:block;
  text-indent:-9999px;
  background:url({ logo url});
}

评论

0赞 Nick F 5/8/2013
最好不要使用这样的大量文本缩进,因为它可能会导致性能受到很大的影响。详细说明在这里
1赞 DFA 4/9/2013 #9

没有人触及的一点是,h1 属性应该特定于每个页面,并且使用网站徽标将有效地在网站的每个页面上复制 H1。

我喜欢为每个页面使用隐藏的 z 索引 h1,因为最好的 SEO h1 通常不是销售或美学价值的最佳选择。

评论

0赞 Mariusz Jamro 1/29/2016
您始终只能在主页上使用 H1 作为徽标。
0赞 c_sea 11/30/2014 #10

一种新的 (Keller) 方法应该比 -9999px 方法提高速度:

.hide-text {
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
}

这里推荐:http://www.zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement/

5赞 Mattypants 9/25/2016 #11

这里有点晚了,但无法抗拒。

你的问题有一半缺陷。让我解释一下:

你问题的前半部分,关于图像替换,是一个有效的问题,我的观点是,对于一个标志,一个简单的图像;alt 属性;和CSS的定位就足够了。

你问题的后半部分,关于H1的标志的 “SEO值 ”,是决定将哪些元素用于不同类型的内容的错误方法。

徽标不是主要标题,甚至根本不是标题,使用 H1 元素标记您网站每个页面上的徽标对您的排名弊大于利。从语义上讲,标题 (H1 - H6) 适用于:内容的标题和副标题。

在 HTML5 中,每个页面允许使用多个标题,但徽标不配拥有其中之一。您的徽标可能是一个模糊的绿色小部件,并且出于某种原因,某些文本位于标题侧面的图像中 - 它是一种“邮票”,而不是用于构建内容的分层元素。您网站每个页面的第一个(是否使用更多取决于您的标题层次结构)H1 应作为其主题的标题。索引页的主要标题可能是“纽约市模糊绿色小部件的最佳来源”。另一个页面上的主要标题可能是“我们的模糊小部件的运输详细信息”。在另一页上,它可能是“关于 Bert's Fuzzy Widgets Inc.”。你明白了。

旁注:尽管听起来令人难以置信,但不要查看 Google 拥有的网络资产的来源以获取正确标记的示例。这本身就是一整篇文章。

为了从 HTML 及其元素中获得最大的“SEO 价值”,请查看 HTML5 规范,并在搜索引擎之前根据 (HTML) 语义和对用户的价值做出标记决策,您将在 SEO 方面取得更好的成功。

评论

1赞 elmarko 8/29/2018
除此之外,所有这些都是真的,除了主页之外,徽标不应该是任何其他页面上的 h1(理想情况下不在主页上)。然而,通常在主页上,与h1最相关的地方是徽标,因为主横幅内容可能与网站主题不够具体(即它可能与正在推送的当前服务或产品有关,而不是网站的核心主题)。如果网站只有一个重点区域(例如,应用的网站),则主区域可能适用于 h1。当它不起作用时,用 h1 包装 alt 的图像总比没有好。
0赞 Potky 10/23/2016 #12

出于SEO原因:

<div itemscope itemtype="https://schema.org/Organization">
 <p id="logo"><a href="/"><span itemprop="Brand">Your business</span> <span class="icon fa-stg"></span> - <span itemprop="makesOffer">sell staff</span></a></p>
 </div>
   <h1>Your awesome title</h1>
2赞 Vishal Gupta 2/10/2017 #13
<h1>
  <a href="http://stackoverflow.com">
  Stack Overflow<img src="logo.png" alt="Stack Overflow" />
  </a>
</h1>

这是 SEO 的不错选择,因为 SEO 赋予 H1 标签高优先级,h1 标签内应该是您的网站名称。使用此方法,如果您在 SEO 中搜索网站名称,它也会显示您的网站徽标。

您想隐藏站点名称或文本,请使用负值的文本缩进。前任

h1 a {
 text-indent: -99999px;
}
4赞 Sebastien Horin 5/2/2019 #14

W3C 是如何做到的?

只需看一下 https://www.w3.org/。 图像有一个,文本在这里,但后面,因为耦合到z-index:1z-index:0position: absolute;

原始 HTML:

<h1 class="logo">
    <a tabindex="2" accesskey="1" href="/">
        <img src="/2008/site/images/logo-w3c-mobile-lg" width="90" height="53" alt="W3C">
    </a>
    <span class="alt-logo">W3C</span>
</h1>

原始 CSS:

#w3c_mast h1 a {
    display: block;
    float: left;
    background: url(../images/logo-w3c-screen-lg) no-repeat top left;
    width: 100%;
    height: 107px;
    position: relative;
    z-index: 1;
}
.alt-logo {
    display: block;
    position: absolute;
    left: 20px;
    z-index: 0;
    background-color: #fff;
}

评论

3赞 Klemart3D 12/28/2021
将文本内容隐藏在图像后面并不是真正的“SEO 最佳方法”,在 W3C 代码示例中,屏幕阅读器会读取“W3C”两次(一次用于 alt 属性,一次用于 span 文本),因此它不能是“辅助功能的最佳方法”
1赞 Dani Amsalem 6/16/2020 #15

在阅读了上述解决方案后,我使用了 CSS Grid 解决方案。

  1. 创建一个包含 h1 文本和图像的 div。
  2. 将两个项目放在同一个单元格中,并使它们都相对定位。
  3. 使用旧的 zeldman.com 技术,通过 text-indent、white-space 和 overflow 属性隐藏文本。
<div class="title-stack">
    <h1 class="title-stack__title">StackOverflow</h1>
    <a href="#" class="title-stack__logo">
        <img src="/images/stack-overflow.png" alt="Stack Overflow">
    </a>
</div>
.title-stack {
    display: grid;
}
.title-stack__title, .title-stack__logo {
    grid-area: 1/1/1/1;
    position: relative;
}
.title-stack__title {
    z-index: 0;
    text-indent: 100%;
    white-space: nowrap;
    overflow: hidden;
}
1赞 Jonathan Sirrine 10/15/2022 #16

如果您不希望在将图像包装在 中时应用浏览器样式,则可以通过使用属性和<h1><h1>role="heading"aria-level="1"

例如,就画外音而言,这

<h1>
    <a href="/">
        Stack Overflow
    </a>
</h1>

<div role="heading" aria-level="1">
    <a href="/">
        <img src="https://via.placeholder.com/150" alt="Stack Overflow" />
    </a>
</div>