: 터치 CSS 의사 클래스 또는 비슷한 것?


87

사용자가 버튼을 클릭하면 마우스 버튼을 누르고있는 동안 스타일이 변경되도록 버튼을 만들려고합니다. 모바일 브라우저에서 터치하면 비슷한 방식으로 스타일을 변경하고 싶습니다. 나에게 겉보기에 명백한 것은 CSS : active 의사 클래스를 사용하는 것이었지만 작동하지 않았습니다. : focus를 시도했지만 작동하지 않았습니다. 나는 : hover를 시도했는데 작동하는 것 같았지만 버튼에서 손가락을 떼어도 스타일이 유지되었습니다. 이 모든 관찰은 iPhone 4와 Droid 2에서 이루어졌습니다.

모바일 브라우저 (iPhone, iPad, Android 및 기타)에 효과를 복제 할 수있는 방법이 있습니까? 지금은 다음과 같이하고 있습니다.

<style type="text/css">
    #testButton {
        background: #dddddd;
    }
    #testButton:active, #testButton.active {
        background: #aaaaaa;
    }
</style>

...

<button type="button" id="testButton">test</button>

...

<script type='text/javascript' src='http://code.jquery.com/jquery-1.6.1.min.js'></script>
<script type='text/javascript'>
    $("*").live("touchstart", function() {
      $(this).addClass("active");
    }).live("touchend", function() {
      $(this).removeClass("active");
    });
</script>

: active 의사 클래스는 데스크톱 브라우저 용이고 활성 클래스는 터치 브라우저 용입니다.

Javascript를 사용하지 않고 더 간단한 방법이 있는지 궁금합니다.


2
등 거의 모든 터치 브라우저 핸들 것들 hovermousedown/ mouseup다르게, 하드 그들 모두를 수용합니다.
Chad

Android와 iOS에는 모두 사용할 수있는 : touchstart, : touchmove, : touchend 및 : touchcancel 의사 클래스가 있습니다.
Paul Hanbury

2
: touchstart 및 : touchend 의사 클래스에 대한 스타일 설정을 시도했지만 iPhone 또는 Droid에서 작동하지 않았습니다. @Paul Hanbury, CSS 의사 클래스와 자바 스크립트 이벤트를 혼동하지 않으시겠습니까?
Elias Zamaria

1
@ mikez302-나는 당신의 권리를 생각합니다. plugins.jquery.com/plugin-tags/touchstart
Doug Chamberlain

2
나는 이것을 대답으로 제출하는 것이 어리석은 느낌이 들지만 실제로 대답은 "아니요, 불가능합니다. Javascript를 사용해야합니다." 당신이 요구하는 것은 CSS2 또는 CSS3의 일부가 아닙니다. : active가 작동하지 않는다는 사실은 잠재적으로 iOS 및 Android 브라우저에서 버그로보고 할 수있는 사용자 에이전트 문제라고 생각합니다.하지만 최종 사용자 문제를 해결하기 위해 ... 예, JS를 사용해야합니다. . ontouchstart 지원 확인시 호환성 코드를 래핑 할 수 있습니다 .
joelhardi

답변:


51

:touchW3C 사양에는 http://www.w3.org/TR/CSS2/selector.html#pseudo-class-selectors 와 같은 것이 없습니다 .

:active 작동해야한다고 생각합니다.

:active/ :hoverpseudo 클래스의 순서 는 올바르게 작동하는 데 중요합니다.

위 링크의 인용문입니다.

대화 형 사용자 에이전트는 때때로 사용자 작업에 대한 응답으로 렌더링을 변경합니다. CSS는 일반적인 경우에 대해 세 가지 의사 클래스를 제공합니다.

  • : hover 의사 클래스는 사용자가 요소 (일부 포인팅 장치 포함)를 지정하는 동안 적용되지만 활성화하지는 않습니다. 예를 들어, 시각적 사용자 에이전트는 커서 (마우스 포인터)가 요소에 의해 생성 된 상자 위로 이동할 때이 의사 클래스를 적용 할 수 있습니다. 대화 형 미디어를 지원하지 않는 사용자 에이전트는이 의사 클래스를 지원할 필요가 없습니다. 대화 형 미디어를 지원하는 일부 준수 사용자 에이전트는이 의사 클래스 (예 : 펜 장치)를 지원하지 못할 수 있습니다.
  • : active 의사 클래스는 요소가 사용자에 의해 활성화되는 동안 적용됩니다. 예를 들어, 사용자가 마우스 버튼을 눌렀다가 놓는 시간 사이입니다.
  • : focus 의사 클래스는 요소에 포커스가있는 동안 적용됩니다 (키보드 이벤트 또는 기타 형식의 텍스트 입력 허용).

