Как использовать JavaScript условно, как медиа-запросы CSS3, ориентация? - PullRequest
46 голосов
/ 02 октября 2011

Как использовать javascript условно, как медиа-запросы CSS3, ориентация?

Например, я могу написать css для конкретного

@media only screen and (width : 1024px) and (orientation : landscape) {

.selector1 { width:960px}

}

Теперь я хочу запускать только некоторые javascript, если они соответствуютте же условия

как

@media only screen and (width : 1024px) and (orientation : landscape) {

A javascript code here

}

У меня есть внешний javascript, например, http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.4.min.js, и он должен работать только на экране определенного размера и ориентации

Ответы [ 5 ]

56 голосов
/ 04 октября 2011

Вы можете использовать window.matchMedia () :

Проверка медиазапроса на мобильном устройстве

if (matchMedia('only screen and (max-width: 480px)').matches) {
  // smartphone/iphone... maybe run some small-screen related dom scripting?
}

Проверка альбомной ориентации

if (matchMedia('all and (orientation:landscape)').matches) {
  // probably tablet in widescreen view
}

В настоящее время поддерживается во всех современных браузерах ( подробнее )

Polyfill для старых браузеров: https://github.com/paulirish/matchMedia.js/

12 голосов
/ 02 октября 2011

... Я хочу запускать JavaScript только в том случае, если максимальная ширина браузера составляет 1900 пикселей и минимальная ширина 768

РЕДАКТИРОВАТЬ: На самом деле, все было неправильно. Если вы используете мобильное устройство, используйте:

function doStuff(){
    landscape = window.orientation? window.orientation=='landscape' : true;

    if(landscape && window.innerWidth<1900 && window.innerWidth > 768){
        //code here
    }
}
window.onload=window.onresize=doStuff;
if(window.onorientationchange){
    window.onorientationchange=doStuff;
}
11 голосов
/ 02 октября 2011

Я могу придумать быстрое решение: применить некоторые стили условно к невидимому div и проверить, применяются ли они с javascript:

div#test { display: none }
@media only screen and (width : 1024px) and (orientation : landscape) {
    div#test { background-color: white; }
}
if(document.getElementById('test').style.backgroundColor == 'white')
    mediaSelectorIsActive();
0 голосов
/ 02 октября 2011

Вместо этого вы можете просто переписать медиа-запрос как выражение javascript:

function sizehandler(evt) {
    ...
}

function orientationhandler(evt){  

  // For FF3.6+  
  if (!evt.gamma && !evt.beta) {  
    evt.gamma = -(evt.x * (180 / Math.PI));  
    evt.beta = -(evt.y * (180 / Math.PI));  
  }  

  // use evt.gamma, evt.beta, and evt.alpha   
  // according to dev.w3.org/geo/api/spec-source-orientation  

  ...
}  

window.addEventListener('deviceorientation', orientationhandler, false);
window.addEventListener('MozOrientation', orientationhandler, false);
window.addEventListener('load', orientationhandler, false); 
window.addEventListener('resize', sizehandler, false); 
window.addEventListener('load', sizehandler, false); 
0 голосов
/ 02 октября 2011

Вероятно, стоит упомянуть, что есть событие directionchange change, к которому вы можете подключиться, например, так:

$('body').bind('orientationchange', function(){
    // check orientation, update styles accordingly
});

Я знаю, что в случае запуска этого события мобильным Safari вам нужно проверитьо других браузерах.

...