I've been reading the 24 ways to impress your friends web developer tips on the run up to Christmas and the 21st article, Swooshy Curly Quotes Without Images, was quite timely for me as it is an effect I was going to include in my current project.

At first it looked quite promising, but upon experimentation it proved, for me at least, to be a little bit hit and miss to get it right in all browsers, and I must admit I gave up trying to tweak the margins and paddings quite quickly. But I liked the idea of not having to resort to using images for the large quotes, as I have done on previous attempts and began adding my own thoughts to the mix.

As simon stated:

I must admit that the heights, margins and spacing don’t make a lot of sense if you analyze them. This was a real trial and error job. Get it working on Safari, and IE would fail. Sort IE, and Firefox would go weird.

My aim was to get the same effect, but with slightly clearer rules affecting the position of the quotation marks. My solution is not quite as clean as the original in the markup (added one span) and requires a little more CSS with some specific targeting of IE. However I believe that the CSS rules and their roles in my solution are clearer to understand and thus change to reproduce the effect accordingly.

For the eager among you check out the demo page for the final results, then read how I executed it.

First the markup:

  1. <pre class="code">
  2.     <span class="bqstart">&#8220;</span>I'm a blockquote and I'm loving the big curly quotes I have.<span>&nbsp;</span><span class="bqend">&#8221;</span>
  3. </blockquote>

The only addition here is the span before the closing quotation mark, which contains a single non-breaking space character.


  1. blockquote {
  2.     position: relative;
  3.     text-indent: 2em;
  4. }
  6. .bqstart,
  7. .bqend { font-size: 300%; }
  9. .bqstart {
  10.     text-indent: 0;
  11.     position: absolute;
  12.     top: -0.2em;
  13.     left: 0;
  14. }
  16. .bqend {
  17.     position: absolute;
  18.     margin-top: -0.2em;
  19.     right: 0;
  20.     text-indent: 0;
  21. }

What this does is:

  • For all browsers we are positioning the quotation mark span elements absolutely to the relatively positioned blockquote.
  • For the opening quotation mark we fiddle with the top positioning value to ensure the quotation mark appears where we want.
  • For the closing quotation mark we apply a negative top margin to make it appear in line with the text, note that this has the same value as the top positioning applied to the opening quotation mark.
  • To ensure that the quotation marks don't appear over the text itself a text indent is applied, which is removed from the quotation marks themselves. This is the reason for the extra span, to create the space for the final quotation mark.

The only values that need tweaking, to account for the size of the quotes for your given font family or the chosen scale of the quotes themselves, are the text-indent, top positioning and negative margin (remember these two have the same value).

This is enough for all browsers except IE to which we have to apply some extra rules. These additions mean we end up with the following as our final CSS:

  1. blockquote {
  2.     position: relative;
  3.     text-indent: 2em;
  4. }
  6. .bqstart,
  7. .bqend { font-size: 300%; }
  9. /* apply IE specific rules first */
  10. .bqstart {
  11.     text-indent: 0;
  12.     margin: -0.6em 0 -2em 0;
  13.     float: left;
  14. }
  16. blockquote> .bqstart {
  17.     /* add extra non-IE rules */
  18.     position: absolute;
  19.     top: -0.2em;
  20.     left: 0;
  21.     /* remove IE specific rules */
  22.     float: none;
  23.     margin: 0;
  24. }
  26. .bqend {
  27.     position: absolute;
  28.     margin-top: -0.6em;
  29.     right: 0;
  30.     text-indent: 0;
  31. }
  33. blockquote> .bqend {
  34.     margin-top: -0.2em;
  35. }

The absolute positioning method was producing widely different results on the opening quote in each version of IE on the PC, it even removed the text-indent in IE 5.5 - which re-appeared when the following solution was applied.

So I returned to Simon's solution to fix this. In this case as we're only dealing with one family of browsers, and thankfully the results are the same in all three versions of IE on the PC, we only have to apply values to the top and bottom margins for IE.

These IE specific rules are then over-ridden using the child selector, so every other browser gets the original CSS in the cascade.

The closing quotation mark was, thankfully, appearing in the same place in all three versions of IE and in pretty much the same place as every other browser, so it was simply a matter of increasing the size of the negative top margin, note that this is again the same value applied to the opening quotation mark. If you're not a perfectionist you could even get away with accounting for this tiny difference without loosing any sleep.

See the demo page for the final results.

Browser Support

Tested with:
PC : Firefox 1.5, Opera 8.5, NS 7.1, IE 5, 5.5, 6
Mac : Safari 2.0, Firefox 1.5


  • Firefox 1.5 on the Mac only the closing quotation mark overlaps the text where the last line is full width. This is because the text-indent is not been applied to the span that contains the &nbsp; and I can't seem to make it apply it.
  • In the demo when I added a background color the opening quotation mark disappeared in IE 5.5 and IE 6.0, this was solved by adding the ever useful IE CSS bug fixer known position: relative;.

