JavaScriptを使用。ユーザーのデバイスがiPhoneXかどうかを確認するにはどうすればよいですか?
また、iPhoneの「ノッチ」が横向きのときにどちら側に配置されるかをどのように判断できますか?
すばらしい記事がいくつかあります: https://webkit.org/blog/7929/designing-websites-for-iphone-x/
...しかし、これらは、これを書いている時点で、多くのモバイルブラウザーでネイティブにサポートされていない最先端の機能を利用する傾向があります。
だから私はJavascriptでiPhoneXを検出する方法を考え出しました。私のプロセスは、ユーザーのデバイスの向きに応じて、ノッチの位置もチェックします:
https://codepen.io/marknotton/pen/NwpgBK
(function(window){
// Really basic check for the ios platform
// https://stackoverflow.com/questions/9038625/detect-if-device-is-ios
var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
// Get the device pixel ratio
var ratio = window.devicePixelRatio || 1;
// Define the users device screen dimensions
var screen = {
width : window.screen.width * ratio,
height : window.screen.height * ratio
};
// iPhone X Detection
if (iOS && screen.width == 1125 && screen.height === 2436) {
// Set a global variable now we've determined the iPhoneX is true
window.iphoneX = true;
// Adds a listener for ios devices that checks for orientation changes.
window.addEventListener('orientationchange', update);
update();
}
// Each time the device orientation changes, run this update function
function update() {
notch();
iphoneXChecker();
}
// Notch position checker
function notch() {
var _notch = '';
if( 'orientation' in window ) {
// Mobile
if (window.orientation == 90) {
_notch = 'left';
} else if (window.orientation == -90) {
_notch = 'right';
}
} else if ( 'orientation' in window.screen ) {
// Webkit
if( screen.orientation.type === 'landscape-primary') {
_notch = 'left';
} else if( screen.orientation.type === 'landscape-secondary') {
_notch = 'right';
}
} else if( 'mozOrientation' in window.screen ) {
// Firefox
if( screen.mozOrientation === 'landscape-primary') {
_notch = 'left';
} else if( screen.mozOrientation === 'landscape-secondary') {
_notch = 'right';
}
}
window.notch = _notch;
}
})(window);
// Bespoke functions:
// The above functions have no jQuery Dependencies.
// The below code uses jQuery solely for this quick demo.
if ( window.iphoneX === true ) {
$('body').addClass('iphoneX');
}
function iphoneXChecker() {
if (window.notch == 'left') {
$('body').removeClass('notch-right').addClass('notch-left');
} else if (window.notch == 'right') {
$('body').removeClass('notch-left').addClass('notch-right');
} else {
$('body').removeClass('notch-right notch-left');
}
}
私は仕方がないが、これは小さなハックの組み合わせに過ぎないと感じている。おそらくお気づきでしょうが、私のJavascriptは厳密には高水準ではなく、これを行うにはより良い/よりクリーンな方法があると確信しています。
私が検討していない問題のフィードバックと解決策を受け取っていただければ幸いです。
iPhoneXをチェックするだけの場合(Notchは無視されます)、これでうまくいくはずです:
https://codepen.io/marknotton/pen/MOpodJ
(function(){
// Really basic check for the ios platform
// https://stackoverflow.com/questions/9038625/detect-if-device-is-ios
var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
// Get the device pixel ratio
var ratio = window.devicePixelRatio || 1;
// Define the users device screen dimensions
var screen = {
width : window.screen.width * ratio,
height : window.screen.height * ratio
};
// iPhone X Detection
if (iOS && screen.width == 1125 && screen.height === 2436) {
alert('iPhoneX Detected!');
}
})();
iPhone Xと11のアスペクト比は9:19.5です。
9 / 19.5 = 0.4615384615.toFixed(3) = "0.462"
window.screen
を使用して、すべてのiPhone Xおよび11でこれを試してみましょう。
X、Xs、Xs Max(表示ズーム:ズーム)、11 Pro、11 Pro Max(表示ズーム:ズーム):
375 / 812 = 0.4618226601.toFixed(3) = "0.462"
Xs Max(ディスプレイズーム:標準)、XR、11、11 Pro Max(ディスプレイズーム:標準):
414 / 896 = 0.4620535714.toFixed(3) = "0.462"
そう...
let iPhone = /iPhone/.test(navigator.userAgent) && !window.MSStream
let aspect = window.screen.width / window.screen.height
if (iPhone && aspect.toFixed(3) === "0.462") {
// I'm an iPhone X or 11...
}
window.screen
は、アクティブなデバイスの向きに関係なく、常に縦向きでサイズを返します。