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

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

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

一个例子:不使用h1标签。对搜索引擎优化不太好,对吧?

<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;
}

示例4: 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。

259029 次浏览

我所做的主要类似于上面的方法,但是出于可访问性的原因,我需要支持在浏览器中禁用图像的可能性。因此,我没有将链接中的文本缩进到页面外,而是将<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 */  }

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

<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样式和黑客,因为他们不对应的任务。它们可能只在特定情况下有用。

我想你会对H1辩论感兴趣。这是关于是将h1元素用于页面标题还是用于logo的争论。

就我个人而言,我同意你的第一个建议,大致如下:

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

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

你错过了以下选项:

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

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

<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;
}

您在<a>元素中错过了title。

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

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

我不知道,但这是我们用过的格式。

<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它,但我不认为它加载更快。

<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});
}

没有人提到的一点是,h1属性应该特定于每个页面,使用网站标志将有效地在网站的每个页面上复制h1。

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

一个新的(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/

说得有点晚了,但还是忍不住了。

你的问题有一半是错误的。让我解释一下:

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

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

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

在HTML5中,每页允许有多个标题,但logo不应该有一个标题。你的标志,可能是一个模糊的绿色小部件,一些文本在标题旁边的图像中,这是一种“印章”,而不是结构你的内容的层次元素。网站每个页面的第一个H1(是否使用更多取决于你的标题层次结构)应该是主题的标题。你的索引页的主要标题可能是“纽约市模糊绿色小部件的最佳来源”。另一页的主要标题可能是“我们的模糊部件的运输细节”。在另一页上,可能是“关于伯特的模糊小部件公司”。你懂的。

旁注:尽管听起来不可思议,但不要从谷歌拥有的网页属性中寻找正确标记的例子。这是一个完整的帖子。

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

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>
<h1>
<a href="http://stackoverflow.com">
Stack Overflow<img src="logo.png" alt="Stack Overflow" />
</a>
</h1>

这是SEO的好选择,因为SEO给H1标签高优先级,在H1标签里面应该是你的网站名称。使用这种方法,如果你在搜索引擎优化中搜索网站名称,它也会显示你的网站标志。

如果你想隐藏网站名称或文本,请使用负文本缩进。前女友

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

W3C是怎么做的?

只要看看https://www.w3.org/。 图像有一个z-index:1,文本在这里但在后面,因为z-index:0耦合到position: 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;
}

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

  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;
}

如果你不想在<h1>中包装你的图像时应用浏览器样式,你可以通过使用属性role="heading"aria-level="1"来获得与<h1>相同的可访问性和SEO改进

例如,就画外音而言,这个

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