Thay thế văn bản H1 bằng hình ảnh logo: phương pháp tốt nhất cho SEO và khả năng truy cập?


240

Có vẻ như có một vài kỹ thuật khác nhau, vì vậy tôi đã hy vọng nhận được câu trả lời "dứt khoát" về điều này ...

Trên một trang web, đó là cách phổ biến để tạo logo liên kết đến trang chủ. Tôi muốn làm như vậy, trong khi tối ưu hóa tốt nhất cho các công cụ tìm kiếm, trình đọc màn hình, IE 6+ và các trình duyệt đã tắt CSS và / hoặc hình ảnh.

Ví dụ thứ nhất: Không sử dụng thẻ h1. Không tốt cho SEO, phải không?

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

Ví dụ hai: Tìm thấy cái này ở đâu đó. CSS có vẻ hơi hack.

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

Ví dụ ba: Cùng một HTML, cách tiếp cận khác nhau bằng cách sử dụng văn bản thụt lề. Đây là phương pháp "Phark" để thay thế hình ảnh.

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

Ví dụ bốn: Phương pháp Leahy-Langridge-Jefferies . Hiển thị khi hình ảnh và / hoặc css bị tắt.

<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 */
}

Phương pháp nào là tốt nhất cho loại điều này? Vui lòng cung cấp html và css trong câu trả lời của bạn.


bạn nên xem chủ đề này để: stackoverflow.com/questions/1874895/ cấp
meo

15
Matt Cutts trả lời câu hỏi này. youtu.be/fBLvn_WkDJ4
troynt

2
Không phải là titlethuộc tính nên có trong <a>?
bobo

23
Câu hỏi này không nên được đánh dấu là lạc đề. Đó là một câu hỏi được xác định khá rõ ràng về CSS và tối ưu hóa công cụ tìm kiếm. Chỉ vì nó không phải là C # không có nghĩa là nó không phải là mã.
MikeMurko

3
@troynt Thỉnh thoảng tôi thấy Matt Cutts đưa ra lời khuyên sai lệch. Như vậy tôi có xu hướng không xem anh ta.
TheBlackBenzKid

Câu trả lời:


221

Bạn đang thiếu tùy chọn:

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

tiêu đề in href và img đến h1 là rất, rất quan trọng!


12
Liệu bọc một h1 xung quanh một hình ảnh với văn bản thay thế có mang cùng trọng lượng (seo-khôn ngoan) như văn bản đơn giản được bao bọc bởi một h1 không?
Andrew

11
Nhân tiện, nó có liên quan, logo là một phần của nội dung trang web của bạn, nó không được sử dụng để trang trí, vì vậy hãy sử dụng <img> với thuộc tính alt không phải CSS cho logo của bạn.
Boris Guéry

14
Matt Cutts trả lời câu hỏi này. youtube.com/user/GoogleWebmasterHelp#p/search/0/fBLvn_WkDJ4
troynt

34
Thật không may, liên kết trong bình luận để lại bởi @troynt hiện đã bị hỏng. Đây là một permalink mới cho nội dung: youtu.be/fBLvn_WkDJ4
ahsteele

10
Đối với tất cả những ai đang tự hỏi những gì trong video được liên kết: Matt Cutts về cơ bản nói, bạn nên sử dụng thuộc tính alt của thẻ img thay vì ẩn văn bản bằng css.
bixix

17

Tôi làm điều đó chủ yếu giống như ở trên, nhưng vì lý do tiếp cận, tôi cần hỗ trợ khả năng hình ảnh bị vô hiệu hóa trong trình duyệt. Vì vậy, thay vì thụt lề văn bản từ liên kết ra khỏi trang, tôi che nó bằng cách định vị <span>hoàn toàn chiều rộng và chiều cao của toàn bộ <a>và sử dụng z-indexđể đặt nó phía trên văn bản liên kết theo thứ tự sắp xếp.

Giá là một sản phẩm nào <span>, nhưng tôi sẵn sàng để nó ở đó cho một thứ quan trọng như một <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
Có gì sai với thụt lề? Giả định của tôi là trình đọc màn hình và trình thu thập thông tin vẫn nhận văn bản mặc dù thụt lề.
ckarbass

2
Xin lỗi, tôi mất quá nhiều thời gian để quay lại đây. Vấn đề duy nhất với thụt lề là nếu hình ảnh bị tắt trong trình duyệt của người dùng nhưng CSS vẫn bật, không có gì xuất hiện, văn bản hoặc hình ảnh. Đó là một trường hợp cạnh, nhưng quan trọng đối với tôi, làm việc trên một trang web của trường đại học.
Rob Knight

