Как заставить страницу быть альбомной на мобильных устройствах

JavaScript

Как заставить страницу быть альбомной на мобильных устройствах

Цзо Пэнфэй 2017.12.13

1. Предпосылки

В последнее время компания собирается разработать мобильную веб-игру: нажмите и удерживайте кнопку, и велосипед будет ездить все время, а когда вы встретите достопримечательность определенной страны, появится соответствующая подсказка для этой страны. , требующий горизонтального отображения экрана, а не вертикального экрана.

Однако, когда пользователь открывает портретный экран, а ландшафтный режим в мобильном телефоне не включен, пользователь должен принудительно включить его. В это время пользователю уже давно не терпелось выключить свою игру.

И некоторые модели и некоторые приложения не могут быть ландшафтными: например, WeChat для Android не имеет ландшафтного режима, а WeChat для iOS может включать ландшафтный режим.

Решение состоит в том, чтобы написать горизонтальный экранный див в портретном режиме, а затем установить поворот плюс (минус) 90 градусов, чтобы повернуть его; и если пользователь переключается на альбомную, поворот нужно восстановить, и требования могут также отображаться нормально. .

2. Чистый CSS

Поверните основной div горизонтально в портретном режиме, и он останется неизменным в ландшафтном режиме.

@media screen and (orientation: portrait) {
    .main {
        -webkit-transform:rotate(-90deg);
        -moz-transform: rotate(-90deg);
        -ms-transform: rotate(-90deg);
        transform: rotate(-90deg);
        width: 100vh;
        height: 100vh;
        /*去掉overflow 微信显示正常,但是浏览器有问题,竖屏时强制横屏缩小*/
        overflow: hidden;
    }
}

@media screen and (orientation: landscape) {
    .main {
        -webkit-transform:rotate(0);
        -moz-transform: rotate(0);
        -ms-transform: rotate(0);
        transform: rotate(0)
    }
}
скопировать код

Но есть проблема, что в ландшафтном режиме, после использования CSS для поворота на 90 градусов, ширину и высоту не так просто контролировать.

width: 100vh;
height: 100vh;

скопировать код

Этот контроль ширины и высоты не подходит для страниц с одной шириной и высотой экрана.

3. js вычисляет ширину и высоту, выравнивание, поворот

Как было сказано выше, при портретной ориентации будут проблемы с шириной и высотой после поворота в альбомную. Это может быть достигнуто с помощью следующих js.

var width = document.documentElement.clientWidth;
var height =  document.documentElement.clientHeight;
if( width < height ){
  $print =  $('#print');
  $print.width(height);
  $print.height(width);
  $print.css('top',  (height-width)/2);
  $print.css('left',  0-(height-width)/2 );
  $print.css('transform' , 'rotate(90deg)');
  $print.css('transform-origin' , '50% 50%');
}

скопировать код

Обратите внимание, что преобразование-происхождение50% 50%, После поворота на 90 градусов вам также необходимо сбросить верх и левый угол, чтобы выровнять его.

4. Окончательный план

Если кнопка поворота экрана телефона пользователя включена, то приведенный выше код по-прежнему имеет проблемы, когда телефон повернут боком.

var evt = "onorientationchange" in window ? "orientationchange" : "resize";
      
    window.addEventListener(evt, function() {
        console.log(evt);
        var width = document.documentElement.clientWidth;
         var height =  document.documentElement.clientHeight;
          $print =  $('#print');
         if( width > height ){
           
            $print.width(width);
            $print.height(height);
            $print.css('top',  0 );
            $print.css('left',  0 );
            $print.css('transform' , 'none');
            $print.css('transform-origin' , '50% 50%');
         }
         else{
            $print.width(height);
            $print.height(width);
            $print.css('top',  (height-width)/2 );
            $print.css('left',  0-(height-width)/2 );
            $print.css('transform' , 'rotate(90deg)');
            $print.css('transform-origin' , '50% 50%');
         }
        
    }, false);

скопировать код

5. Полный код

/**
 * 横竖屏
 * @param {Object}
 */
function changeOrientation($print) {  
  var width = document.documentElement.clientWidth;
  var height =  document.documentElement.clientHeight;
  if(width < height) {
	  $print.width(height);
	  $print.height(width);
	  $print.css('top',  (height - width) / 2 );
	  $print.css('left',  0 - (height - width) / 2 );
	  $print.css('transform', 'rotate(90deg)');
	  $print.css('transform-origin', '50% 50%');
  } 
 
  var evt = "onorientationchange" in window ? "orientationchange" : "resize";
      
      window.addEventListener(evt, function() {

	  setTimeout(function() {
	      var width = document.documentElement.clientWidth;
	      var height =  document.documentElement.clientHeight;
	      // 刷新城市的宽度
	      initCityWidth();
	      // 初始化每个气泡和自行车碰撞的距离
	      cityCrashDistanceArr = initCityCrashDistance();
	
		if( width > height ){
			$print.width(width);
			$print.height(height);
			$print.css('top',  0 );
			$print.css('left',  0 );
			$print.css('transform' , 'none');
			$print.css('transform-origin' , '50% 50%');
		 }
		 else {
		  $print.width(height);
			$print.height(width);
			$print.css('top',  (height-width)/2 );
			$print.css('left',  0-(height-width)/2 );
			$print.css('transform' , 'rotate(90deg)');
			$print.css('transform-origin' , '50% 50%');
		 }
	}, 300);	
   }, false);
}
скопировать код

6. Резюме

7. Ссылки

8. demo

9. Код

код