: แตะ CSS หลอกคลาสหรืออะไรที่คล้ายกัน?


87

ฉันกำลังพยายามสร้างปุ่มซึ่งเมื่อผู้ใช้คลิกปุ่มนั้นจะเปลี่ยนรูปแบบขณะที่กดปุ่มเมาส์ค้าง ฉันยังต้องการให้เปลี่ยนรูปแบบในลักษณะเดียวกันหากสัมผัสในเบราว์เซอร์มือถือ สิ่งที่เห็นได้ชัดสำหรับฉันคือการใช้ CSS: active pseudo-class แต่ไม่ได้ผล ฉันพยายาม: โฟกัส แต่มันก็ไม่ได้ผลเช่นกัน ฉันลอง: วางเมาส์เหนือและดูเหมือนจะใช้งานได้ แต่มันยังคงรูปแบบไว้หลังจากที่ฉันเอานิ้วออกจากปุ่ม การสังเกตทั้งหมดนี้อยู่ใน 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>

: คลาสหลอกที่ใช้งานอยู่สำหรับเบราว์เซอร์เดสก์ท็อปและคลาสที่ใช้งานอยู่สำหรับเบราว์เซอร์ระบบสัมผัส

ฉันสงสัยว่ามีวิธีที่ง่ายกว่านี้ไหมโดยไม่ต้องเกี่ยวข้องกับ Javascript


2
เบราว์เซอร์แบบสัมผัสเกือบทุกตัวจัดการสิ่งต่างๆเช่นhoverและmousedown/ mouseupแตกต่างกันซึ่งยากที่จะรองรับได้ทั้งหมด
ชาด

ทั้ง Android และ iOS มี: touchstart,: touchmove,: touchend และ: touchcancel pseudoclasses ที่คุณสามารถใช้ได้
Paul Hanbury

2
ฉันลองตั้งค่ารูปแบบสำหรับ: touchstart และ: touchend pseudo-class แล้วมันใช้ไม่ได้กับ iPhone หรือ Droid @ พอลฮันเบอรีคุณแน่ใจหรือไม่ว่าคุณไม่ได้สับสนคลาสหลอก CSS กับเหตุการณ์ Javascript
Elias Zamaria

1
@ mikez302 - ฉันคิดถูกแล้ว plugins.jquery.com/plugin-tags/touchstart
Doug Chamberlain

2
ฉันจะรู้สึกโง่ที่ส่งสิ่งนี้เป็นคำตอบ แต่อันที่จริงคำตอบคือ "ไม่เป็นไปไม่ได้คุณต้องใช้ Javascript" สิ่งที่คุณขอไม่ได้เป็นส่วนหนึ่งของ CSS2 หรือ CSS3 ฉันคิดว่าความจริงที่ว่า: ใช้งานไม่ได้เป็นปัญหา User-agent ที่คุณอาจรายงานว่าเป็นข้อบกพร่องในเบราว์เซอร์ iOS และ Android แต่เพื่อแก้ปัญหาผู้ใช้ปลายทางของคุณ ... ใช่คุณต้องใช้ JS . คุณสามารถรวมรหัสความเข้ากันได้ของคุณในการตรวจสอบการรองรับการเริ่มต้นระบบสัมผัส
joelhardi

คำตอบ:


51

ไม่มีสิ่งที่เรียกว่า :touchในข้อกำหนด W3C http://www.w3.org/TR/CSS2/selector.html#pseudo-class-selectors

:active ควรจะทำงานฉันคิดว่า

สั่งซื้อได้ที่ :active:hoverคลาส/ pseudo เป็นสิ่งสำคัญสำหรับการทำงานอย่างถูกต้อง

นี่คือคำพูดจากลิงค์ด้านบน