hmm ... tôi không thể làm việc này Các văn bản neo tiếp tục xuất hiện trên đầu của hình ảnh.
Andrew

<nitpicker> thay vào đó hãy sử dụng #logo span, trình duyệt sẽ hiển thị hiệu quả hơn </ nitpicker>
Chris Missal

1
Trong một số trường hợp, bạn cần {top: 0} để #logo một nhịp.
Marcus

11

Nếu lý do tiếp cận là quan trọng thì hãy sử dụng biến thể đầu tiên (khi khách hàng muốn xem hình ảnh mà không có kiểu dáng)

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

Không cần phải tuân thủ các yêu cầu SEO tưởng tượng, bởi vì mã HTML ở trên có cấu trúc chính xác và chỉ bạn mới nên quyết định điều này phù hợp với khách truy cập của bạn.

Ngoài ra, bạn có thể sử dụng biến thể với ít mã HTML hơn

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

Xin lưu ý rằng tôi đã xóa tất cả các kiểu hack và CSS khác vì chúng không tương ứng với tác vụ. Họ có thể chỉ hữu ích trong các trường hợp cụ thể.


3
display:nonekhông truy cập được.
KPM

Phương pháp tốt nhất là gói logo theo div do Khả năng truy cập, Khả năng sử dụng và tối ưu hóa SEO và được sử dụng chủ yếu trên các tổ chức web lớn. Twitter, Amazon, Mozilla không sử dụng <h1> cho logo của họ mà là các tiêu đề chính để nắm bắt giá trị trang tốt hơn. bit.ly/1MR4fr5
Oriol

4

Chiming ở đây hơi muộn, nhưng không thể cưỡng lại.

Câu hỏi của bạn là một nửa thiếu sót. Hãy để tôi giải thích:

Nửa đầu câu hỏi của bạn, về thay thế hình ảnh, là một câu hỏi hợp lệ, và ý kiến ​​của tôi là đối với một logo, một hình ảnh đơn giản; một thuộc tính alt; và CSS cho định vị của nó là đủ.

Nửa sau câu hỏi của bạn, về "giá trị SEO" của H1 cho logo là cách tiếp cận sai khi quyết định sử dụng yếu tố nào cho các loại nội dung khác nhau.

Logo không phải là một tiêu đề chính, hoặc thậm chí là một tiêu đề, và sử dụng yếu tố H1 để đánh dấu logo trên mỗi trang trên trang web của bạn sẽ gây hại nhiều hơn một chút so với thứ hạng của bạn. Về mặt ngữ nghĩa, các tiêu đề (H1 - H6) phù hợp với, chỉ là: các tiêu đề và các tiêu đề phụ cho nội dung.

Trong HTML5, nhiều tiêu đề được cho phép trên mỗi trang, nhưng logo không xứng đáng với một trong số chúng. Logo của bạn, có thể là một tiện ích màu xanh mờ và một số văn bản nằm trong một hình ảnh bên cạnh tiêu đề vì một lý do - đó là một "tem", không phải là một yếu tố phân cấp để cấu trúc nội dung của bạn. Đầu tiên (cho dù bạn sử dụng nhiều hơn tùy thuộc vào hệ thống phân cấp tiêu đề của bạn) H1 của mỗi trang trên trang web của bạn nên tiêu đề chủ đề của nó. Tiêu đề chính của trang chỉ mục của bạn có thể là 'Nguồn tốt nhất cho các tiện ích xanh mờ ở NYC'. Tiêu đề chính trên một trang khác có thể là 'Chi tiết vận chuyển cho các tiện ích mờ của chúng tôi'. Trên một trang khác, nó có thể là 'Giới thiệu về Fuzzy Widgets Inc.' của Bert. Bạn có được ý tưởng.

Lưu ý bên lề: Thật đáng kinh ngạc, đừng nhìn vào nguồn tài sản web thuộc sở hữu của Google để biết ví dụ về đánh dấu chính xác. Đây là toàn bộ bài viết cho chính nó.

Để có được "giá trị SEO" nhất từ ​​HTML và các yếu tố của nó, hãy xem thông số kỹ thuật HTML5 và đưa ra quyết định đánh dấu dựa trên ngữ nghĩa và giá trị (HTML) cho người dùng trước công cụ tìm kiếm và bạn sẽ thành công hơn với SEO.


