views:

1273

answers:

9

On a touch device like iPhone/iPad/Android it can be difficult to hit a small button with your finger. There is no cross-browser way to detect touch devices with CSS media queries that I know of. So I check if the browser has support for javascript touch events. Until now, other browsers haven't supported them, but the latest Google Chrome on dev channel enabled touch events (even for non touch devices). And I suspect other browser makers will follow, since laptops with touch screens are comming. Update: It was a bug in Chrome, so now the JavaScript detection works again.

This is the test I use:

function isTouchDevice() {
    try {
        document.createEvent("TouchEvent");
        return true;
    } catch (e) {
        return false;
    }
}

Update: Paul Irish has created a test-page to find out how different touch-detection methods works on different devices. Please visit this page with your devices to help him.

The problem is that this only tests if the browser has support for touch events, not the device.

Does anyone know of The Correct[tm] way of giving touch devices better user experience? Other than sniffing user agent.

Mozilla has a media query for touch devices. But I haven't seen anything like it in any other browser: https://developer.mozilla.org/En/CSS/Media_queries#-moz-touch-enabled

Update: I want to avoid using a separate page/site for mobile/touch devices. The solution has to detect touch devices with object detection or similar from JavaScript, or include a custom touch-CSS without user agent sniffing! The main reason I asked, was to make sure it's not possible today, before I contact the css3 working group. So please don't answer if you can't follow the requirements in the question ;)

A: 

You won't have any control over detecting touches, and even if you did the logic steps to figure out what exactly the user is trying to touch is complex and best handled by the device itself.

Your best bet is to create a mobile version of the site or an alternate stylesheet that is loaded when you detect a mobile device with Javascript.

Josh K
I think you misunderstood my question. There is no way to include an alternative style sheet for touch devices. If you know how, please enlighten me! You can use media queries to include style sheets for small screens, but how does that help for iPad or laptops with a touch screen? Touch is not the same as mobile.
gregers
I'm assuming there is a list of touch sensitive devices and the browsers that are built in, i.e. Safari. Include an additional CSS file if it's recognized. Touch may not be the same thing as mobile, but really touch sensitivity is going to be mainly based on the device and the calibration, not you.
Josh K
@gregers I believe what he is referring to is a completely separate web site that you redirect to when you detect a mobile device. Different markup, different style, different script, same back-end. Wikipedia does this, and so do *many* other sites.
Josh Stodola
Just look at the rate of new Android phones, and soon laptops with touch screens. Doing user agent sniffing is not an option for me. If this is not possible in browsers today, it's something we need to address to the browser developers! The device manufacturers can calibrate as much as they want. I'm still going to struggle to hit the correct link/button with my finger. Touch devices need bigger buttons/links, and developers need a good way to give them that!
gregers
+3  A: 

It sounds to me like you want to have a touch-screen-friendly option, to cover the following scenarios:

  1. iPhone-like devices: small screen, touch only
  2. Small screens, no touch (you didn't mention this one)
  3. Large screens, no touch (i.e. conventional computers)
  4. Touch-screen-enabled large screens such as iPad, notebooks/pcs with touch screens.

For case 1 and 2 you will probably need a separate site or a CSS file that eliminates lots of unnecessary content and makes things larger and easier to read/navigate. If you care about case #2 then as long as the links/buttons on the page are keyboard-navigable then case 1 and 2 are equivalent.

For case 3 you have your normal website. For case 4 it sounds like you want clickable things to be bigger or easier to touch. If it's not possible to simply make everything bigger for all users, an alternate style-sheet can provide you with the touch-friendly layout changes.

The easiest thing to do is provide a link to the touch-screen-version of the site somewhere on the page. For well-known touch devices such as iPad you can sniff the user agent and set the touch stylesheet as the default. However I'd consider making this the default for everyone; if your design looks good on the iPad it should look acceptably good on any notebook. Your mouse users with less-than-stellar clicking skills will be pleased to find bigger click targets, especially if you add appropriate :hover or mouseover effects to let users know that things are clickable.

I know you said you don't want to sniff user-agents. But I'd contend that at this time the state of browser support for this is in too much flux to worry about the "Correct" way to do it. Browsers will eventually provide the information that you need, but you will probably find that it will be years before this information is ubiquitous.

Mr. Shiny and New
Small screens is not a problem. The problem is small buttons/links on touch devices - no matter the size of the screen. I know it's possible to detect using user-agent or use a separate site, but that's against all best practices. CSS3 is not final, so we still have a chance to get this as part of CSS3 media queries or similar!
gregers
I accepted your answer because adding a link to the touch version of a site (touch.mydomain.com) is probably the best practice today. As you mentioned, it's also possible to detect _some_ touch devices with user agent, and redirect them automatically. Hopefully we'll get a better way to do this in the future.
gregers
@gregers: I agree that it would be nice to have a better way. My answer was written with the intention of doing something "right" "today". Maybe one day when there is a better way someone will come along and edit this answer to make it righter. :)
Mr. Shiny and New
A: 

Apple suggests using

<link rel="stylesheet" type="text/css" media="only screen and (max-device-width: 480px)" href="handheld.css">

(or the corresponding @media rule).

AFAIK this works for the Android browser, too. Unfortunatly it seems to be the only "pure" CSS way to do this.

