Words from Alejandro U. Alvarez
Posts tagged css
iPhone web development [Part 2]
May 21st
In part one of my tutorial on iPhone web development, we talked about the basic stuff (Recognizing iPhones or iPods, setting up special HTML and CSS tags... ) we will now move on to the really clever bit: Orientation detection.
For many sites, we may just have the same thing both on portrait and landscape. But sometimes we will want to use that extra space to display our content differently, and here is how.
Orientation detection with CSS:
We can use some smart CSS3 selectors to ensure that some styles only apply to landscape, or to portrait modes:
/* Portrait */ @media screen and (max-width: 320px){ h1{ font-size:20px; } } /* Landscape */ @media screen and (min-width: 321px){ h1{ font-size:24px; } }
Remember that for this to work we must use the viewport meta tag I showed you in my previous tutorial
This media query works (According to Apple's documentation) since iPhone OS 1.0, so there shouldn't be any problem with it, Firefox mobile should also support this, so by using max-device-width and min-width we should be able to develop specific CSS for every device without the need of PHP to include only certain style sheets
Orientation detection with JavaScript:
We can easily detect the device orientation by checking the innerWidth. This method will also work for other PDAs and SmartPhones:
var updateLayout = function() { if (window.innerWidth != currentWidth) { currentWidth = window.innerWidth; var orient = (currentWidth == 320) ? "profile" : "landscape"; document.body.setAttribute("orient", orient); window.scrollTo(0, 1); } }; iPhone.DomLoad(updateLayout); setInterval(updateLayout, 500);
This code will add a new attribute (orient) to the body element, which will be either portrait or landscape. All we have to do now is use CSS to filter out whatever orientation we need:
There is another method, which will work only on the iPhone though:
body[orient="landscape"]{ // CSS code here... } // ... or ... body[orient="portrait"]{ // CSS code here... }
That JavaScript also hides the toolbar by using the scrollTo() function when the orientation changes,
Next release:
On my next release in this series of iPhone web development tutorials, I will get into the really advanced JavaScript API we have for the iPhone (touch detection, gestures... etc) so stay tuned!
Hope you found this useful,
Alex
Fast and dirty CSS trick for IE
Mar 11th
I actually think that we the developers need IE, it is like the bad guy in an action movie, the good guy wouldn't have a life without him, although sometimes you really wish it never existed! Haha just kidding, we all wish it didn't exist... But well, there are some times when we need something to work, we need it fast, and we just don't have time to care for the standards at that moment. For those times, we can use a simple trick like this:
Underscore to comment out lines
This is probably the simplest tip, you can use underscores preceding style definitions to set them as comments... for all good browsers out there, except of course IE. This way you can easily define specific IE rules by putting an underscore before the style.
#underscore{ width:300px; _width:320px; /* This rule is only for IE */ }
This way we can easily add a different width, padding, or anything to an element in order to "get it right"
The clean way:
Now we are not going to do that with every single rule we need fixed! When we are going to fix more things, it's much better to put the fixes in a different stylesheet, and link it using a conditional statement. Basically, we want only IE6 for example to use those fixes, how is that done?
<!--[if lte IE 6]> <link media="screen" rel="stylesheet" href="something.css" /> <![endif]-->
But this doesn't validate! We need to find a solution then, and it is not as hard as one could think
We are going to include that, inside another conditional comment, but this time inside one that is valid! So we would write it as follows:
<!--[if IE]><![if lte IE 6]><![endif]--> <link media="screen" rel="stylesheet" href="something.css" /> <!--[if IE]><![endif]><![endif]-->
Now it validates! We have achieved using valid conditional comments to do this! I will now explain a bit more about these and how they work:
Conditional comments at a glance
You're smart (I hope) So let's race through this, conditional comments allow you to tell the browser to use some parts of your html only if a specific version is running (Or not) Let me show you the options we have: (Please note that this is the html valid version for each of them)
- <!--[if IE]> To select Internet Explorer
- <!--[if IE]><![if !IE]> Only if the browser is not Internet Explorer
- <!--[if IE 5.0]> Only if it is Internet Explorer 5.01 (There are other options as well)
- <!--[if !IE 5.0]> To select for IE 5.5 or 6 or 7.0
We also have some keywords that will allow for more control:
- gt = Selects greater than
- lt = Selects less than
- gte = Selects greater than or equal to
- lte = Selects less than or equal to
- ! = Selects all but what the expression says (i.e. It negates the expression)
For more information on conditional comments check out this guide by Manfred Staudinger
Stylish CSS trick for your Website
Oct 19th
Maybe a few of you noticed this on some websites, maybe some of you even use it.
Right now this works in Safari, Opera, and Konqueror and Firefox 3.x. (I think it doesn't work in Firefox 1 or 2, correct me if I'm wrong)
What I'm talking about is the text-shadow, wisely applied to your design, it can give an great touch of elegance to your site.
Here you have an example:

And here you have a coded example:
The code
The CSS for this is very simple, we will simply apply a slight text-shadow, of 1px with no blur, to the text:
.elegant{ text-shadow:#FFFFFF 0 1px; }
This effect works best with dark grey text over light grey background, and it is a very useful style for "2.0" designs.
Hope you enjoyed it!
Alex
Apply a background image to an image
Sep 15th
this is quite a neat trick, and it can look really good depending on your design and the image you put as background...
To get it to work all you need is to apply a padding and display:block; to the image. So the CSS would be:
img{ display:block; padding:10px; background-image:url(image.gif); }
Here is a very smart use of this technique, where a div contains the sky, the image is a little man running, with an animated background that simulates motion.
Read the post that explains how that was achieved if you have any doubts.
Enjoy,