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


240

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

在网站上,通常的做法是创建一个链接到首页的徽标。我想做同样的事情,同时针对搜索引擎,屏幕阅读器,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,使用text-indent的不同方法。这是图像替换的“ 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。


:你应该看看这个话题stackoverflow.com/questions/1874895/...
MEO

15
马特·卡茨(Matt Cutts)回答了这个问题。youtu.be/fBLvn_WkDJ4
troynt 2010年

2
title属性不是应该在<a>吗?
bobo 2012年

23
该问题不应标记为题外。这是一个关于CSS和搜索引擎优化的明确定义的问题。仅仅因为它不是C#并不意味着它不是代码。
MikeMurko 2012年

3
@troynt我发现Matt Cutts有时会提供误导性的建议。因此,我倾向于不看他。
TheBlackBenzKid 2013年

Answers:


221

您缺少该选项:

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

H1的href和img中的标题非常非常重要!


12
用alt文本将h1环绕在图像上是否与用h1包裹的纯文本具有相同的权重(按搜索方向)?
安德鲁

11
顺便说一句,它是相关的,徽标是您网站内容的一部分,它不用于装饰,因此请对徽标使用alt属性而不是CSS的<img>。
鲍里斯·格里(BorisGuéry)2010年

14
马特·卡茨(Matt Cutts)回答了这个问题。youtube.com/user/GoogleWebmasterHelp#p/search/0/fBLvn_WkDJ4
troynt 2010年

34
不幸的是,@ troynt留下的注释中的链接现在已断开。这是内容的新固定链接:youtu.be/fBLvn_WkDJ4
ahsteele 2013年

10
对于所有想知道链接视频中内容的人:Matt Cutts基本上都说,您应该使用img标签的alt属性,而不是使用CSS隐藏文本。
bjunix

17

我这样做的方式与上面的类似,但是出于可访问性的原因,我需要支持在浏览器中禁用图像的可能性。因此,而不是从缩进在页面链接的文本,我完全被定位覆盖它<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

2
抱歉,我花了很长时间才回到这里。缩进的唯一问题是,如果在用户的浏览器中禁用了图像,但是CSS处于启用状态,则没有任何显示,文本或图像。这是一个边缘案例,但对于我来说,在大学网站上工作很重要。
罗布·奈特2009年

嗯...我无法使它正常工作。锚文本始终出现在图像顶部。
安德鲁

<nitpicker>使用#logo span代替,对于浏览器来说渲染</ nitpicker>效率更高
Chris Missal 2010年

1
在某些情况下,您需要使用{top:0}才能跨度#logo。
Marcus 2010年

11

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

<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样式和技巧,因为它们与任务不符。它们可能仅在特定情况下有用。


3
display:none不可访问。
KPM 2014年

最好的方法是将徽标包装在div下,这是因为其可访问性,可用性和SEO优化,并且主要用于大型Web组织。Twitter,Amazon,Mozilla的徽标不使用<h1>,而是使用主要标题来更好地捕获页面价值。bit.ly/1MR4fr5
Oriol

4

在这里迟一点鸣叫,但无法抗拒。

您的问题是有缺陷的。让我解释:

关于图像替换的问题的上半部分是一个有效的问题,我的意见是徽标是一个简单的图像;alt属性;和CSS的定位就足够了。

问题的下半部分,关于徽标的H1的“ SEO值”是一种错误的方法,它决定了将哪些元素用于不同类型的内容。

徽标不是一个主要标题,甚至根本不是一个标题,使用H1元素在您网站的每个页面上标记徽标将(对您的排名不利)(略)多于弊。在语义上,标题(H1-H6)恰好适合:内容的标题和子标题。

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

旁注:听起来令人难以置信,但请不要着眼于Google拥有的网络媒体资源的来源,以获取正确的标记示例。这是一个完整的帖子。

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


1
除此之外,所有这一切都是正确的,徽标不应该是除首页(最好是不在首页)以外的任何其他页面上的h1。但是,通常在首页上与h1最为相关的位置是徽标,因为英雄标语内容可能不足以具体说明网站的主题(即,它可能与当前正在推销的服务或产品有关,而不是与之相关联)网站的核心主题)。如果该站点只有一个重点区域(例如,一个应用程序的站点),则英雄区域可能适用于h1。当它不起作用时,将alt包裹在h1中的图像总比没有好。
elmarko

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>

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


我敢肯定,IMG被认为是内容,而CSS背景图像却没有。这就是为什么我倾向于使用背景图像来表示站点范围内的图像以及此类性质的内容,而这些内容并未明确针对该页面内容。
乔·菲利普斯

@ d03boy:在这种情况下,您可以制作一个内联div,该div具有徽标大小的正确大小并提供背景。其中的一个跨度(具有可见性:隐藏;)将提供“替代文字”替代。
罗斯,

6
H1辩论现已成为死胡同
亚历克斯

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

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

您想隐藏网站名称或文本,请使用负值的text-indent。前

h1 a {
 text-indent: -99999px;
}

2

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

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

我建议将title放在<a>element中,因为客户希望知道该图像的含义。因为您已经设置text-indent了这样的测试,<h1>所以该前端用户在将鼠标悬停在徽标上时可以获取主要徽标的信息。


2

W3C怎么做?

只需看看https://www.w3.org/即可。图片中有个z-index:1,文字在这里,但是后面是因为z-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;
}

1

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

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


您始终只能在主页上将H1用作徽标。
Mariusz Jamro '16


0

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

<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,但看不到它加载得更快。


0

由于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>

0

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

  1. 创建一个包含h1文本和图像的div。
  2. 将两个项目放置在同一单元格中,并使它们都相对放置。
  3. 使用旧的zeldman.com技术可使用文本缩进,空格和溢出属性来隐藏文本。
<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
<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});
}

最好不要使用像这样的大量文本缩进,因为它可能会严重影响性能。详细说明在这里
尼克F

-1
<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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.