วิธีลบ / ละเว้น: วางเมาส์เหนือสไตล์ css บนอุปกรณ์สัมผัส


152

ฉันต้องการเพิกเฉยต่อ:hoverการประกาศ CSS ทั้งหมดหากผู้ใช้เยี่ยมชมเว็บไซต์ของเราผ่านอุปกรณ์สัมผัส เนื่องจาก:hoverCSS ไม่สมเหตุสมผลและยังอาจรบกวนได้หากแท็บเล็ตทริกเกอร์เมื่อคลิก / แตะเพราะอาจติดค้างจนองค์ประกอบสูญเสียโฟกัส พูดตามตรงฉันไม่รู้ว่าทำไมอุปกรณ์ระบบสัมผัสจึงรู้สึกว่าจำเป็นต้องกระตุ้น:hoverตั้งแต่แรก - แต่นี่คือความจริงดังนั้นปัญหานี้ก็เป็นความจริงเช่นกัน

a:hover {
   color:blue;
   border-color:green;
   // etc. > ignore all at once for touch devices
}

ดังนั้น (วิธี) ฉันจะลบ / เพิกเฉยต่อ:hoverการประกาศCSS ทั้งหมดในครั้งเดียว (โดยไม่ต้องรู้แต่ละรายการ) สำหรับอุปกรณ์สัมผัสหลังจากที่มีการประกาศ


สิ่งนี้คล้ายกับวิธีป้องกันเอฟเฟกต์การเลื่อนแบบเหนียวสำหรับปุ่มบนอุปกรณ์สัมผัส - อย่างไรก็ตามโดยทั่วไปมากกว่า
Simon Ferndriger

1
ฉันแก้ไขปัญหานี้ด้วยโซลูชัน php ที่ฉันค้นพบว่าอุปกรณ์การดูเป็นอุปกรณ์เคลื่อนที่หรือไม่และใช้สไตล์ชีตที่ถูกต้องพร้อมการเปลี่ยนแปลงต่างๆตามนั้น นั่นไม่ได้ตอบคำถามของคุณว่า คุณสามารถใช้การสืบค้น @media ได้ แต่ไม่รับประกันว่าจะใช้งานได้เมื่อโทรศัพท์และแท็บเล็ตมีความละเอียดแบบ Full HD
TomFirth

คำตอบ:


5

2020 Solution - CSS เท่านั้น - ไม่มี Javascript

ใช้โฮเวอร์สื่อกับตัวชี้สื่อจะช่วยให้พวกคุณแก้ไขปัญหานี้ได้ ทดสอบบน Chrome เว็บและมือถือ Android ฉันรู้จักคำถามเก่า ๆ นี้ แต่ไม่พบคำตอบแบบนี้

@media (hover: hover) and (pointer: fine) {
  a:hover { color: red; }
}
<a href="#" >Some Link</a>


181

tl; dr ใช้สิ่งนี้: https://jsfiddle.net/57tmy8j3/

หากคุณสนใจว่าทำไมหรือมีตัวเลือกอะไรอีกบ้างอ่านต่อ

Quick'n'dirty - ลบ: วางเมาส์เหนือสไตล์โดยใช้ JS

คุณสามารถลบกฎ CSS ทั้งหมดที่มี:hoverโดยใช้ Javascript สิ่งนี้มีข้อดีคือไม่ต้องแตะ CSS และเข้ากันได้แม้กับเบราว์เซอร์รุ่นเก่า

function hasTouch() {
  return 'ontouchstart' in document.documentElement
         || navigator.maxTouchPoints > 0
         || navigator.msMaxTouchPoints > 0;
}

if (hasTouch()) { // remove all the :hover stylesheets
  try { // prevent exception on browsers not supporting DOM styleSheets properly
    for (var si in document.styleSheets) {
      var styleSheet = document.styleSheets[si];
      if (!styleSheet.rules) continue;

      for (var ri = styleSheet.rules.length - 1; ri >= 0; ri--) {
        if (!styleSheet.rules[ri].selectorText) continue;

        if (styleSheet.rules[ri].selectorText.match(':hover')) {
          styleSheet.deleteRule(ri);
        }
      }
    }
  } catch (ex) {}
}

ข้อ จำกัด : สไตล์ชีตต้องโฮสต์บนโดเมนเดียวกัน (ซึ่งหมายความว่าไม่มี CDN) ปิดใช้งานการวางเมาส์บนอุปกรณ์เมาส์และสัมผัสแบบผสมเช่น Surface หรือ iPad Pro ซึ่งทำให้ UX เสียหาย