RoToRa
I didn't ask how to detect mobile devices. I asked about touch. So how does this solve touch for laptops? Lenovo S10-3t, Acer1420P, HP TouchSmart, Dell XT2... Please read the question
gregers
A: 

If you are using PHP, this is a good solution:

http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php/

You can detect whether the browser is a phone from the serverside by sniffing the browser request details, and if so, display alternative/extra stylesheets/js/html

Jonah
Please read the question before answering ;) "Other than sniffing user agent"
gregers
User agent sniffing is a valid solution in general. I don't see why another solution should be implanted by css3 - that would be redundant
Jonah
User agent sniffing is not future proof! A rule of thumb is to never use user agent sniffing. It will always come back and bite you. But it's impossible to use the user agent for touch support. The user agent string only contains browser and OS version. So how would you know if it's a laptop with touch screen or not? Just to name a few: Lenovo S10-3t, Acer 1420P, HP TouchSmart, Dell XT2. Both Google Chrome and Firefox are working on touch support.
gregers
+1  A: 

No, there is no such thing. CSS has the screen size option, which will allow you to optimize layout, but that's all. There is also media="handheld" but that also doesn't apply to your requirements.

Feature detection might work using javascript, however, there are issues with different events for different devices. PPK (the man behind quirksmode.org) is doing a huge amount of work checking what javascript is possible for each mobile/handheld device, and it's proving that nothing seems to be standard with these devices and yet this STILL doesn't apply to your requirement for touch laptop devices.
(honestly I dont know why you are concerned about a device that isn't even out yet, be pragmatic and worry about it once it's here and you can test it)

PPK's work on mobile browser and touch events, will save you hours. Check it out here

Yes, PPK is doing an awesome job, but it doesn't solve the need I and many other developers have. I'm just want to be sure it's not possible before I contact the people working on css3. As I beleive this should be a part of media queries.
gregers
Understood. Looks like the working group is still taking Candidate recommendations.. Let us know how that turns out. :D
A: 

Apple has TouchEvents defined only for iPhone OS FWIW

nimbupani
http://modernizr.github.com/Modernizr/touch.html :p
Paul Irish
A: 

Google Chrome now has a command line switch for enabling touch events. Disabled by default. So until they enable them for everyone again (hopefully they won't), it's possible to detect touch with the help of javascript like I described in the question..

Update jun 3 2010: This actually got into the stable version on 25th of May 2010 :( Don't know it it was a mistake or not.

Have discussed the issue on the w3c mailing list, but I doubt anything will happen very soon. http://lists.w3.org/Archives/Public/www-style/2010May/0411.html They might discuss this during TPAC in November.

Update sep 30 2010: Supposedly fixed in Chrome 6. Haven't had time to downgrade to stable yet to verify. Since Chrome upgrade automatically this problem should already be gone :)

Read this if you're considering using media queries: http://www.cloudfour.com/css-media-query-for-mobile-is-fools-gold/ and http://www.quirksmode.org/blog/archives/2010/09/more_about_medi.html

gregers
A: 

Not a complete solution, but you might want to simply outright avoid any small buttons. While small buttons are more of a usability problem on touch devices, they are always hard to use, even with a big screen & mouse.

If you just pay attention to using suitably big buttons with enough space between them, everyone will benefit. Plus, it will force you not to clutter your interface with too many small buttons :-).

sleske
+1  A: 

I don't know if a standardized media query like Mozilla's will solve the problem by itself. Like one of the Chromium developers said in that discussion you linked, the presence of touch event support in the browser doesn't mean touch events can or will fire, or even if they do, that the user will only want to interact via touch input. Likewise, the presence of touch input support in the device doesn't mean the user will use that method of input - perhaps the device supports mouse, keyboard, and touch input and the user prefers the mouse or some combination of the three input types.

I agree with the Chromium developer that supporting touch events was not a bug in the browser. A good browser should support touch events because it might be installed on a device that supports touch input. It's the website developer's fault that he took the event support to mean the user would be interacting via touch.

It seems we need to know two things: (1) What are all the supported input types on the device (2) What are all the supported event types in the browser

Since we don't know #1 right now, there is one approach proposed by PPK of quirksmode that I like. He talks about it here: http://www.quirksmode.org/blog/archives/2010/02/do_we_need_touc.html#link4

Basically, listen for touch events and mouse events, and when they happen, set up the UI accordingly. Obviously that's limiting to the developer. I don't think it's a valid approach to your problem with link size because you don't want to wait for interaction to alter the UI. The whole point is to present a different UI (a larger/smaller link) before any interaction occurs.

I hope you make your proposal and it gets included in CSS3. Until then, as much as it pains me to say it, user agent sniffing looks like the best approach.

p.s. I hope hope hope someone comes here and proves me wrong

Michael Hixson
Thank you for a very good comment. Why does your browser need to expose touch events if your device doesn't have hardware support for touch? I kind of like PPK's solution, but I'm not sure how friendly that solution is to a user.
gregers
Can a browser know it's installed on hardware that supports touch? Would any OS inform a browser if the user plugged in a touch input device? I don't know. PPK's solution is the only one where none of this matters. I hear what you're saying about user-friendliness - it would only work when the UI or behavior is result of interaction. For something like a slider bar, this works perfectly. I think YouTube also does this well with their comments (mousing over a comment exposes controls). For your big/small link problem it doesn't work so well, and it does nothing for purely HTML/CSS pages.
Michael Hixson