การสืบค้นสื่อเพื่อตรวจสอบว่าอุปกรณ์เป็นหน้าจอสัมผัสหรือไม่


122

วิธีใดที่ปลอดภัยที่สุดโดยใช้การสืบค้นสื่อเพื่อให้บางสิ่งเกิดขึ้นเมื่อไม่ได้อยู่บนอุปกรณ์หน้าจอสัมผัส หากไม่มีวิธีใดคุณแนะนำให้ใช้โซลูชัน JavaScript เช่น!window.Touchหรือ Modernizr หรือไม่


2
ก้าวไปข้างหน้าอย่างรวดเร็วในปี 2018 CSS สามารถทำสิ่งนี้ได้แล้วstackoverflow.com/a/50285058/1717735
Buzut

คำตอบ:


37

ฉันขอแนะนำให้ใช้modernizrและใช้คุณสมบัติการสืบค้นสื่อ

if (Modernizr.touch){
   // bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
   // bind to normal click, mousemove, etc
}

อย่างไรก็ตามการใช้ CSS มีคลาสหลอกเช่นใน Firefox คุณสามารถใช้: -moz ระบบเมตริก (สัมผัสที่เปิดใช้งาน) แต่คุณสมบัติเหล่านี้ไม่สามารถใช้ได้กับทุกเบราว์เซอร์

สำหรับอุปกรณ์Appleคุณสามารถใช้งานง่ายๆ:

if(window.TouchEvent) {
   //.....
}

โดยเฉพาะอย่างยิ่งสำหรับ Ipad:

if(window.Touch) {
    //....
}

แต่เหล่านี้ไม่ได้ทำงานบน Android

Modernizrให้ความสามารถในการตรวจจับคุณลักษณะและคุณลักษณะการตรวจจับเป็นวิธีที่ดีในการเขียนโค้ดแทนที่จะเขียนโค้ดบนเบราว์เซอร์

จัดแต่งทรงผม Touch Elements

Modernizer เพิ่มคลาสให้กับแท็ก HTML เพื่อจุดประสงค์นี้ ในกรณีนี้touchและno-touchเพื่อให้คุณสามารถจัดรูปแบบลักษณะที่เกี่ยวข้องกับการสัมผัสของคุณได้โดยนำตัวเลือกของคุณด้วย. touch เช่น.touch .your-container. เครดิต: Ben Swinburne


ฉันคิดถูกไหมว่าไม่มีคลาส psedo ที่ใช้กับอุปกรณ์ / เบราว์เซอร์ที่ทันสมัยทั้งหมดได้หรือไม่?
JJJollyjim

@ JJ56 ใช่ไม่ใช่ทุกเบราว์เซอร์ที่รองรับคลาสหลอกแบบสัมผัส แต่นั่นคือที่ที่modernizrจะสมบูรณ์แบบ :)
Starx

18
การModernizr.touchทดสอบจะระบุว่าเบราว์เซอร์รองรับเหตุการณ์การสัมผัสหรือไม่ซึ่งไม่จำเป็นต้องแสดงถึงอุปกรณ์หน้าจอสัมผัส ตัวอย่างเช่นโทรศัพท์ Palm Pre / WebOS (ระบบสัมผัส) ไม่รองรับเหตุการณ์การสัมผัสจึงไม่ผ่านการทดสอบนี้
numediaweb

5
เพื่อเพิ่มสิ่งนี้หากคุณรวมโมเดิร์นไนเซอร์ไว้ด้วย Modernizer เพิ่มคลาสให้กับแท็กเนื้อหาเพื่อจุดประสงค์นี้ ในกรณีนี้touchและno-touchเพื่อให้คุณสามารถจัดรูปแบบการสัมผัสของคุณด้านที่เกี่ยวข้องโดย prefixing .touchเตอร์ของคุณด้วย เช่น.touch .your-container
Ben Swinburne

2
สำหรับฉันดูเหมือนว่า modernizr จะเพิ่มระดับการสัมผัสให้กับแท็ก html ไม่ใช่แท็กเนื้อหา
Robin Cox

162

มีจริงคุณสมบัติสำหรับการนี้ในส่วนสื่อ CSS4 แบบสอบถามร่าง