CSS เท่านั้น - ใช้แบบสอบถามสื่อ

วางกฎ: โฮเวอร์ของคุณทั้งหมดใน@mediaบล็อก:

@media (hover: hover) {
  a:hover { color: blue; }
}

หรือแทนที่กฎโฮเวอร์ทั้งหมดของคุณ (เข้ากันได้กับเบราว์เซอร์รุ่นเก่า):

a:hover { color: blue; }

@media (hover: none) {
  a:hover { color: inherit; }
}

ข้อ จำกัด : ใช้งานได้เฉพาะบน iOS 9.0+, Chrome สำหรับ Android หรือ Android 5.0+ เมื่อใช้ WebView hover: hoverแบ่งผลการวางเมาส์บนเบราว์เซอร์รุ่นเก่าhover: noneจำเป็นต้องแทนที่กฎ CSS ที่กำหนดไว้ก่อนหน้านี้ทั้งหมด ทั้งสองอย่างเข้ากันไม่ได้กับอุปกรณ์เมาส์และสัมผัสแบบผสมเข้ากันได้กับอุปกรณ์เมาส์และสัมผัสผสม

แข็งแกร่งที่สุด - ตรวจจับการสัมผัสผ่าน JS และนำหน้า CSS: hover rules

วิธีนี้ต้องมีการกำหนดกฎโฮเวอร์body.hasHoverไว้ล่วงหน้าด้วย (หรือชื่อชั้นเรียนที่คุณเลือก)

body.hasHover a:hover { color: blue; }

hasHoverชั้นอาจจะเพิ่มการใช้hasTouch()จากตัวอย่างแรก:

if (!hasTouch()) document.body.className += ' hasHover'

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

function watchForHover() {
  // lastTouchTime is used for ignoring emulated mousemove events
  let lastTouchTime = 0

  function enableHover() {
    if (new Date() - lastTouchTime < 500) return
    document.body.classList.add('hasHover')
  }

  function disableHover() {
    document.body.classList.remove('hasHover')
  }

  function updateLastTouchTime() {
    lastTouchTime = new Date()
  }

  document.addEventListener('touchstart', updateLastTouchTime, true)
  document.addEventListener('touchstart', disableHover, true)
  document.addEventListener('mousemove', enableHover, true)

  enableHover()
}

watchForHover()

สิ่งนี้ควรใช้งานได้โดยทั่วไปในเบราว์เซอร์ใด ๆ และเปิด / ปิดใช้งานสไตล์โฮเวอร์ตามต้องการ

นี่คือตัวอย่างฉบับเต็ม - modern: https://jsfiddle.net/57tmy8j3/
Legacy (สำหรับใช้กับเบราว์เซอร์เก่า): https://jsfiddle.net/dkz17jc5/19/


ขอบคุณ! เพียงความคิดเห็นเดียว: จะไม่ดีกว่าถ้าตรวจสอบก่อนว่า document.styleSheetsมีอยู่แทนที่จะใช้try/catch?
Simon Ferndriger

1
ฉันเคยใช้try/catchในกรณีที่มีข้อผิดพลาดแปลก ๆ ปรากฏขึ้นซึ่งอาจทำให้สคริปต์ทำงานผิดพลาดเช่น deleteRule ไม่ทำงานเนื่องจากนโยบายต้นกำเนิดเดียวกันหรือการสนับสนุนที่ไม่สม่ำเสมอบน IE (แก้ไขความคิดเห็นเพื่อแสดงถึงสิ่งนั้น) แต่ส่วนใหญ่แล้วการตรวจสอบง่ายๆก็น่าจะเพียงพอแล้ว
ใบมีด

1
เป็นมูลค่าการกล่าวขวัญว่าเบราว์เซอร์เดสก์ท็อปรวมถึง Firefox จะไม่ส่งผลให้ 'notouch' พวกเขารายงานว่าเข้าใจเหตุการณ์การสัมผัส
Harry B

3
วิธีนี้ใช้ไม่ได้กับอุปกรณ์แบบผสมที่การวางเมาส์จะใช้งานได้กับเมาส์ แต่ใช้ไม่ได้กับเหตุการณ์การสัมผัส
nbar