1
Thêm vào đó, tất cả những điều này là đúng và logo không nên là h1 trên bất kỳ trang nào khác ngoại trừ trang chủ (& lý tưởng nhất là không có trên trang chủ). Tuy nhiên, thông thường trên trang chủ, vị trí phù hợp nhất cho h1 sẽ là logo, vì nội dung biểu ngữ anh hùng có thể không đủ cụ thể cho chủ đề của trang web (nghĩa là nó có thể liên quan đến dịch vụ hoặc sản phẩm hiện tại đang được đẩy hơn là chủ đề cốt lõi của trang web). Nếu trang web chỉ có một khu vực tập trung (ví dụ: trang web cho một ứng dụng), khu vực anh hùng có thể hoạt động cho h1. Khi nó không hoạt động, một hình ảnh với alt được bao bọc trong h1 sẽ tốt hơn là không có gì.
elmarko

3

Tôi nghĩ rằng bạn sẽ quan tâm đến cuộc tranh luận về H1 . Đó là một cuộc tranh luận về việc nên sử dụng yếu tố h1 cho tiêu đề của trang hay cho logo.

Cá nhân tôi sẽ đi với đề xuất đầu tiên của bạn, một cái gì đó dọc theo những dòng này:

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

Tất nhiên điều này phụ thuộc vào việc thiết kế của bạn có sử dụng tiêu đề trang hay không nhưng đây là lập trường của tôi về vấn đề này.


Tôi khá chắc chắn rằng IMG được coi là nội dung trong khi hình ảnh nền css thì không. Đó là lý do tại sao tôi có xu hướng nghiêng về hình ảnh nền cho hình ảnh trên toàn trang web và những thứ thuộc về bản chất không rõ ràng cho nội dung trang đó.
Joe Phillips

@ d03boy: Trong trường hợp đó, bạn có thể tạo một div nội tuyến có kích thước chính xác cho kích thước logo và đặt nền đó. Một khoảng bên trong nó (có khả năng hiển thị: ẩn;) sẽ cung cấp thay thế "văn bản thay thế".
Ross

6
Cuộc tranh luận H1 bây giờ là một liên kết chết
alex

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

Đây là tùy chọn tốt cho SEO vì SEO ưu tiên cao cho thẻ H1, bên trong thẻ h1 phải là tên trang web của bạn. Sử dụng phương pháp này nếu bạn tìm kiếm tên trang web trong SEO, nó cũng sẽ hiển thị logo trang web của bạn.

bạn muốn ẩn tên trang web HOẶC văn bản, vui lòng sử dụng văn bản thụt lề trong giá trị âm. Ví dụ

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

2

Bạn đã bỏ lỡ tiêu đề trong <a>yếu tố.

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

Tôi đề nghị đặt tiêu đề trong thành <a>phần vì khách hàng muốn biết ý nghĩa của hình ảnh đó là gì. Vì bạn đã đặt text-indentthử nghiệm <h1>như vậy, người dùng mặt trước đó có thể nhận thông tin về logo chính trong khi họ di chuột vào logo.


2

W3C làm thế nào?

Đơn giản chỉ cần xem qua https://www.w3.org/ . Hình ảnh có một z-index:1, văn bản ở đây nhưng phía sau vì được z-index:0ghép vớiposition: absolute;

HTML gốc:

<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 gốc:

#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

Một điểm chưa ai chạm tới là thực tế là thuộc tính h1 phải cụ thể cho mọi trang và sử dụng logo trang web sẽ sao chép hiệu quả H1 trên mỗi trang của trang web.

Tôi thích sử dụng chỉ số az ẩn h1 cho mỗi trang vì SEO h1 tốt nhất thường không phải là tốt nhất để bán hàng hoặc giá trị thẩm mỹ.


Bạn luôn có thể sử dụng H1 cho logo trên trang chính.
Mariusz Jamro


0

Tôi không biết nhưng đây là định dạng đã sử dụng ...

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

Đơn giản và nó đã không làm hại trang web của tôi như tôi có thể thấy. Bạn có thể css nó nhưng tôi không thấy nó tải nhanh hơn.


0

Vì lý do 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

Sau khi đọc qua các giải pháp trên, tôi đã sử dụng giải pháp CSS Grid.

  1. Tạo một div chứa văn bản h1 và hình ảnh.
  2. Định vị hai mục trong cùng một ô và làm cho cả hai vị trí tương đối.
  3. Sử dụng kỹ thuật zeldman.com cũ để ẩn văn bản bằng cách sử dụng các thuộc tính văn bản thụt lề, khoảng trắng và tràn.
<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});
}

Tốt nhất không nên sử dụng các đoạn văn bản lớn như thế này, vì nó gây ra hiệu quả lớn. Giải thích chi tiết tại đây .
Nick 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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.