title: Replacing H1 text with a logo image: best method for SEO and accessibility?
body: <p>It seems like there are a few different techniques out there, so I was hoping to get a "definitive" answer on this...</p>
  
  <p>On a website, it's common practice to create a logo that links to the homepage. I want to do the same, while best optimizing for search engines, screen readers, IE 6+, and browsers who have disabled CSS and/or images.</p>
  
  <p><strong>Example One:</strong> Doesn't use an h1 tag. Not as good for SEO, right?</p>
  
  <pre><code>&lt;div id="logo"&gt;
      &lt;a href=""&gt;
          &lt;img src="logo.png" alt="Stack Overflow" /&gt;
      &lt;/a&gt;
  &lt;/div&gt;
  </code></pre>
  
  <p><strong>Example Two:</strong> Found this somewhere. The CSS seems a little hacky.</p>
  
  <pre><code>&lt;h1 id="logo"&gt;
      &lt;a href=""&gt;Stack Overflow&lt;/a&gt;
  &lt;/h1&gt;
  </code></pre>
  
  <pre class="lang-css prettyprint-override"><code>/* css */
  #logo {
      padding: 70px 0 0 0;
      overflow: hidden;
      background-image: url("logo.png");
      background-repeat: no-repeat;
      height: 0px !important;
      height /**/:70px;
  }
  </code></pre>
  
  <p><strong>Example Three:</strong> Same HTML, different approach using text-indent. This is the "Phark" approach to image replacement.</p>
  
  <pre><code>&lt;h1 id="logo"&gt;
      &lt;a href=""&gt;Stack Overflow&lt;/a&gt;
  &lt;/h1&gt;
  </code></pre>
  
  <pre class="lang-css prettyprint-override"><code>/* 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;
  }
  </code></pre>
  
  <p><strong>Example Four:</strong> <a href="http://alicious.com/2009/new-css-image-replacement-jir/" rel="noreferrer">The Leahy-Langridge-Jefferies method</a>. Displays when images and/or css is turned off.</p>
  
  <pre><code>&lt;h1 id="logo" class="logo"&gt;
      &lt;a href=""&gt;Stack Overflow&lt;/a&gt;
  &lt;/h1&gt;
  </code></pre>
  
  <pre class="lang-css prettyprint-override"><code>/* 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 */
  }
  </code></pre>
  
  <p>What method is the best for this sort of thing? Please provide html and css in your answer.</p>