2
@ Haneev ถูกต้องสำหรับกรณีส่วนใหญ่แม้ว่าจะไม่ใช่สำหรับกรณีเฉพาะของคุณ การทำให้กฎของคุณใช้งานได้จะเพิ่มความซับซ้อนให้กับโค้ดซึ่งจะทำให้คำตอบเข้าใจยากขึ้น ฉันขอแนะนำให้แยกกฎหรือใช้วิธีแก้ปัญหาที่ 2 ซึ่งมีประสิทธิภาพมากกว่า อย่างไรก็ตามคุณสามารถแนะนำการแก้ไขได้หากคุณสามารถปรับปรุงโซลูชันแรกโดยไม่ทำให้ซับซ้อนเกินไป
ใบมีด

47

การปรับตัวชี้เพื่อช่วยเหลือ!

เนื่องจากยังไม่ได้สัมผัสสิ่งนี้ในชั่วขณะหนึ่งคุณสามารถใช้:

a:link, a:visited {
   color: red;
}

a:hover {
   color:blue;
}

@media (hover: none) {
   a:link, a:visited {
      color: red;
   }
}

ดูนี้สาธิตทั้งในเบราว์เซอร์เดสก์ทอปของคุณและเบราว์เซอร์มือถือของคุณ สนับสนุนโดยอุปกรณ์สัมผัสที่ทันสมัย

หมายเหตุ : โปรดทราบว่าเนื่องจากอินพุตหลัก (ความสามารถ) ของ Surface PC เป็นเมาส์จึงกลายเป็นลิงก์สีน้ำเงินแม้ว่าจะเป็นหน้าจอแยก (แท็บเล็ต) ก็ตาม เบราว์เซอร์จะ (ควร) ตั้งค่าเริ่มต้นให้เป็นความสามารถของอินพุตที่แม่นยำที่สุดเสมอ


ขอบคุณวิธีนี้จะสะดวก! อย่างไรก็ตามฉันลองใช้ Chrome ในโหมดมือถือแล้ว แต่ก็ไม่ได้ผล - เมื่อฉัน "แตะ" มันก็เป็นสีน้ำเงินอยู่ดี ...
Simon Ferndriger

1
@SimonFerndriger นั่นเป็นเพียงข้อ จำกัด ของ Chrome devtools ลองเปิดลิงก์ในอุปกรณ์ระบบสัมผัสเท่านั้น
Jason T Featheringham

1
ทำงานได้อย่างสมบูรณ์แบบบน iPad Chrome / Safari เทียบกับ OS X Chrome / Safari ขอบคุณ! ในที่สุดวิธีแก้ปัญหาที่สวยงามที่คุณต้องการสำหรับปัญหาภาพเล็ก ๆ เช่นนี้
rakaloof

3
ฉันเพิ่งลองใช้กับ iPhone 6S จริงที่ใช้ iOS 11 และลิงก์กลายเป็นสีน้ำเงิน
Lukas Petr

1
ลองสิ่งนี้ด้วย Nexus 5X ที่ใช้ Android 8.1.0 และ Chrome 68.0.3440.91 ลิงก์เปลี่ยนเป็นสีน้ำเงิน
Trevin Avery

14

ฉันพบปัญหาเดียวกัน (ในกรณีของฉันกับเบราว์เซอร์มือถือ Samsung) ดังนั้นฉันจึงสะดุดกับคำถามนี้

ขอบคุณคำตอบของ Calsalฉันพบบางสิ่งที่ฉันเชื่อว่าจะยกเว้นเบราว์เซอร์เดสก์ท็อปเกือบทั้งหมดเนื่องจากเบราว์เซอร์มือถือที่ฉันลองใช้ดูเหมือนว่าจะรู้จัก (ดูภาพหน้าจอจากตารางที่รวบรวม: ตารางการตรวจจับคุณสมบัติตัวชี้ CSS )

เอกสารบนเว็บ MDNระบุว่า

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

.

สิ่งที่ฉันค้นพบคือตัวชี้: หยาบคือสิ่งที่เบราว์เซอร์เดสก์ท็อปทั้งหมดไม่รู้จักในตารางที่แนบมา แต่เป็นที่รู้จักในเบราว์เซอร์มือถือทั้งหมดในตารางเดียวกัน ตัวเลือกนี้ดูเหมือนจะมีประสิทธิภาพมากที่สุดเนื่องจากค่าคีย์เวิร์ดตัวชี้อื่น ๆ ทั้งหมดให้ผลลัพธ์ที่ไม่สอดคล้องกัน