คุณลักษณะสื่อ 'ตัวชี้' ใช้เพื่อสอบถามเกี่ยวกับการมีอยู่และความแม่นยำของอุปกรณ์ชี้ตำแหน่งเช่นเมาส์ หากอุปกรณ์มีกลไกการป้อนข้อมูลหลายแบบขอแนะนำให้ UA รายงานลักษณะของอุปกรณ์ชี้ตำแหน่งที่มีความสามารถน้อยที่สุดของกลไกอินพุตหลัก แบบสอบถามสื่อนี้รับค่าต่อไปนี้:

'none'
- กลไกการป้อนข้อมูลของอุปกรณ์ไม่รวมอุปกรณ์ชี้ตำแหน่ง

'หยาบ'
- กลไกการป้อนข้อมูลของอุปกรณ์ประกอบด้วยอุปกรณ์ชี้ตำแหน่งที่มีความแม่นยำ จำกัด

'ดี'
- กลไกการป้อนข้อมูลของอุปกรณ์ประกอบด้วยอุปกรณ์ชี้ตำแหน่งที่ถูกต้อง

สิ่งนี้จะถูกใช้เช่นนี้:

/* 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;
    }
}

ฉันยังพบตั๋วในโครงการ Chromium ที่เกี่ยวข้องกับเรื่องนี้

ความเข้ากันได้เบราว์เซอร์สามารถทดสอบได้ที่quirksmode นี่คือผลลัพธ์ของฉัน (22 มกราคม 2013):

  • Chrome / Win: ใช้งานได้
  • Chrome / iOS: ไม่ทำงาน
  • Safari / iOS6: ไม่ทำงาน

3
นี่จะเป็นคำตอบที่ตรงประเด็นที่สุดได้อย่างไรในเมื่อโซลูชันที่ให้มาใช้ไม่ได้ตามโปสเตอร์
erdomester

5
การรองรับเบราว์เซอร์สำหรับสิ่งนี้ไม่เลวร้ายอีกต่อไป: Edge, Chrome, Safari, iOS และ Android ดู: caniuse.com/#feat=css-media-interaction
Josa

3
คำตอบที่ดี. นอกจากนี้: developer.mozilla.org/en-US/docs/Web/CSS/@media/hover
aross

ใช้ได้ผลสำหรับฉัน;) ขอบคุณสำหรับการวิจัยสิ่งนี้!
Verri

53

โซลูชัน CSS ดูเหมือนจะไม่สามารถใช้งานได้ทั่วไปในช่วงกลางปี ​​2013 แทน...

  1. Nicholas Zakas อธิบายว่า Modernizr ใช้no-touchคลาส CSS เมื่อเบราว์เซอร์ไม่รองรับการสัมผัส

  2. หรือตรวจจับใน JavaScript ด้วยโค้ดง่ายๆช่วยให้คุณสามารถใช้งานโซลูชันแบบ Modernizr ของคุณเองได้:

    <script>
        document.documentElement.className += 
        (("ontouchstart" in document.documentElement) ? ' touch' : ' no-touch');
    </script>
    

    จากนั้นคุณสามารถเขียน CSS ของคุณเป็น:

    .no-touch .myClass {
        ...
    }
    .touch .myClass {
        ...
    }
    

อันที่สองดีมาก มีเสน่ห์สำหรับฉัน! ขอบคุณ
Garavani

@ bjb568 ขอบคุณสำหรับการแก้ไขที่แนะนำซึ่งเป็นทางเลือกที่ทันสมัยกว่า แต่เนื่องจากใช้ได้เฉพาะใน IE 10 ขึ้นไปฉันจึงคิดว่าควรเก็บเวอร์ชันนี้ไว้ในขณะนี้
Simon East

ดูเหมือนคลาสนั้นจะอยู่บนแท็ก html ซึ่งหมายความว่าจะปิดใช้งานโดยค่าเริ่มต้นเมื่อใช้ CSP
ลีโอ

36

ประเภทสื่อไม่อนุญาตให้คุณตรวจจับความสามารถในการสัมผัสซึ่งเป็นส่วนหนึ่งของมาตรฐาน:

http://www.w3.org/TR/css3-mediaqueries/

ดังนั้นไม่มีวิธีใดที่จะทำได้อย่างสม่ำเสมอผ่าน CSS หรือแบบสอบถามสื่อคุณจะต้องใช้ JavaScript

ไม่จำเป็นต้องใช้ Modernizr คุณสามารถใช้ JavaScript ธรรมดา:

<script type="text/javascript">
    var is_touch_device = 'ontouchstart' in document.documentElement;
    if(is_touch_device) alert("touch is enabled!");
</script>

AFAIK window.touch&& window.TouchEventใช้ได้กับอุปกรณ์ Apple เท่านั้น
Starx

22
@vsync Modernizr เป็นวิธีที่ยอดเยี่ยมในการทดสอบทั้งหมดที่เป็นประโยชน์สำหรับนักพัฒนาในไลบรารีที่ซ่อนอยู่เพื่อให้พวกเขาไม่ต้องไปที่ Google ทุกครั้งที่ต้องทดสอบคุณลักษณะเฉพาะเช่นเหตุการณ์การสัมผัสและการค้นหาหน้านี้ FYI มีโครงสร้าง Modernizr แบบกำหนดเองที่คุณสามารถปรับแต่งตามการทดสอบที่คุณต้องการได้ เป็นวิธีที่ยอดเยี่ยมในการทดสอบฟีเจอร์ด้วยวิธีเดียวกันระหว่างโปรเจ็กต์ไม่ว่าคุณจะใช้ไวยากรณ์ JS (เช่น Modernizr.touch) หรือคลาส CSS (.touch .my-element {}) ฉันคิดว่ามันเป็นการดูถูกสติปัญญาของมนุษย์ที่ไม่ตระหนักว่าเราสามารถทำสิ่งต่างๆได้โดยไม่ต้องสร้างวงล้อใหม่ทุกครั้ง
Alejandro García Iglesias

11
ฉันทำงานในหลายร้อยโครงการและฉันไม่เคยต้องการสิ่งนี้เลยในกรณีส่วนใหญ่สิ่งที่คุณต้องการคือชุดการทดสอบขนาดเล็กมากไม่เกิน 5 ที่ฉันจะพูด (ในกรณีส่วนใหญ่) ดังนั้นเพียงแค่ค้นหา 5 เหล่านั้นและใส่ไว้ในโค้ดของคุณโดยตรงไม่จำเป็นต้องไปที่เว็บไซต์ Modernizer สร้างแบบกำหนดเองรวมไว้ในเพจของคุณหรืออะไรก็ตาม นักพัฒนาไม่ควรขี้เกียจ นักพัฒนาเว็บควรมีความคิดที่ว่า "ฉันจะทำให้โค้ดเบาลงได้อย่างไร" .. IMHO และประสบการณ์หลายปี นักพัฒนาในปัจจุบันดูเหมือนจะชอบรวมถึงสคริปต์มากมาย: /
vsync

2
บางคนบอกว่าขี้เกียจ ฉันบอกว่าทำไมต้องสร้างล้อใหม่? จะเกิดอะไรขึ้นเมื่ออุปกรณ์ / เวอร์ชัน / แพลตฟอร์มใหม่ปรากฏขึ้นและกรณีพิเศษของคุณจำเป็นต้องเปลี่ยน? คุณก) พยายามหารหัสตรวจจับกรณีพิเศษด้วยตัวคุณเองและย้อนกลับไปยังรหัสที่กำหนดเองของคุณนำกลับมาใช้ใหม่ในกระบวนการหรือ b) ดาวน์โหลด Modernizr เวอร์ชันล่าสุดแล้ววางลงใน? ฉันรู้ว่าฉันจะทำอะไร +1 ถึง GarciaWebDev
Sc0ttyD

@ Sc0ttyD ความชอบส่วนตัวของฉันคือการเรียนรู้การเขียนโค้ดในขั้นต้นโดยไม่ขึ้นอยู่กับไลบรารีเช่น Modernizr วันหนึ่งคุณอาจต้องเป็นคนที่เข้ารหัสอุปกรณ์ใหม่และคุณไม่อยากติดอยู่เพราะคุณไม่สามารถทำได้หากไม่มีห้องสมุด ไม่ต้องพูดถึงอาจมีคนจำนวนมากที่ไม่มีเวลาในการทำงานเพื่อเรียนรู้ห้องสมุดใหม่
Alex W

28

ในปี 2560 การสืบค้นสื่อ CSS จากคำตอบที่สองยังใช้ไม่ได้กับ Firefox ฉันพบโซลูตันสำหรับสิ่งนั้น: -moz-touch-enabled


ดังนั้นนี่คือแบบสอบถามสื่อข้ามเบราว์เซอร์:

@media (-moz-touch-enabled: 1), (pointer:coarse) {
    .something {
        its: working;
    }
}

ควรจะสูงขึ้นและคำตอบที่ได้รับอนุมัติ firefox กำลังดำเนินการตามข้อกำหนดดังนั้น-moz-touch-enabledจะไม่จำเป็นในเร็ว ๆ นี้
Dogoku


@ user3445853 OP ถามวิธีตรวจจับ (ผ่านการสืบค้นสื่อ) อุปกรณ์ด้วยหน้าจอสัมผัส หากกฎ "(ตัวชี้: ไม่มี)" เป็นจริงแสดงว่าอุปกรณ์นั้นไม่มีหน้าจอสัมผัสอย่างแน่นอน แต่ควรมีคนยืนยันความคิดเห็นของฉัน (หรือไม่) :)
Sokołow

-moz-touch-enabledไม่ได้รับการสนับสนุนใน Firefox 58+ เช่นเดียวกับโซลูชันนี้ไม่ครอบคลุม Firefox 58-63 (เนื่องจาก Firefox 64+ รองรับการสืบค้นตัวชี้) ที่มา: developer.mozilla.org/en-US/docs/Web/CSS/@media/…
fgblomqvist

24

มีแบบสอบถามสื่อสำหรับสิ่งนั้นจริงๆ:

@media (hover: none) {  }

นอกเหนือจาก Firefox ก็สนับสนุนค่อนข้างดี Safari และ Chrome เป็นเบราว์เซอร์ที่พบบ่อยที่สุดในอุปกรณ์เคลื่อนที่ซึ่งอาจเพียงพอสำหรับการนำไปใช้งานมากขึ้น


2
... และการสนับสนุนที่จะเกิดขึ้นในสัปดาห์ต่อ ๆ ไปสำหรับ FF เช่นกัน
retrovertigo

5

วิธีนี้จะได้ผล ถ้ามันไม่แจ้งให้เราทราบ

@media (hover: none) and (pointer: coarse) {
    /* Touch screen device style goes here */
}

