Обратите внимание , если вы хотите включить высококонтрастный режим из браузера, вы не можете. Этот ответ заключается в том, как применить стили с высокой контрастностью одним нажатием кнопки, одновременно поддерживая медиазапрос, который не работает на JavaScript.
Это решение позволяет сохранить стили для IE как медиа-запрос, но также позволяет переключать их вручную. Это зависит от того, находится ли ваш высококонтрастный CSS в отдельном внешнем файле.
Мы добавляем таблицу стилей, содержащую ваши высококонтрастные правила CSS, в качестве внешнего файла.
Мы даем этому файлу уникальный идентификатор (#doNotChangeMe
) и соответствующий медиазапрос media="screen and (-ms-high-contrast: active)"
.
Поскольку указанный выше файл будет работать только для IE, мы можем оставить его в покое.
Затем мы создаем функцию, которая также может добавлять и удалять эту таблицу стилей одним нажатием кнопки.
Я создал простую функцию переключения, которая будет запрашивать, существует ли таблица стилей (без #doNotChangeMe
id) с помощью селектора CSS.
'link[href*="' + externalFileName + '"]:not(#doNotChangeMe)'
(ищите ссылку с предоставленным нами href
, если у него нет соответствующего идентификатора).
Затем мы видим, существует ли этот файл CSS в DOM, если мы не добавим его снова (это не повредит, если ваш высокий контраст CSS - последняя таблица стилей в DOM), в противном случае мы удалите его.
Я пытался сделать это чище с помощью Changi При использовании медиазапроса программно, однако в браузерах это показало неоднозначные результаты, и приведенное выше работает согласованно (например, политика безопасности CORS срабатывает, если вы пытаетесь изменить media.mediaText
).
Я связался с таблица стилей Bootstrap в примере только для простоты демонстрации. Вам нужно будет проверить DOM, чтобы увидеть, что эта функция не затрагивает высококонтрастную таблицу стилей (или включить режим высокой контрастности в IE, чтобы убедиться, что переключение не влияет ни на что).
Обратите внимание Я не добавил никаких индикаторов к кнопке переключения, чтобы показать, активен ли режим, убедитесь, что вы добавили соответствующий WAI-ARIA, текст кнопки и т. Д. c.
//Please note that the below assumes you do not want to interfere with normal media query, if you want people who do have high contrast mode enabled you will need to modify this to remove the ignoreIdOrClass part and instead have a variable containing the state.
var ignoreIdOrClass = '#doNotChangeMe'; //this is the ID of the file that was already in the DOM we do not want to touch
var externalFileName = document.querySelector(ignoreIdOrClass).href; //we grab the URL of the file we want to replicate
function toggleHighContrast() {
var linkNode = document.querySelector('link[href*="' + externalFileName + '"]:not(' + ignoreIdOrClass + ')'); //see if we have added this style sheet to the DOM ourselves, ignore the one with the ID we said to ignore
if(!linkNode){ //our css file copy doesn't exist so create it and add it to the document HEAD
var head = document.head;
var link = document.createElement("link");
link.type = "text/css";
link.rel = "stylesheet";
link.href = externalFileName;
head.appendChild(link);
}else{ //our css copy does exist so remove it
linkNode.parentNode.removeChild(linkNode);
}
}
document.getElementById("myBtn").addEventListener("click", toggleHighContrast);
<link id="doNotChangeMe" rel="stylesheet" media="screen and (-ms-high-contrast: active)" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" />
<div style="padding: 20px;">
<button id="myBtn" class="btn btn-primary btn-lg">Toggle High Contrast</button>
</div>