บางครั้งตัวแทนผู้ใช้แบบโต้ตอบเปลี่ยนการแสดงผลเพื่อตอบสนองต่อการกระทำของผู้ใช้ CSS มีคลาสหลอกสามแบบสำหรับกรณีทั่วไป:

  • : hover pseudo-class ใช้ในขณะที่ผู้ใช้กำหนดองค์ประกอบ (ด้วยอุปกรณ์ชี้ตำแหน่งบางอย่าง) แต่ไม่ได้เปิดใช้งาน ตัวอย่างเช่นตัวแทนผู้ใช้แบบวิชวลสามารถใช้คลาสหลอกนี้ได้เมื่อเคอร์เซอร์ (ตัวชี้เมาส์) วางเมาส์เหนือกล่องที่สร้างโดยองค์ประกอบ ตัวแทนผู้ใช้ที่ไม่สนับสนุนสื่อโต้ตอบไม่จำเป็นต้องสนับสนุนคลาสหลอกนี้ ตัวแทนผู้ใช้ที่เป็นไปตามข้อกำหนดบางอย่างที่สนับสนุนสื่อโต้ตอบอาจไม่สามารถรองรับคลาสหลอกนี้ได้ (เช่นอุปกรณ์ปากกา)
  • : คลาสหลอกที่ใช้งานอยู่จะใช้ในขณะที่ผู้ใช้เปิดใช้งานองค์ประกอบ ตัวอย่างเช่นระหว่างเวลาที่ผู้ใช้กดปุ่มเมาส์และปล่อย
  • : focus pseudo-class ใช้ในขณะที่องค์ประกอบมีโฟกัส (ยอมรับเหตุการณ์แป้นพิมพ์หรือรูปแบบอื่น ๆ ของการป้อนข้อความ)

9
ฉันรู้ว่าไม่มีสิ่งเช่น: สัมผัส ฉันสงสัยว่ามีบางอย่างที่คล้ายกัน : แอคทีฟดูสมเหตุสมผล แต่ไม่ได้ผลในการทดสอบของฉัน
Elias Zamaria

@ mikez302 - ฉันคิดว่าคุณรู้ว่าฉันต้องการอ้างอิงแหล่งที่มาของฉัน ฉันเห็นด้วยกับคุณฉันไม่เห็นเหตุผลใด ๆ ที่จะใช้ไม่ได้นอกจากประเด็นของฉันเกี่ยวกับคำสั่งซื้อนั้นสำคัญมาก ฉันเห็นว่ามีคนโพสต์บางอย่างเกี่ยวกับ css pseudo selectors สำหรับ IOS และ Android แต่ฉันไม่สามารถพูดกับเทคโนโลยีเหล่านั้นได้
Doug Chamberlain

ฉันเปลี่ยนกฎ: active และ: hover ในตัวอย่างของฉันและดูเหมือนจะไม่ทำอะไรเลย
Elias Zamaria

37
@ mikez302: ใช้:activepseudoclass มันควรจะทำงาน แต่ในเบราว์เซอร์ที่คุณต้องสับขนาดเล็กที่จะทำให้การทำงาน: แนบตัวจัดการเหตุการณ์กับ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 ใช่ฉันไม่สามารถหลีกเลี่ยงสิ่งนั้นได้อย่างที่ฉันจำได้ แต่สิ่งนี้เป็นเพียงเสี้ยววินาทีไม่ได้ใหญ่เกินไปสำหรับฉันโดยเฉพาะอย่างยิ่งที่จะให้ผู้ใช้ได้รับข้อเสนอแนะที่เขาคลิก (ซึ่งก็คือ สิ่งที่สำคัญสำหรับพวกเขาในช่วงเวลานี้)
Abdo

ฉันได้รับ: รูปแบบหลอกที่ใช้งานอยู่ในตอนท้ายโดยการผูกฟังก์ชันเข้ากับเหตุการณ์ document.ontouchstart (ผ่าน jQuery) โดยมีการโทรกลับที่ว่างเปล่า
Adam

ไม่ใช่ความคิดที่ไม่ดี :-) ฉันหลีกเลี่ยงจาวาสคริปต์ทั้งหมดเพื่อจุดประสงค์นี้
Abdo

2
เพียงแค่แบ่งปันที่-webkit-tap-highlight-colorเป็นคุณสมบัติ CSS ที่ไม่ได้มาตรฐานฉันใช้:activeแทนมันเหมาะและสมเหตุสมผลจริงๆ
Ricardo Fornes

0

ฉันมีปัญหากับรูปแบบปุ่มหน้าจอสัมผัสบนมือถือ วิธีนี้จะแก้ไขปัญหาปุ่ม hover-stick / active

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.