Panolens fullscreen
크롬에서 전체화면이 안돼요.
역시 테스트 서버에서 기능을 테스트하고 받은 내용이다. 크롬에서 전체화면 버튼을 누르면 F11처럼 전체화면이 되었다가 1~2초 후에 다시 풀린다는 내용이다.
자리에서 테스트를 해보니 정말로 1~2초 후에 전체화면이 풀렸다. 바로 검색을 해보니까 다양한 이유로 전체화면이 안될 수 있다는 것을 알았다. 사용자의 크롬 설정에 따라서 전체화면이 동작하지 않을 수 있다는 것인데. 이것은 서버에서 처리할 수 없는 부분이었다. 관련링크: https://windowsreport.com/google-chromes-full-screen-option-doesnt-fill-screen-fix/
그럼 전체화면 어떻게?
“이런 이유 때문에 전체화면은 저희가 처리 못해요.” 라고만 하고 끝나면 아마 순식간에 역적으로 몰릴 것이다. 그럼 어떻게 처리 할 것인가? 생각해보면 전체화면을 처리하는 부분이 있고 이 부분을 커스터마이징하면 된다. 먼저 Widget의 생성자를 따라가 봤다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /** * Widget for controls * @constructor * @param {HTMLElement} container - A domElement where default control widget will be attached to */ PANOLENS.Widget = function ( container ) { THREE.EventDispatcher.call( this ); this.DEFAULT_TRANSITION = 'all 0.27s ease'; this.TOUCH_ENABLED = PANOLENS.Utils.checkTouchSupported(); this.PREVENT_EVENT_HANDLER = function ( event ) { event.preventDefault(); event.stopPropagation(); }; this.container = container; this.barElement; this.fullscreenElement; this.videoElement; this.settingElement; this.mainMenu; this.activeMainItem; this.activeSubMenu; this.mask; } | cs |
딱 fullscreenElement 변수를 따라가니 어렵지 않게 this.createFullscreenButton(); 전체화면을 만드는 함수를 찾을 수 있었다.
createFullscreenButton
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | /** * Create Fullscreen button * @return {HTMLSpanElement} - The dom element icon for fullscreen * @fires PANOLENS.Widget#panolens-viewer-handler */ PANOLENS.Widget.prototype.createFullscreenButton = function () { var scope = this, item, isFullscreen = false, tapSkipped = true, stylesheetId; stylesheetId = 'panolens-style-addon'; // Don't create button if no support if ( !document.fullscreenEnabled && !document.webkitFullscreenEnabled && !document.mozFullScreenEnabled && !document.msFullscreenEnabled ) { return; } function onTap ( event ) { event.preventDefault(); event.stopPropagation(); tapSkipped = false; if ( !isFullscreen ) { scope.container.requestFullscreen && scope.container.requestFullscreen(); //크롬 scope.container.msRequestFullscreen && scope.container.msRequestFullscreen(); //익스플로러 scope.container.mozRequestFullScreen && scope.container.mozRequestFullScreen(); //파이어폭스 scope.container.webkitRequestFullscreen && scope.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); isFullscreen = true; } else { document.exitFullscreen && document.exitFullscreen(); //크롬 document.msExitFullscreen && document.msExitFullscreen(); //익스플로러 document.mozCancelFullScreen && document.mozCancelFullScreen(); //파이어폭스 document.webkitExitFullscreen && document.webkitExitFullscreen(); isFullscreen = false; } this.style.backgroundImage = ( isFullscreen ) ? 'url("' + PANOLENS.DataImage.FullscreenLeave + '")' : 'url("' + PANOLENS.DataImage.FullscreenEnter + '")'; } function onFullScreenChange (e) { if ( tapSkipped ) { isFullscreen = !isFullscreen; item.style.backgroundImage = ( isFullscreen ) ? 'url("' + PANOLENS.DataImage.FullscreenLeave + '")' : 'url("' + PANOLENS.DataImage.FullscreenEnter + '")'; } /** * Viewer handler event * @type {object} * @property {string} method - 'onWindowResize' function call on PANOLENS.Viewer */ scope.dispatchEvent( { type: 'panolens-viewer-handler', method: 'onWindowResize', data: false } ); tapSkipped = true; } document.addEventListener( 'fullscreenchange', onFullScreenChange, false ); document.addEventListener( 'webkitfullscreenchange', onFullScreenChange, false ); document.addEventListener( 'mozfullscreenchange', onFullScreenChange, false ); document.addEventListener( 'MSFullscreenChange', onFullScreenChange, false ); item = this.createCustomItem( { style : { backgroundImage : 'url("' + PANOLENS.DataImage.FullscreenEnter + '")' }, onTap : onTap } ); // Add fullscreen stlye if not exists if ( !document.querySelector( stylesheetId ) ) { var sheet = document.createElement( 'style' ); sheet.id = stylesheetId; sheet.innerHTML = ':-webkit-full-screen { width: 100% !important; height: 100% !important }'; document.body.appendChild( sheet ); } return item; }; | cs |
여기서 전체화면의 버튼을 브라우저에 맞게 이벤트를 실행하고 있다. 나중에 서비스 팀에서 전체화면 기능을 커스터마이징을 여기서해야한다.
브라우저 구분
1 2 3 4 5 6 7 8 9 10 11 12 13 | if ( !isFullscreen ) { scope.container.requestFullscreen && scope.container.requestFullscreen(); //크롬 반응 scope.container.msRequestFullscreen && scope.container.msRequestFullscreen(); //익스플로러 반응 scope.container.mozRequestFullScreen && scope.container.mozRequestFullScreen(); //파이어폭스 반응 scope.container.webkitRequestFullscreen && scope.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); //크롬,엣지 반응 isFullscreen = true; //전체화면 플레그 } else { document.exitFullscreen && document.exitFullscreen(); //크롬 반응 document.msExitFullscreen && document.msExitFullscreen(); //익스플로러 반응 document.mozCancelFullScreen && document.mozCancelFullScreen(); //파이어폭스 반응 document.webkitExitFullscreen && document.webkitExitFullscreen(); //크롬,엣지 반응 isFullscreen = false; } | cs |
- requestFullscreen: 크롬
- msRequestFullscreen: 익스플로러
- mozRequestFullScreen: 파이어폭스
- webkitRequestFullscreen: 크롬, 엣지
위와 같이 브라우저에서 반응을 한다.
크기 조절하기
Widget 관련해서 버튼 만드는 부분을 더 분석해서 녹여봐야겠다.