In order to create a basic image gallery with CSS, we're usually accustomed to use floats to get the desired effect. However, floats sometimes can be really buggy in Internet Explorer and require a lot of workarounds to get them fixed. On the other hand, tables are a safer way to accomplish our task. However, since tables should be used only for tabular data and not for presentational purposes, we stick to a basic unordered list in our markup:
<ul id="gallery"> <li><img src="img/1.jpg" alt="Image" /> <p>Caption</p></li> <li><img src="img/2.png" alt="Image" /> <p>Caption</p></li> <li><img src="img/3.jpg" alt="Image" /> <p>Caption</p></li> </ul>
Then we want to turn this list into a table by using jQuery. First of all, we need some basic styles to keep our gallery organized:
#gallery { width: 456px; margin: 0 auto; border-collapse: collapse; table-layout: fixed; } #gallery td { width: 147px; padding-right: 5px; } #gallery td img { display: block; width: 100%; } #gallery td p { margin: 0; padding: 0.3em 0; text-align: center; text-transform: uppercase; }
Now we can add jQuery:
$(document).ready(function(){ var html = ''; html += '<table id="gallery">'; html += '<tr>'; $('#gallery li').each(function() { var $li = $(this); var imgSrc = $li.find('img').attr('src'); var imgAlt = $li.find('img').attr('alt'); var caption = $li.find('p').text(); html += '<td><img src="'+imgSrc+ '" alt="'+imgAlt+ '"/>'+'<p>'+caption+'</p></td>'; }); html += '</tr>'; html += '</table>'; $('#gallery').replaceWith(html); });
You can see the final result here.
There's a little inconvenience in doing this.
The generated content (via javascript) will be obviously disattending to that rule: we'll have a TABLE without tabular data.
I often met this kind of behaviour - keep the code clean and then manipulate the DOM via javascript - but I still think that's not fair.
It's the same that avoiding using "target" deprecated (in XHTML) attribute and then manage links with "window.open()".
I still think it's unfair. :)