ดังนั้นคุณสามารถสร้างแบบสอบถามสื่อเช่นCalsalอธิบาย แต่แก้ไขเล็กน้อย ใช้ตรรกะย้อนกลับเพื่อแยกแยะอุปกรณ์สัมผัสทั้งหมด

Sass mixin:

@mixin hover-supported {    
    /* 
     * https://developer.mozilla.org/en-US/docs/Web/CSS/@media/pointer 
     * coarse: The primary input mechanism includes a pointing device of limited accuracy.
     */
    @media not all and (pointer: coarse) {
        &:hover {
            @content;
        }
    }
}

a {
    color:green;
    border-color:blue;

    @include hover-supported() {
        color:blue;
        border-color:green;
    }
}

CSS ที่รวบรวม:

a {
  color: green;
  border-color: blue;
}
@media not all and (pointer: coarse) {
  a:hover {
    color: blue;
    border-color: green;
  }
}

นอกจากนี้ยังอธิบายไว้ในส่วนสำคัญที่ฉันสร้างขึ้นหลังจากการวิจัยปัญหา Codepenสำหรับการวิจัยเชิงประจักษ์

UPDATE : ในฐานะของการเขียนโปรแกรมปรับปรุงนี้ 2018/08/23 และแหลมออกโดย @DmitriPavlutin เทคนิคนี้ไม่น่าที่จะทำงานร่วมกับสก์ท็อปของ Firefox


ขอบคุณ @DmitriPavlutin ตามตาราง (เมื่อรวบรวม) ควร แต่ฉันสามารถดูอีกครั้ง
ProgrammerPer

@DmitriPavlutin คุณพูดถูกจริงๆ จะอัปเดตคำตอบ
ProgrammerPer

1
คุณหมายความว่ามันใช้ไม่ได้บนเดสก์ท็อป Firefox หากใช้กับอุปกรณ์สัมผัสโดยเฉพาะ? มันใช้งานได้ดีกับทุกสิ่งที่ฉันพยายาม
FuzzeeLowgeek

@FuzzeeLowgeek ฟังดูดี! ครั้งล่าสุดที่ฉันตรวจสอบคือ 2018-08-23 ดังนั้นหากคุณสามารถยืนยันได้อย่างแน่นอนฉันอาจอัปเดตคำตอบได้อีกครั้ง?
ProgrammerPer

13

ตามคำตอบของ Jasonเราสามารถจัดการได้เฉพาะอุปกรณ์ที่ไม่รองรับการวางเมาส์เหนือข้อความค้นหาสื่อ css เท่านั้น นอกจากนี้เรายังสามารถระบุเฉพาะอุปกรณ์ที่รองรับการวางเมาส์เช่นคำตอบของ moogalในคำถามที่คล้ายกันด้วย @media not all and (hover: none)ในคำถามที่คล้ายกันด้วยมันดูแปลก แต่ใช้งานได้

ฉันทำส่วนผสม Sass จากสิ่งนี้เพื่อให้ใช้งานได้ง่ายขึ้น:

@mixin hover-supported {
    @media not all and (hover: none) {
        &:hover {
            @content;
        }
    }
}

อัปเดต 2019-05-15 : ฉันแนะนำบทความนี้จากสื่อที่กล่าวถึงอุปกรณ์ต่างๆทั้งหมดที่เราสามารถกำหนดเป้าหมายด้วย CSS โดยทั่วไปจะเป็นการผสมผสานระหว่างกฎสื่อเหล่านี้รวมเข้าด้วยกันสำหรับเป้าหมายเฉพาะ:

@media (hover: hover) {
    /* Device that can hover (desktops) */
}
@media (hover: none) {
    /* Device that can not hover with ease */
}
@media (pointer: coarse) {
    /* Device with limited pointing accuracy (touch) */
}
@media (pointer: fine) {
    /* Device with accurate pointing (desktop, stylus-based) */
}
@media (pointer: none) {
    /* Device with no pointing */
}

ตัวอย่างสำหรับเป้าหมายเฉพาะ:

@media (hover: none) and (pointer: coarse) {
    /* Smartphones and touchscreens */
}

@media (hover: hover) and (pointer: fine) {
    /* Desktops with mouse */
}

ฉันชอบมิกซ์อินนี่คือวิธีที่ฉันใช้โฮเวอร์มิกซ์อินเพื่อกำหนดเป้าหมายอุปกรณ์ที่รองรับเท่านั้น:

