I was wondering if it was possible to have a post title written vertically, but without adding manually a line break in the markup after each letter. I decided to use jQuery together with the JavaScript's methods split()
and join()
used on the text node of each title. First, we start with a basic blog-like structure like this:
<div id="main"> <div class="post"> <div class="post-header"> <h2>...</h2> </div> <div class="entry"> <p>...</p> <div class="post-metadata">...</div> </div> </div> <!--more posts--> </div>
Now we need a couple of CSS styles to align the heading on the left and the rest of the content on the right:
#main .post { height: 100%; margin-bottom: 1em; overflow: hidden; } #main .post-header { background: #000; color: #fff; height: 100%; padding: 1em; width: 5%; float: left; } #main .post-header h2 { margin: 0; font: normal 4em Impact, "Arial Black", sans-serif; color: orange; text-align: center; text-transform: uppercase; } #main .entry { font-size: 1.2em; line-height: 1.4; width: 90%; float: right; padding-left: 1em; } #main .entry p { margin: 0 0 1em 0; } #main .entry .post-metadata { font-size: small; text-align: center; padding: 4px; border-top: 1px dashed; border-bottom: 1px dashed; }
Now, jQuery. We need to know if the text node of the heading is made up of several words or of just one single word. Thus, we assume that a word is separated by a space from another, so we check whether the text node contains spaces or not:
$('#main div.post-header').each(function() { var header = $(this); var h2 = header.find('h2'); var h2Text = h2.text(); if(/\s+/.test(h2Text)) { // several words } else { // one word } });
Then we need to split the text node first into words and then into letters and create a final string glued by a br
element. This string will be used to replace the content of the heading using the jQuery's html()
method. We need this method because our string contains an HTML element:
if(/\s+/.test(h2Text)) { var words = h2Text.split(/\s/); var resultingWords = [], i, len = words.length; for(i = 0; i < len; i += 1) { var word = words[i]; resultingWords.push(word); } var letters = [], j, len2 = resultingWords.length; for(j = 0; j < len2; j += 1) { var temp = resultingWords[j]; var letter = temp.split(''); var letterJoin = letter.join('<br />'); letters.push(letterJoin); } h2.html(letters.join('<br />')); } else { var h2Letters = h2Text.split(''); var h2LetterJoin = h2Letters.join('<br />'); h2.html(h2LetterJoin); }
You can see a demo below.