9
나는 : touch와 같은 것이 없다는 것을 알고 있었다. 비슷한 것이 있는지 궁금합니다. : 활성은 합리적으로 보였지만 내 테스트에서는 작동하지 않았습니다.
Elias Zamaria

@ mikez302-내가 내 출처를 인용하고 싶다는 것을 알고 계셨다 고 생각했습니다. 주문이 매우 중요하다는 점을 제외하고는 작동하지 않을 이유가 없다고 동의합니다. 누군가 IOS 및 Android 용 CSS 유사 선택기에 대해 게시 한 것을 보았지만 해당 기술에 대해서는 말할 수 없었습니다.
Doug Chamberlain

내 예제에서 : active 및 : hover 규칙을 전환했는데 아무 일도하지 않는 것 같습니다.
Elias Zamaria

37
@ mikez302 : 의사 :active클래스를 사용합니다 . 그것은 작동해야하지만 일부 브라우저에서는 작동하도록 작은 해킹이 필요 다음에 이벤트 핸들러를 첨부 touchstart몸에 이벤트 (예를 : <body ontouchstart="">)
gion_13

5
마지막 답변에서 @ mikez302 코멘트를 만지 자면,이 기사로 연결되는 HTML5 Mobile Boilerplate의 깔끔한 수정입니다 -alxgbsn.co.uk/2011/10/17/…
Giles Butler

21

모바일은 호버 피드백을 제공하지 않기 때문에 사용자로서 링크를 탭하면 즉각적인 피드백을보고 싶습니다. 나는 그것이 -webkit-tap-highlight-color가장 빨리 응답 한다는 것을 알았습니다 (주관적).

다음을 몸에 추가하면 링크가 탭 효과를 갖습니다.

body {
    -webkit-tap-highlight-color: #ccc;
}

이것은 가장 신뢰할 수있는 것처럼 보이지만 가장 좋지는 않습니다. 배경색은 요소에서 약간 확장되어 잠시 동안 더 크게 보입니다.
Adam

@Adam yup, 내가 기억하는 것처럼 그 문제를 해결할 수는 없었지만 이것은 매우 큰 거래가 아니 었습니다. 특히 사용자가 클릭 한 피드백을받을 수 있다는 것입니다 (즉, 이 시간 동안 그들에게 중요한 것)
Abdo

실제로 함수를 document.ontouchstart 이벤트 (jQuery를 통해)에 바인딩하고 빈 콜백을 사용하여 결국 작동하는 : active 의사 스타일을 얻었습니다.
Adam

나쁜 생각은 아닙니다 :-) 나는이 목적을 위해 자바 스크립트를 모두 피했습니다.
Abdo

2
그냥 그 공유 -webkit-tap-highlight-colorA는 비 표준 CSS 기능 , 내가 사용 :active하는 대신, 정말 맞는 & 의미가 있습니다.
Ricardo Fornes 2011

0

모바일 터치 스크린 버튼 스타일링에 문제가있었습니다. 이렇게하면 호버 스틱 / 활성 버튼 문제가 해결됩니다.

body, html {
  width: 600px;
}
p {
  font-size: 20px;
}

button {
  border: none;
  width: 200px;
  height: 60px;
  border-radius: 30px;
  background: #00aeff;
  font-size: 20px;
}

button:active {
  background: black;
  color: white;
}

.delayed {
  transition: all 0.2s;
  transition-delay: 300ms;
}

.delayed:active {
  transition: none;
}
<h1>Sticky styles for better touch screen buttons!</h1>

<button>Normal button</button>

<button class="delayed"><a href="https://www.google.com"/>Delayed style</a></button>

<p>The CSS :active psuedo style is displayed between the time when a user touches down (when finger contacts screen) on a element to the time when the touch up (when finger leaves the screen) occures.   With a typical touch-screen tap interaction, the time of which the :active psuedo style is displayed can be very small resulting in the :active state not showing or being missed by the user entirely.  This can cause issues with users not undertanding if their button presses have actually reigstered or not.</p>

<p>Having the the :active styling stick around for a few hundred more milliseconds after touch up would would improve user understanding when they have interacted with a button.</p>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.