@mixin on-hover {
    @media (hover: hover) and (pointer: fine) {
        &:hover {
            @content;
        }
    }
}

button {
    @include on-hover {
        color: blue;
    }
}

ซึ่งไม่ได้ผลเลย คุณมีโฮเวอร์: ไม่มีในแบบสอบถามสื่อสำหรับมิกซ์อินที่รองรับการวางเมาส์? คุณต้องการตัวชี้: หยาบตามคำตอบอื่น ๆ ที่นี่
Allan Nienhuis

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

ฉันมีผลลัพธ์ที่ไม่สอดคล้องกับวิธีการ CSS ใน OnePlus 5T ของฉัน (ทั้งใน Chrome และ Firefix) สิ่งนี้ใช้งานได้ดีบน iOS แต่ฉันไม่สามารถใช้งานกับ OnePlus ได้ ฉันทดสอบอย่างละเอียดโดยใช้ตัวชี้ใด ๆ และแบบใด ๆ
Zeth

6

ฉันกำลังเผชิญกับปัญหาที่คล้ายกันในขณะนี้

มีสองตัวเลือกหลักที่เกิดขึ้นกับฉันทันที: (1) การตรวจสอบสตริงผู้ใช้หรือ (2) การดูแลเพจบนมือถือแยกกันโดยใช้ URL อื่นและให้ผู้ใช้เลือกสิ่งที่ดีกว่าสำหรับพวกเขา

  1. หากคุณสามารถใช้ภาษาเทปพันสายอินเทอร์เน็ตเช่น PHP หรือ Ruby คุณสามารถตรวจสอบสตริงผู้ใช้ของอุปกรณ์ที่ขอเพจและแสดงเนื้อหาเดียวกัน แต่ใช้<link rel="mobile.css" />รูปแบบปกติแทน

สตริงของผู้ใช้มีการระบุข้อมูลเกี่ยวกับเบราว์เซอร์ตัวแสดงผลระบบปฏิบัติการ ฯลฯ ทั้งนี้ขึ้นอยู่กับคุณที่จะตัดสินใจว่าอุปกรณ์ใดเป็น "ระบบสัมผัส" กับไม่ใช่การสัมผัส คุณอาจสามารถหาข้อมูลนี้ได้จากที่ใดที่หนึ่งและจับคู่ข้อมูลลงในระบบของคุณ

ตอบหากคุณได้รับอนุญาตให้เพิกเฉยต่อเบราว์เซอร์เก่าคุณเพียงแค่เพิ่มกฎข้อเดียวใน css ปกติที่ไม่ใช่มือถือกล่าวคือ: แก้ไข : Erk หลังจากทำการทดลองบางอย่างฉันค้นพบกฎด้านล่างนี้ยังปิดใช้ความสามารถในการติดตามลิงก์ในเบราว์เซอร์ของเว็บคิทนอกเหนือจากการทำให้เอฟเฟกต์ด้านสุนทรียภาพถูกปิดใช้งาน - ดูhttp://jsfiddle.net/3nkcdeao/
ดังนั้นคุณจะมี เพื่อให้สามารถเลือกวิธีแก้ไขกฎสำหรับเคสมือถือได้ดีกว่าที่ฉันแสดงไว้ที่นี่ แต่อาจเป็นจุดเริ่มต้นที่เป็นประโยชน์:

* { 
    pointer-events: none !important; /* only use !important if you have to */
}

ในฐานะที่เป็น sidenote :hoverให้ปิดการใช้งานตัวชี้เหตุการณ์ผู้ปกครองแล้วอย่างชัดเจนทำให้พวกเขาเกี่ยวกับเด็กในปัจจุบันทำให้เกิดการเลื่อน-ผลกระทบต่อผู้ปกครองที่จะกลายเป็นใช้งานอีกครั้งถ้าเด็กองค์ประกอบเข้า
ดูhttp://jsfiddle.net/38Lookhp/5/

