다음은 개발자가 CSS를 편집하거나 새로운 CSS 규칙을 작성하지 않아도되는 간단한 JavaScript 코드입니다. 나는 이것을 사용하여 Bootstrap 버튼에 썼지 class="btn"
만 특정 클래스 이름을 가진 모든 버튼에서 작동합니다.
단계는 다음과 같습니다.
- 이것이 터치 장치인지 확인
- 그렇다면 모든 CSS 규칙을 반복하십시오.
document.styleSheets
.btn
과 모두를 포함하는 규칙을 삭제:hover
모든 .btn :hover
CSS 규칙을 제거 하면 버튼에 시각적 호버 효과가 없습니다.
1 단계 : 터치 장치 감지
다음에 대한 미디어 쿼리를 확인하십시오 (hover: none)
.
const hasMatchMedia = typeof window.matchMedia !== 'undefined';
/**
* determine if device is touch-capable
* true - device is touch-capable
* false - device is not touch-capable
* null - unable to determine touch capability
* @return {null|boolean}
*/
const hasTouch = () => {
if (hasMatchMedia) {
return window.matchMedia('(hover: none)').matches;
}
return null;
};
2 단계 :`btn` 및`: hover`가 포함 된 CSS 규칙 삭제
/**
* remove all CSS rules contaning both '.btn' and ':hover'
* @return {number} count of rules deleted
*/
function removeBtnHovers () {
let rulesDeleted = 0;
// recursively delete '.btn:hover' rules
function recursiveDelete (rules, styleSheet) {
if (typeof rules === 'undefined' ||
typeof rules.length === 'undefined' ||
rules.length <= 0) {
return;
}
// iterate in reverse order,
// deleting any rule containing both '.btn' and ':hover'
const ruleLen = rules.length;
for (let i = ruleLen - 1; i >= 0; i--) {
const rule = rules[i];
if (typeof rule.cssRules === 'undefined') {
// a standard rule, evaluate it
const cssText = rule.cssText;
if (typeof cssText === 'string' &&
cssText.includes('.btn') &&
cssText.includes(':hover')) {
styleSheet.deleteRule(i);
rulesDeleted++;
}
} else {
// rule contains cssRules, iterate over them
recursiveDelete(rule.cssRules, rule);
}
}
}
// iterate over all style sheets in document
for (const styleSheet of document.styleSheets) {
let rules = styleSheet.cssRules;
if (!rules) { continue; }
recursiveDelete(rules, styleSheet);
}
return rulesDeleted;
}
완전한 코드는 GitHub 및 npm에 있습니다.
terrymorse.com 에서 라이브 데모 .