แก้ไข: ไม่รองรับการวางเมาส์เหนือความต้องการอีกต่อไป


3

โซลูชันนี้จะใช้งานได้จนกว่า CSS4 จะได้รับการสนับสนุนทั่วโลกโดยเบราว์เซอร์ทั้งหมด เมื่อถึงวันนั้นให้ใช้ CSS4 แต่ก่อนหน้านี้สิ่งนี้ใช้ได้กับเบราว์เซอร์ปัจจุบัน

เบราว์เซอร์ util.js

export const isMobile = {
  android: () => navigator.userAgent.match(/Android/i),
  blackberry: () => navigator.userAgent.match(/BlackBerry/i),
  ios: () => navigator.userAgent.match(/iPhone|iPad|iPod/i),
  opera: () => navigator.userAgent.match(/Opera Mini/i),
  windows: () => navigator.userAgent.match(/IEMobile/i),
  any: () => (isMobile.android() || isMobile.blackberry() || 
  isMobile.ios() || isMobile.opera() || isMobile.windows())
};

onload:

วิธีเก่า:

isMobile.any() ? document.getElementsByTagName("body")[0].className += 'is-touch' : null;

วิธีที่ใหม่กว่า:

isMobile.any() ? document.body.classList.add('is-touch') : null;

โค้ดด้านบนจะเพิ่มคลาส "is-touch" ลงในแท็ก body หากอุปกรณ์มีหน้าจอสัมผัส ตอนนี้ตำแหน่งใดก็ได้ในเว็บแอปพลิเคชันของคุณที่คุณจะมี css for: hover คุณสามารถโทรได้body:not(.is-touch) the_rest_of_my_css:hover

ตัวอย่างเช่น:

button:hover

กลายเป็น:

body:not(.is-touch) button:hover

โซลูชันนี้หลีกเลี่ยงการใช้ modernizer เนื่องจาก modernizer lib เป็นไลบรารีที่ใหญ่มาก หากสิ่งที่คุณพยายามทำคือตรวจจับหน้าจอสัมผัสสิ่งนี้จะดีที่สุดเมื่อขนาดของแหล่งที่รวบรวมขั้นสุดท้ายเป็นข้อกำหนด


0

การเพิ่มหน้าจอสัมผัสของคลาสให้กับเนื้อหาโดยใช้ JS หรือ jQuery

  //allowing mobile only css
    var isMobile = ('ontouchstart' in document.documentElement && navigator.userAgent.match(/Mobi/));
    if(isMobile){
        jQuery("body").attr("class",'touchscreen');
    }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.