#javascript #html #css #vue.js
#javascript #HTML #css #vue.js
Вопрос:
Как мы можем переключать класс element
на основе ориентации устройства.
Пример:
<div class="landscape"></div>
@media (orientation: portrait) {
.landscape: {...}
}
Я могу изменить landscape
свойства css. но я хочу избежать этого.
Вместо этого я хотел бы изменить сам класс таким образом, чтобы он выглядел как
<div class="portrait"></div> // if orientation is portrait
<div class="landscape"></div> // if orientation is landscape
Любые предложения по этому поводу!
Примечание: Также принял бы ответ для vue
Обновление: screen.orientation
не работает на safari
. решение должно работать на safari
тоже.
спасибо за ваши приемлемые ответы.
Комментарии:
1. Помогает ли это? developer.mozilla.org/en-US/docs/Web/API /…
2. @PeterSH это довольно сложно, хотелось, чтобы это было просто, как ориентация
portrait
илиlandscape
. спасибо за ссылку.3. Это проще: developer.mozilla.org/en-US/docs/Web/API/Screen/orientation . Имейте в виду, что это ограничивает совместимость с браузерами (особенно с мобильными браузерами)
4. @PeterSH вы правы!, это выдает ошибку в
safari
браузере. Найдено правильное решение, опубликую здесь.
Ответ №1:
Проверьте этот код с помощью matchMedia
. Но, возможно, я где-то допустил ошибку в этом коде. Но суть и структура верны.
window.matchMedia('(orientation: portrait)').addListener(function(m) {
let div_class = document.querySelector('.landscape');
if (m.matches) {
div_class.className = 'portrait';
} else {
div_class.className = 'landscape';
}
});
Ответ №2:
window.addEventListener("orientationchange", function (event) {
const { angle } = event.target.screen.orientation; // orientation angle
let orientation = angle === 90 || angle === -90 ? "landscape" : "portrait";
const element = document.getElementById("#customElement");
element.classList.remove(['landscape', "portrait"]);
element.classList.add(orientation);
});
Комментарии:
1. ` screen.orientation` не работает в
safari
браузере, my bad не упоминал об этом.2. будет ли, тогда включите обходной путь для этого в мой ответ
3.
orientationchange
теперь это устаревшая функция: developer.mozilla.org/en-US/docs/Web/API/Window /…
Ответ №3:
хорошим способом сделать это было бы также указать элементу и идентификатору «orient»: safari использует не window.screen.orientation, а window.orientation
<div class="" id="orient"></div>
const orient = document.querySelector("#orient")
//add the current orientation as a class
if(!window.orentation){
orient.classList.add(window.screen.orientation===0 || window.screen.orientation===180 ? "portrait":"landscape")
}else{
orient.classList.add(window.orientation===0 || window.orientation===180 ? "portrait":"landscape") //for safari
}
//now check for when orientation changes and toggle on/off as required
//safari uses window.orientation instead :(
window.addEventListener("orientationchange", (e)=>{
orient.classList=""; //empty class list
if(!window.orientation){
orient.classList.add(window.screen.orientation===0 || window.screen.orientation===180 ? "portrait":"landscape"); //add the correct value back
}else{
orient.classList.add(window.orientation===0 || window.orientation===180 ? "portrait":"landscape"); //for safari :(
}
});
Комментарии:
1.
screen.orientation
не работает в браузере safari.2. да, но, согласно этому сообщению,
window.orientation
делает, williammalone.com/articles/html5-javascript-ios-orientation
Ответ №4:
Как я реализовал, основываясь на принятом решении.
window.matchMedia('(orientation: portrait)').addListener(function(event) {
if (event.matches) {
const landscapeClassElements = document.querySelectorAll('.landscape');
landscapeClassElements.forEach(element => {
element.classList.remove('landscape')
element.classList.add('portrait')
});
} else {
const portraitClassElements = document.querySelectorAll('.portrait');
portraitClassElements.forEach(element => {
element.classList.remove('portrait')
element.classList.add('landscape')
});
}
});
matchMedia('(orientation: portrait)').matches
возвращает true
для portrait
window.matchMedia
прост и также работает на safari
!
Ответ №5:
Вы можете использовать css для достижения этой цели!
.portrait { display: none; }
.landscape { display: block; }
@media (orientation: portrait) {
.portrait { display: block; }
.landscape { display: none; }
}
Комментарии:
1. op говорит, что он пытается избежать переписывания стиля ландшафтного класса. javascript может быть лучшим
2. @TochiBedford да, хочу переключить класс, этот ответ не поможет