B. หากคุณกำลังสนับสนุนมรดกเว็บ renderers คุณจะต้องทำบิตการทำงานมากขึ้นตามเส้นของการลบกฎใด ๆ :hoverที่กำหนดรูปแบบพิเศษในช่วง เพื่อประหยัดเวลาของทุกคนคุณอาจต้องการสร้างคำสั่งคัดลอกอัตโนมัติ + sed ing ซึ่งคุณเรียกใช้บนสไตล์ชีตมาตรฐานเพื่อสร้างเวอร์ชันมือถือ ซึ่งจะช่วยให้คุณสามารถเขียน / อัปเดตโค้ดมาตรฐานและขจัดกฎสไตล์ใด ๆ ที่ใช้:hoverสำหรับหน้าเว็บเวอร์ชันมือถือของคุณ

  1. (I) หรือมิฉะนั้นก็จะทำให้ผู้ใช้ของคุณทราบว่าคุณมีm.website.comสำหรับอุปกรณ์มือถือนอกเหนือไปจากคุณwebsite.com แม้ว่าโดเมนย่อยจะเป็นวิธีที่ใช้บ่อยที่สุด แต่คุณยังสามารถปรับเปลี่ยน URL ที่กำหนดได้อื่น ๆ เพื่อให้ผู้ใช้อุปกรณ์เคลื่อนที่เข้าถึงหน้าที่แก้ไขได้ ในขั้นตอนนั้นคุณต้องแน่ใจว่าพวกเขาไม่จำเป็นต้องแก้ไข URL ทุกครั้งที่ไปยังส่วนอื่นของไซต์

