:CSS疑似クラスまたは類似のものに触れますか?


86

ユーザーがボタンをクリックすると、マウスボタンを押している間にスタイルが変わるようにボタンを作成しようとしています。また、モバイルブラウザでタッチした場合も同様にスタイルを変えてほしい。一見明らかなことは、CSS:active疑似クラスを使用することでしたが、それは機能しませんでした。:focusを試しましたが、うまくいきませんでした。:hoverを試してみたところ、うまくいったようですが、ボタンから指を離してもスタイルは保たれていました。これらの観察結果はすべて、iPhone4とDroid2で行われました。

モバイルブラウザ(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
ほとんどすべてのタッチブラウザは、hoverおよびmousedown/のようなものを処理しmouseup、それらすべてに対応するのは困難です。
チャド

AndroidとiOSの両方に、使用できる:touchstart、:touchmove、:touchend、および:touchcancel疑似クラスがあります。
ポールハンバリー

2
:touchstartと:touchendの疑似クラスのスタイルを設定しようとしましたが、iPhoneやDroidでは機能しませんでした。@Paul Hanbury、CSS疑似クラスとJavascriptイベントを混同していないと思いますか?
エリアスザマリア

1
@ mikez302-私はあなたの権利だと思います。 plugins.jquery.com/plugin-tags/touchstart
Doug Chamberlain

2
これを答えとして提出するのはばかげていると思いますが、実際の答えは「いいえ、不可能です。Javascriptを使用する必要があります」です。あなたが求めているのはCSS2やCSS3の一部ではありません。:activeが機能しないという事実は、iOSおよびAndroidブラウザーのバグとして報告される可能性のあるユーザーエージェントの問題だと思いますが、エンドユーザーの問題を解決するためだけに...ええ、JSを使用する必要があります。ontouchstartサポートのチェックで互換性コードをラップすることができます。
joelhardi

回答:


49

:touchW3C仕様、http: //www.w3.org/TR/CSS2/selector.html#pseudo-class-selectorsのようなものはありません

:active うまくいくはずだと思います。

:active/:hover疑似クラスの順序は、正しく機能するために重要です。

上記のリンクからの引用です

インタラクティブなユーザーエージェントは、ユーザーの操作に応じてレンダリングを変更することがあります。CSSは、一般的なケースに3つの疑似クラスを提供します。

  • :hover疑似クラスは、ユーザーが(ポインティングデバイスを使用して)要素を指定しているときに適用されますが、アクティブにはなりません。たとえば、ビジュアルユーザーエージェントは、カーソル(マウスポインタ)が要素によって生成されたボックスの上にあるときに、この疑似クラスを適用できます。インタラクティブメディアをサポートしていないユーザーエージェントは、この疑似クラスをサポートする必要はありません。インタラクティブメディアをサポートする一部の準拠ユーザーエージェントは、この疑似クラスをサポートできない場合があります(ペンデバイスなど)。
  • :active疑似クラスは、要素がユーザーによってアクティブ化されているときに適用されます。たとえば、ユーザーがマウスボタンを押してから離すまでの間に。
  • :focus疑似クラスは、要素にフォーカスがあるときに適用されます(キーボードイベントまたは他の形式のテキスト入力を受け入れます)。

9
:touchのようなものはないことを私は知っていました。似たようなものがあるのか​​しら。:activeは妥当なように見えましたが、私のテストでは機能しませんでした。
エリアスザマリア

@ mikez302-私が私の出典を引用したいとあなたが知っていると思いました。順序が非常に重要であるという私の主張を除いて、それが機能しない理由は見当たらないことに同意します。誰かがIOSとAndroid用のcss疑似セレクターについて何かを投稿しているのを見ましたが、私はそれらのテクノロジーについて話すことができませんでした。
ダグ・チェンバレン

私の例では:activeルールと:hoverルールを切り替えましたが、何も実行されていないようです。
エリアスザマリア

36
@ mikez302:疑似クラスを使用し:activeます。動作するはずですが、一部のブラウザでは、動作させるために小さなハックが必要です。touchstart本体のイベントにイベントハンドラをアタッチします(例:<body ontouchstart="">
gion_13 2012

5
最後の回答の@ mikez302コメントに触れるだけで、この記事にリンクしているHTML5モバイルボイラープレートの適切
Giles Butler

20

モバイルはホバーフィードバックを提供しないので、ユーザーとして、リンクがタップされたときに即座にフィードバックを表示したいと思います。私はそれ-webkit-tap-highlight-colorが最も速く反応することに気づきました(主観的)。

あなたの体に以下を追加すると、あなたのリンクはタップ効果があります。

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

これが最も信頼できるようですが、見栄えがよくありません。背景色が要素から少し伸びているように見え、一瞬大きく見えます。
アダム

@アダムうん、覚えているようにそれを回避することはできなかったが、これはほんの一瞬であることが私にとってそれほど大きな問題ではなかった、特にそれはユーザーがクリックしたフィードバックを得ることができるだろう(この時間の一部の間に彼らにとって重要なこと)
Abdo

私は実際に、空のコールバックを使用して、関数をdocument.ontouchstartイベントに(jQueryを介して)バインドするだけで、最終的に:active疑似スタイルを機能させました。
アダム

悪い考えではありません:-)私はこの目的のためにjavascriptを完全に避けていました。
アブド2014年

2
非標準のCSS機能-webkit-tap-highlight-colorある共有するだけで、代わりに使用しています。これは本当に適合し、理にかなっています。:active
リカルドフォーンズ2017年

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.