Optimizar el sitio web para dispositivos táctiles


En un dispositivo táctil como iPhone/iPad/Android puede ser difícil presionar un botón pequeño con el dedo. No hay una forma entre navegadores para detectar dispositivos táctiles con consultas de medios CSS que yo sepa. Así que compruebo si el navegador tiene soporte para eventos táctiles javascript. Hasta ahora, otros navegadores no los han soportado, pero el último Google Chrome en el canal dev habilitado eventos táctiles (incluso para dispositivos no táctiles). Y sospecho que otros fabricantes de navegadores seguirán, ya que las computadoras portátiles con las pantallas táctiles vienen . Actualizar: Era un error en Chrome, por lo que ahora la detección de JavaScript funciona de nuevo.

Esta es la prueba que uso:

function isTouchDevice() {
    return "ontouchstart" in window;
}

El problema es que esto solo prueba si el navegador tiene soporte para eventos táctiles, no el dispositivo.

¿Alguien conoce la forma correcta[tm] de dar a los dispositivos táctiles una mejor experiencia de usuario? Aparte de oler el agente de usuario.

Mozilla tiene una consulta multimedia para dispositivos táctiles. Pero no he visto nada igual en ninguna otro navegador: https://developer.mozilla.org/En/CSS/Media_queries#-moz-touch-enabled

Actualización: Quiero evitar usar una página/sitio separado para dispositivos móviles/táctiles. La solución tiene que detectar dispositivos táctiles con detección de objetos o similar desde JavaScript, o incluir un toque personalizado-CSS sin olfatear el agente de usuario! La razón principal por la que pregunté, fue para asegurarme de que no es posible hoy, antes de contactar al grupo de trabajo css3. Así que por favor no contestes si no puedes seguir la requisitos de la pregunta;)

Author: gregers, 2010-04-09

11 answers

Me parece que quieres tener una opción amigable con la pantalla táctil, para cubrir los siguientes escenarios:

  1. Dispositivos similares al iPhone: pantalla pequeña, solo toque
  2. Pantallas pequeñas, sin tocar (no mencionaste esta)
  3. Pantallas grandes, sin contacto (es decir, computadoras convencionales)
  4. Pantallas grandes habilitadas para pantallas táctiles, como iPad, portátiles/PC con pantallas táctiles.

Para los casos 1 y 2, probablemente necesitará un sitio separado o un archivo CSS que elimine mucho contenido innecesario y hace que las cosas sean más grandes y fáciles de leer/navegar. Si te importa el caso # 2, siempre y cuando los enlaces/botones en la página sean navegables por teclado, entonces los casos 1 y 2 son equivalentes.

Para el caso 3 tiene su sitio web normal. Para case 4, parece que desea que las cosas en las que se puede hacer clic sean más grandes o más fáciles de tocar. Si no es posible simplemente hacer todo más grande para todos los usuarios, una hoja de estilo alternativa puede proporcionarle el diseño táctil cambio.

Lo más fácil de hacer es proporcionar un enlace a la versión de pantalla táctil del sitio en algún lugar de la página. Para dispositivos táctiles conocidos, como el iPad, puede oler el agente de usuario y establecer la hoja de estilo táctil como predeterminada. Sin embargo, consideraría hacer de esto el valor predeterminado para todos; si su diseño se ve bien en el iPad, debería verse aceptablemente bien en cualquier notebook. Los usuarios del ratón con habilidades de clic menos que estelares estarán encantados de encontrar objetivos de clic más grandes, especialmente si agrega los efectos :hover o mouseover apropiados para que los usuarios sepan que se puede hacer clic en las cosas.

Sé que dijiste que no querías oler a los agentes de usuario. Pero yo diría que en este momento el estado del soporte del navegador para esto está en demasiado flujo para preocuparse por la forma "Correcta" de hacerlo. Los navegadores eventualmente proporcionarán la información que necesita, pero probablemente encontrará que pasarán años antes de que esta información sea ubicua.

 21
Author: Mr. Shiny and New 安宇,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-15 13:03:54

¡Buenas noticias! El borrador del editor de CSS4 Media Queries ha incluido una nueva característica de medios 'puntero'.

Los ejemplos típicos de un sistema de puntería 'fino' son un ratón, un track-pad o una pantalla táctil basada en un lápiz óptico. Las pantallas táctiles basadas en los dedos calificarían como'gruesas'.

