提问人:Andrew 提问时间:3/20/2009 最后编辑:animusonAndrew 更新时间:10/15/2022 访问量:266467
用徽标图像替换 H1 文本:SEO 和可访问性的最佳方法?
Replacing H1 text with a logo image: best method for SEO and accessibility?
问:
似乎有几种不同的技术,所以我希望得到一个“明确”的答案......
在网站上,通常的做法是创建链接到主页的徽标。我想做同样的事情,同时最好地针对搜索引擎、屏幕阅读器、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。
答:
我主要像上面一样这样做,但出于可访问性的原因,我需要支持在浏览器中禁用图像的可能性。因此,我没有将链接中的文本缩进页面,而是通过绝对定位到整个宽度和高度来覆盖它,并用于按堆叠顺序将其放置在链接文本上方。<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 样式和技巧,因为它们与任务不对应。它们可能仅在特定情况下有用。
评论
display:none
无法访问。
我想你会对 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>
当然,这取决于你的设计是否使用页面标题,但这是我在这个问题上的立场。
评论
您缺少以下选项:
<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>
<h1 id="logo">
<a href="#" title="..."><span>Stack Overflow</span></a>
</h1>
我建议将标题放在元素中,因为客户想知道该图像的含义是什么。因为您已经设置了测试,所以前端用户可以将鼠标悬停在徽标上时获取主徽标的信息。<a>
text-indent
<h1>
我不知道,但这是使用的格式......
<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的定位就足够了。
你问题的后半部分,关于H1的标志的 “SEO值 ”,是决定将哪些元素用于不同类型的内容的错误方法。
徽标不是主要标题,甚至根本不是标题,使用 H1 元素标记您网站每个页面上的徽标对您的排名弊大于利。从语义上讲,标题 (H1 - H6) 适用于:内容的标题和副标题。
在 HTML5 中,每个页面允许使用多个标题,但徽标不配拥有其中之一。您的徽标可能是一个模糊的绿色小部件,并且出于某种原因,某些文本位于标题侧面的图像中 - 它是一种“邮票”,而不是用于构建内容的分层元素。您网站每个页面的第一个(是否使用更多取决于您的标题层次结构)H1 应作为其主题的标题。索引页的主要标题可能是“纽约市模糊绿色小部件的最佳来源”。另一个页面上的主要标题可能是“我们的模糊小部件的运输详细信息”。在另一页上,它可能是“关于 Bert's Fuzzy Widgets Inc.”。你明白了。
旁注:尽管听起来令人难以置信,但不要查看 Google 拥有的网络资产的来源以获取正确标记的示例。这本身就是一整篇文章。
为了从 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 标签内应该是您的网站名称。使用此方法,如果您在 SEO 中搜索网站名称,它也会显示您的网站徽标。
您想隐藏站点名称或文本,请使用负值的文本缩进。前任
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 Grid 解决方案。
- 创建一个包含 h1 文本和图像的 div。
- 将两个项目放在同一个单元格中,并使它们都相对定位。
- 使用旧的 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;
}
如果您不希望在将图像包装在 中时应用浏览器样式,则可以通过使用属性和<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>
评论
title
<a>