I've not had chance to test it on a Mac yet, but when I do I'll post the results. Update: I've just tested on the Mac and have added the browsers above, I must also apologise to my Safari visitors as I noticed a bug with the code example areas - which I've now fixed.

Something a little weird is going on here for me, IE 5.0 is applying the rules within the child selector, I'm pretty sure that it shouldn't but can't explain why it is. Anyhow if this is a common occurrence the absolute positioning solution it ends up applying seems to work fine (go figure).


There have been 9 comments so far, join the discussion.

1. Hossain - 12th Apr 2007 - 5:18 am

thanks for the great tutorial with explanation !!!!!!!!!
really impressive :D

2. philip hopkins - 10th Jul 2007 - 10:33 am

the example does not work well in opera. any ideas?

3. Martin Baker - 19th Oct 2007 - 7:00 pm

Absolutely fantastic. Works a treat!

4. msm - 4th Jun 2008 - 5:06 pm

works great in safari on iPhone!

5. Joseph - 8th Mar 2009 - 11:51 pm

Worked like a charm for me. Actually worked out better than the 24 Ways solution.

6. James Taylor - 16th Mar 2009 - 4:45 pm

Excellent! A big step forward over Simon Collison’s original method which i tried w/o success here: http://www.kingarthurflour.com/reasons-to-bake.html. Thanks much for your excellent coding.

7. James Taylor - 16th Mar 2009 - 4:46 pm


example is posted here:


8. Phil - 26th Apr 2009 - 12:12 am

Great article. But the quotes appear as slanted “sharp” quotations rather than the “curly” quotations in your examples show. Any suggestions?

9. Shop - 12th Jul 2010 - 8:17 pm

Thank you for the article however As Phil mentions they do display as straight sharp quotations rather than the typically more pleasing curly quotes

10. ggaeck - 15th Aug 2016 - 9:30 am

hbxSmK wvijqdhblvsn, [URL=http://kiwmzwcxrwsz.com/]kiwmzwcxrwsz[/url], [link=http://bptnmzwzdssj.com/]bptnmzwzdssj[/link], http://asphycnfseis.com/

11. buspar - 1st Oct 2016 - 1:26 pm

http://buybuspar.men/#6950 buspar,

12. medrol pak 4mg - 1st Oct 2016 - 2:14 pm

http://medrolpak.cricket/#4869 medrol,

13. clomid 100 mg - 1st Oct 2016 - 2:51 pm

http://clomid50mg.date/#9341 clomid 50 mg,

14. rogaine 5 - 1st Oct 2016 - 3:01 pm

http://rogaineformen.cricket/#2327 rogaine,

15. purchass of prednisolone tablets - 1st Oct 2016 - 3:38 pm

http://prednisolonetablets.science/#6806 buy prednisolone,

16. lipitor - 1st Oct 2016 - 3:48 pm

http://generic-lipitor.science/#1331 lipitor,

17. generic of cymbalta - 1st Oct 2016 - 4:42 pm

http://generic-for-cymbalta.party/#1694 cymbalta lexapro,

18. valtrex - 1st Oct 2016 - 5:02 pm

http://generic-valtrex.science/#4044 price of valtrex,

19. clonidine 0.1 mg tablet - 1st Oct 2016 - 5:12 pm

http://clonidine.host/#4041 clonidine,

20. clomid price - 1st Oct 2016 - 5:20 pm

http://clomidprice.webcam/#3679 clomid price,

21. cialis - 1st Oct 2016 - 5:39 pm

http://buy-cialis.gdn/#6570 cialis,

22. cheap generic viagra - 1st Oct 2016 - 5:58 pm

http://cheapgenericviagra.top/#6953 cheap generic viagra,

23. metformin 500mg tablets - 1st Oct 2016 - 6:38 pm

http://metformin500mgtablets.cricket/#5645 metformin 500 mg tablets,

24. augmentin 500mg - 1st Oct 2016 - 8:45 pm

http://augmentin-500-mg.eu/#2973 augmentin 625 mg,

25. generic synthroid - 1st Oct 2016 - 8:55 pm

http://generic-synthroid.trade/#9568 generic synthroid,

26. buy kamagra oral jelly - 2nd Oct 2016 - 11:39 am

http://buy-kamagra.stream/#4651 where to buy kamagra oral jelly,

27. buy clomid without script - 3rd Oct 2016 - 11:10 am

http://chlomid.party/#3080 clomid,

28. cleocin - 3rd Oct 2016 - 11:45 am

http://cleocin-online.cricket/#8153 cleocin,

Leave a comment

No HTML please, only textile. For code please use [lang]...[/lang] tags (e.g. [html]...[/html] for HTML)