/* Make radio buttons and check boxes larger if we
   have an inaccurate pointing device */
@media (pointer:coarse) {
    input[type="checkbox"], input[type="radio"] {
        min-width:30px;
        min-height:40px;
        background:transparent;
    }
}

También es posible probar la media query desde JavaScript:

var isCoarsePointer = (window.matchMedia &&
                       matchMedia("(pointer: coarse)").matches);

Actualizado Feb. 11. 2013 En Windows 8 versiones recientes de Chrome (versión 24+) detectar touch-hardware al iniciar la aplicación y exponer eventos táctiles. Desafortunadamente si "pointer: coarse" devuelve false, no hay manera de saber si es porque las consultas de medios de puntero no están implementadas o porque hay un puntero fino. WebKit aún no ha implementado "pointer:fine", así que tampoco podemos comprobarlo.

Actualización Sept. 26. 2012 Probado en Safari en iOS6 y Chrome en Android 4.1.1 y todavía no está allí. 'puntero' y 'hover' media-queries aterrizó en WebKit el 30 de mayo. Según el User-Agent, Safari utiliza la rama WebKit536.26 a partir del 25 de abril, y Chrome en Android utiliza e incluso más antiguo (535.19). No estoy seguro de que las ramas de WebKit de las cadenas de Agente de usuario sean de confianza, pero mi página de prueba tampoco es capaz de detectar consultas de medios de puntero. La implementación de May solo implementa la consulta de medios de puntero para dispositivos táctiles, por lo que pointer: fine no funcionará para dispositivos con un mouse.

 14
Author: gregers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-11 11:29:07

No se si una consulta de medios estandarizada como la de Mozilla resolverá el problema por sí misma. Como uno de los desarrolladores de Chromium dijo en esa discusión que vinculó, la presencia de soporte de eventos táctiles en el navegador no significa que los eventos táctiles puedan o se disparen, o incluso si lo hacen, que el usuario solo querrá interactuar a través de la entrada táctil. Del mismo modo, la presencia de soporte de entrada táctil en el dispositivo no significa que el usuario utilizará ese método de entrada, tal vez el dispositivo sea compatible con el mouse, teclado, y la entrada táctil y el usuario prefiere el ratón o alguna combinación de los tres tipos de entrada.

Estoy de acuerdo con el desarrollador de Chromium que soportar eventos táctiles no fue un error en el navegador. Un buen navegador debe admitir eventos táctiles porque puede estar instalado en un dispositivo que admita la entrada táctil. Es culpa del desarrollador del sitio web que tomara el soporte del evento para significar que el usuario estaría interactuando a través del tacto.

Parece Que necesitamos saber dos cosas: (1) ¿Qué son todos los tipos de entrada soportados en el dispositivo (2) ¿Cuáles son todos los tipos de eventos soportados en el navegador

Dado que no sabemos #1 en este momento, hay un enfoque propuesto por PPK de quirksmode que me gusta. Él habla de ello aquí: http://www.quirksmode.org/blog/archives/2010/02/do_we_need_touc.html#link4

Básicamente, escuche los eventos táctiles y los eventos del mouse, y cuando ocurran, configure la interfaz de usuario en consecuencia. Obviamente eso se limita al desarrollador. No creo es un enfoque válido para su problema con el tamaño del enlace porque no desea esperar a que la interacción altere la interfaz de usuario. El punto es presentar una interfaz de usuario diferente (un enlace más grande/más pequeño) antes de que ocurra cualquier interacción.

Espero que hagas tu propuesta y se incluya en CSS3. Hasta entonces, por mucho que me duela decirlo, la inhalación de agentes de usuario parece el mejor enfoque.

P. S. Espero esperanza esperanza alguien viene aquí y demuestra que me equivoco

 3
Author: Michael Hixson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-05 04:01:51

Google Chrome tiene un interruptor de línea de comandos para habilitar los eventos táctiles. Desactivado por defecto. Así que hasta que los habiliten para todos nuevamente (con suerte no lo harán), es posible detectar el contacto con la ayuda de javascript como describí en la pregunta..

Actualización jun 3 2010: Esto realmente entró en la versión estable el 25 de mayo de 2010 :( No lo sé, fue un error o no.

Han discutido el tema en la lista de correo del w3c, pero dudo que algo suceda muy pronto. http://lists.w3.org/Archives/Public/www-style/2010May/0411.html Podrían discutir esto durante el TPAC en noviembre.

Actualización sep 30 2010 : Supuestamente arreglado en Chrome 6. Aún no he tenido tiempo de bajar a estable para verificar. Desde Chrome actualizar automáticamente este problema ya debería haber desaparecido :)