อีกครั้งที่นี่คุณอาจสามารถเพิ่มกฎพิเศษหนึ่งหรือสองข้อให้กับสไตล์ชีตหรือถูกบังคับให้ทำบางสิ่งที่ซับซ้อนขึ้นเล็กน้อยโดยใช้sedหรือยูทิลิตี้ที่คล้ายกัน มันน่าจะเป็นวิธีที่ง่ายที่สุดที่จะนำไปใช้: ไม่ใช่กับกฎการจัดแต่งทรงผมของคุณเช่นที่div:not(.disruptive):hover {...คุณจะเพิ่มclass="disruptive"องค์ประกอบที่ทำสิ่งที่น่ารำคาญสำหรับผู้ใช้มือถือโดยใช้ js หรือภาษาเซิร์ฟเวอร์แทนที่จะใช้ CSS

  1. (II) คุณสามารถรวมสองรายการแรกเข้าด้วยกันและ (หากคุณสงสัยว่าผู้ใช้หลงทางไปยังหน้าเวอร์ชันที่ไม่ถูกต้อง) คุณสามารถแนะนำให้พวกเขาเปลี่ยนเข้า / ออกจากหน้าจอประเภทอุปกรณ์เคลื่อนที่หรือเพียงแค่มีลิงก์ที่ใดก็ได้ ช่วยให้ผู้ใช้ปัดไปมา ตามที่ระบุไว้แล้วข้อความค้นหา @media อาจเป็นสิ่งที่ควรใช้ในการพิจารณาสิ่งที่ใช้ในการเยี่ยมชม

  2. (III) หากคุณพร้อมใช้งานโซลูชัน jQuery เมื่อคุณรู้ว่าอุปกรณ์ใด "สัมผัส" แต่ไม่ใช่คุณอาจพบว่าการวางเมาส์เหนือ CSS บนอุปกรณ์หน้าจอสัมผัสมีประโยชน์


pointer-events- ที่น่าตื่นตาตื่นใจ! นั่นคือสิ่งที่ฉันกำลังมองหาขอบคุณมาก!
Simon Ferndriger

1
@SimonFerndriger ฉันหวังว่ามันจะเป็นประโยชน์ต่อไป ให้แน่ใจว่าได้ทราบ caveat ที่ทันสมัยเพื่อเชื่อมโยงอาจจะไม่สามารถเข้าถึงได้ภายใต้<a> pointer-events:noneด้วยความโชคดีสิ่งนั้นจะเปลี่ยนไปในภายหลังหรือ CSS 3.x หรือ 4.0+ จะมีpointer-events:navigation-onlyหรือคล้ายกัน
ไม่ค่อยต้องการ 'Where's Monica'

6

ลองสิ่งนี้:

@media (hover:<s>on-demand</s>) {
    button:hover {
        background-color: #color-when-NOT-touch-device;
    }
}

อัปเดต: ขออภัย W3C ได้ลบคุณสมบัตินี้ออกจากข้อกำหนด ( https://github.com/w3c/csswg-drafts/commit/2078b46218f7462735bb0b5107c9a3e84fb4c4b1 )


นี่จะช่วยแก้ปัญหาได้อย่างแน่นอน ฉันไม่เคยได้ยินเรื่องนี้มาก่อน สิ่งนี้ควรจะใช้งานได้ในเบราว์เซอร์เวอร์ชันใด
Simon Ferndriger

3
@SimonFerndriger caniuse.com/#feat=css-media-interactionและข้อมูลเพิ่มเติม: dev.opera.com/articles/media-features
Skeptic

ดี ... มันไม่รองรับเบราว์เซอร์ที่กว้างขวาง
Giacomo Paita

เจ๋งมาก! ขอบคุณสำหรับวิธีแก้ปัญหาที่สะดวกเช่นนี้ ฉันหวังว่ามันจะถูกเพิ่มในมาตรฐาน W3C
GProst

ดีใจที่ช่วยได้ ^^
Marouen Mhiri

5

คุณสามารถใช้Modernizr JS (ดูคำตอบ StackOverflowนี้ด้วย) หรือสร้างฟังก์ชัน JS แบบกำหนดเอง:

function is_touch_device() {
 return 'ontouchstart' in window        // works on most browsers 
  || navigator.maxTouchPoints;       // works on IE10/11 and Surface
};

if ( is_touch_device() ) {
  $('html').addClass('touch');
} else {
  $('html').addClass('no-touch');
} 

เพื่อตรวจจับการสนับสนุนของเหตุการณ์การสัมผัสในเบราว์เซอร์จากนั้นกำหนดCSSคุณสมบัติปกติข้ามผ่านองค์ประกอบด้วยhtml.no-touchคลาสดังนี้

html.touch a {
    width: 480px;
}

/* FOR THE DESKTOP, SET THE HOVER STATE */
html.no-touch a:hover {
   width: auto;
   color:blue;
   border-color:green;
}

ที่แนะนำโดย @blade - อย่างไรก็ตามการใช้htmlแท็กแทนbodyแท็กอาจทำให้อ่านได้ดีขึ้นเล็กน้อย นั่นเป็นวิธีแก้ปัญหาที่ฉันกำลังใช้อยู่ ขอบคุณต่อไป.
Simon Ferndriger

1

มันมีประโยชน์สำหรับฉัน: ลิงค์

function hoverTouchUnstick() {
    // Check if the device supports touch events
    if('ontouchstart' in document.documentElement) {
        // Loop through each stylesheet
        for(var sheetI = document.styleSheets.length - 1; sheetI >= 0; sheetI--) {
            var sheet = document.styleSheets[sheetI];
            // Verify if cssRules exists in sheet
            if(sheet.cssRules) {
                // Loop through each rule in sheet
                for(var ruleI = sheet.cssRules.length - 1; ruleI >= 0; ruleI--) {
                    var rule = sheet.cssRules[ruleI];
                    // Verify rule has selector text
                    if(rule.selectorText) {
                        // Replace hover psuedo-class with active psuedo-class
                        rule.selectorText = rule.selectorText.replace(":hover", ":active");
                    }
                }
            }
        }
    }
}

1

นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้เช่นกัน แต่คุณจะต้องผ่าน css ของคุณและเพิ่มไฟล์ .no-touchคลาสก่อนที่จะวางเมาส์เหนือสไตล์ของคุณ

Javascript:

if (!("ontouchstart" in document.documentElement)) {
document.documentElement.className += " no-touch";
}

CSS ตัวอย่าง:

<style>
p span {
    display: none;
}

.no-touch p:hover span {
    display: inline;
}
</style>
<p><a href="/">Tap me</a><span>You tapped!</span></p>

ที่มา

Ps แต่เราควรจำไว้ว่ามีอุปกรณ์ระบบสัมผัสเข้าสู่ตลาดมากขึ้นเรื่อย ๆ ซึ่งรองรับการป้อนข้อมูลด้วยเมาส์ในเวลาเดียวกัน


0

นี่อาจไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์แบบ (และใช้กับ jQuery) แต่อาจเป็นทิศทาง / แนวคิดในการดำเนินการ: แล้วจะทำอย่างไรในทางกลับกัน ซึ่งหมายถึงการปิดใช้งานสถานะ: hover css ตามค่าเริ่มต้นและเปิดใช้งานหากตรวจพบเหตุการณ์ mousemove ที่ใดก็ได้บนเอกสาร แน่นอนว่าจะใช้ไม่ได้หากมีคนปิดการใช้งาน js มีอะไรอีกบ้างที่อาจพูดถึงการทำแบบนี้?

อาจเป็นเช่นนี้:

CSS:

/* will only work if html has class "mousedetected" */
html.mousedetected a:hover {
   color:blue;
   border-color:green;
}

jQuery:

/* adds "mousedetected" class to html element if mouse moves (which should never happen on touch-only devices shouldn’t it?) */
$("body").mousemove( function() {
    $("html").addClass("mousedetected");
});

1
ปัญหาอย่างหนึ่งคือจริงๆแล้วมันก็คือ.
ลากเส้นที่สร้าง

1
และคุณอาจจะเรียกเหตุการณ์นี้ไม่หยุดซึ่งจะส่งผลกระทบต่อประสิทธิภาพ หากวิธีนี้ได้ผลดีกว่าที่คุณควรใช้$('body').one.('mousemove', ...)
Simon Ferndriger

0

ลองสิ่งนี้ (ฉันใช้พื้นหลังและสีพื้นหลังในตัวอย่างนี้):

var ClickEventType = ((document.ontouchstart !== null) ? 'click' : 'touchstart');

if (ClickEventType == 'touchstart') {
            $('a').each(function() { // save original..
                var back_color = $(this).css('background-color');
                var background = $(this).css('background');
                $(this).attr('data-back_color', back_color);
                $(this).attr('data-background', background);
            });

            $('a').on('touchend', function(e) { // overwrite with original style..
                var background = $(this).attr('data-background');
                var back_color = $(this).attr('data-back_color');
                if (back_color != undefined) {
                    $(this).css({'background-color': back_color});
                }
                if (background != undefined) {
                    $(this).css({'background': background});
                }
            }).on('touchstart', function(e) { // clear added stlye="" elements..
                $(this).css({'background': '', 'background-color': ''});
            });
}

css:

a {
    -webkit-touch-callout: none;
    -webkit-tap-highlight-color: transparent;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

0

วิธีสกปรก ... ไม่สวยหรู แต่เป็นวิธีที่ง่ายที่สุดที่สามารถช่วยคุณได้

ลบสิ่งที่แสดงลักษณะของโฮเวอร์

.your-class:hover:before {
  color: blue;
  background: linear-gradient(to bottom, rgba(231,56,39,0) 0%, #aaaaaa 100%);
}

@media all and (min-width:320px) and (max-width: 960px) {
    .your-class:hover:before {
    color: black;
    background: transparent;
  }
}

0

หากปัญหาของคุณคือเมื่อคุณแตะ / แตะบน Android และ div ทั้งหมดปกคลุมด้วยสีโปร่งใสสีน้ำเงิน! จากนั้นคุณต้องเปลี่ยนไฟล์

เคอร์เซอร์: POINTER; ถึง CURSOR: DEFAULT;

ใช้ mediaQuery เพื่อซ่อนในโทรศัพท์มือถือ / แท็บเล็ต

สิ่งนี้ใช้ได้กับฉัน


-1

ลองใช้โซลูชัน jquery 2019 ที่ใช้งานง่ายนี้แม้ว่าจะมีมาสักพักแล้ว

  1. เพิ่มปลั๊กอินนี้ในส่วนหัว:

    src = "https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"

  2. เพิ่มสิ่งนี้ใน js:

    $ ("*"). on ("touchend", function (e) {$ (this) .focus ();}); // ใช้กับทุกองค์ประกอบ

  3. รูปแบบที่แนะนำบางประการ ได้แก่ :

    $ (": input,: checkbox,"). on ("touchend", function (e) {(this) .focus);}); // ระบุองค์ประกอบ

    $ ("*") บน ("click, touchend", function (e) {$ (this) .focus ();}); // รวมเหตุการณ์การคลิก

    css: body {cursor: pointer; } // แตะที่ใดก็ได้เพื่อสิ้นสุดการโฟกัส

หมายเหตุ

  • วางปลั๊กอินก่อน bootstrap.js เพื่อหลีกเลี่ยงผลต่อคำแนะนำเครื่องมือ
  • ทดสอบเฉพาะบน iPhone XR ios 12.1.12 และ ipad 3 ios 9.3.5 โดยใช้ Safari หรือ Chrome

อ้างอิง:

https://code.jquery.com/ui/

https://api.jquery.com/category/selectors/jquery-selector-extensions/


2
ในปี 2019 คุณไม่จำเป็นต้องใช้ jQuery เพราะ WebAPI นั้นทรงพลังและรองรับคุณสมบัติหลัก ๆ ทั้งหมด
acme

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