Lea esto si está considerando usar medios consulta: http://www.cloudfour.com/css-media-query-for-mobile-is-fools-gold / y http://www.quirksmode.org/blog/archives/2010/09/more_about_medi.html

Actualización del 16 de mayo de 2011 : El W3C ahora está trabajando en una especificación de eventos táctiles , pero más o menos se negó a ocultar eventos táctiles para terminales sin hardware táctil. Por lo tanto, no espere que la detección de eventos táctiles funcione por mucho tiempo.

Actualización 6 de junio de 2012: Los medios de comunicación CSS4 del W3C Las consultas (Borrador de editores) tienen algo muy interesante. Ver mi respuesta separada sobre esto.

 3
Author: gregers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:33:58

No, no hay tal cosa. CSS tiene la opción de tamaño de pantalla, que le permitirá optimizar el diseño, pero eso es todo. También hay media="handheld", pero eso tampoco se aplica a sus requisitos.

La detección de características puede funcionar con javascript, sin embargo, hay problemas con diferentes eventos para diferentes dispositivos. PPK (el hombre detrás quirksmode.org) está haciendo una gran cantidad de trabajo comprobando qué javascript es posible para cada dispositivo móvil / portátil,y está demostrando que nada parece para ser estándar con estos dispositivos y, sin embargo, esto todavía no se aplica a su requisito para dispositivos portátiles táctiles.
(honestamente, no sé por qué te preocupa un dispositivo que aún no está fuera, sé pragmático y preocúpate por él una vez que esté aquí y puedes probarlo)

El trabajo de PPK en el navegador móvil y los eventos táctiles, le ahorrará horas. Échale un vistazo aquí

 2
Author: Dave Gregory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-17 04:57:07
 0
Author: Divya Manian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-19 01:52:30

No es una solución completa, pero es posible que desee simplemente evitar cualquier botón pequeño. Si bien los botones pequeños son más un problema de usabilidad en dispositivos táctiles, siempre son difíciles de usar, incluso con una pantalla grande y un mouse.

Si solo prestas atención al uso de botones adecuadamente grandes con suficiente espacio entre ellos, todos se beneficiarán. Además, te obligará a no saturar tu interfaz con demasiados botones pequeños: -).

 0
Author: sleske,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-01 10:35:48

Intente usar tablas y haga que una celda completa sea un enlace... estoy trabajando en eso en mi sitio web... no está funcionando bien hasta ahora... pero podrías encontrar una manera... de esta manera, no es necesario sobrecargar su sitio web con javascript y detección de funcionalidad... usted puede darle un tamaño relativo instread de un tamaño fijo... y de esta manera, su sitio web se puede ver en un escritorio como se ve en un iphone... piensa en esta idea... cualquier sugerencia es apreciada...

 0
Author: Ismael Miguel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-10 12:24:57

Véase http://crbug.com/136119 para soporte para agregar puntero:fine en Chrome. En realidad, es posible detectar si pointer: coarse es compatible (para distinguir unset de not supported): simplemente cree la consulta de medios usted mismo y pruebe en javascript si se analizó correctamente.

Eg., hoy "@media (puntero: grueso) " en Chrome aparece:

> document.styleSheets[0].rules[5].media[0]
"(pointer: coarse)"

Pero los valores falsos no soportados como "@media (puntero: otro) " no lo hacen:

> document.styleSheets[0].rules[8].media[0]
"not all"
 0
Author: Rick Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-25 15:50:07

No tendrá ningún control sobre la detección de toques, e incluso si hizo los pasos lógicos para averiguar qué es exactamente lo que el usuario está tratando de tocar es complejo y mejor manejado por el propio dispositivo.

Lo mejor es crear una versión móvil del sitio o una hoja de estilos alternativa que se cargue cuando detecte un dispositivo móvil con Javascript.

 -3
Author: Josh K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-09 12:27:58

Si está utilizando PHP, esta es una buena solución:

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

Puede detectar si el navegador es un teléfono desde el lado del servidor olfateando los detalles de la solicitud del navegador, y si es así, mostrar hojas de estilo alternativas/extra/js/html

 -3
Author: Jonah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-17 04:50:09