ここに問題があります。私はWebページ(Androidデバイスのみ)を持っています。そのページには入力ボックス(具体的にはテキストボックス)があり、フォーカスを取得するとブラウザがズームインします。ズームインしたくない-簡単そうですね?
ここからがおもしろいところです。一般的にズームできる必要があるので、言わないでください
<meta name='viewport' content='user-scalable=0'>
私にはうまくいきません。
また、入力ボックスはクリックイベントを受け取りません。別のボタンをクリックすると表示され、プログラムでフォーカスを取得します。
ここに私が試したものがあり、これまでのところ失敗しました:
jQuery('head meta[name=viewport]').remove();
jQuery('head').prepend('<meta name="viewport" content="width=720px;intial-scale=1.0;maximum-scale=1.0;user-scalable=no" />');
jQuery("#locationLock input").focus();
jQuery('head meta[name=viewport]').remove();
jQuery('head').prepend('<meta name="viewport" content="width=720px;intial-scale=1.0;maximum-scale=1.0;user-scalable=yes" />');
これも失敗しました:
<input type='text' onfocus="return false">
この:
jQuery("#locationLock input").focus(function(e){e.preventDefault();});
何か案は?
皆さんに悪い知らせがあります。 6か月が経ち、誰も質問に正しく答えていません。
また、私はそのプロジェクトと雇用主の仕事を終えました。
私はそれを言うことを恐れていますが、私がまさに求めていたことは不可能です。ごめんなさいしかし、他のオプションを見ることができるように、質問は生きたままにします。
以下は私のために働いた(Android Galaxy S2):
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no;user-scalable=0;"/>
これが最良の方法かどうかはわかりませんが、これはAndroid and iphone。
input:focus { font-size: 16px!important}
メディアクエリを使用して、モバイルデバイスのみをターゲットにできます。
さまざまな画面解像度とサイズに合わせてコンテンツのサイズを調整することは非常に困難であり、これが最終的にこのズームの問題の原因です。
ほとんどのモバイルブラウザには、入力フォーカスでトリガーがあります(簡単にオーバーライドできません)。
_if (zoom-level < 1)
zoom to 1.5
center focused input relative to screen
_
*はい、それはかなり単純化されていました。
_<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
_そのようなすべてのビューポート設定しないズームアウトしている場合、入力フォーカスズームを禁止します。また、これらは、ウィンドウを画面よりも広い幅にプッシュする他のhtml、body、または要素のサイズ変更をオーバーライドしません。
デバイスの画面サイズより大きいウィンドウまたはボディサイズを使用します。
Androidスマートフォン:360 x 650のGalaxyラインのほとんどの標準画面サイズを考慮してください。ドキュメントの本文またはウィンドウがそれよりも大きいと定義されている場合明らかにする)、いくつかのことが起こるかもしれません:
ロードされると、ページは収まりません。一部のブラウザはウィンドウに合わせてズームアウトする場合がありますが、ユーザーは最も確実に縮小します。さらに、このページを一度ズームアウトすると、ブラウザはズームレベルを保存します。
ズームアウトすると、幅がうまく収まり、より垂直な領域を持つページが画面に非常にきれいに表示されます...しかし...
ブラウザーは現在、テキストと入力(通常の1倍ズーム用のサイズ)が小さすぎて読み込めない状態になっているため、入力フィールドがフォーカスを取得するとズームのユーザビリティ動作がトリガーされます。
上記の場合の一般的な動作は、入力の可視性を確保するために1.5倍にズームすることです。その結果(ズームアウトしたとき、または大画面で見た目が良くなるようにすべてのスタイルを設定した場合)は、望ましくありません。
CSSメディアルール、デバイス検出、または状況に最適なものを組み合わせて使用します。ウィンドウとボディを、画面スペースを超えない範囲でいっぱいにするサイズに設定します。
メタビューポートを使用しますが、CSSの幅には注意してください。
_<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
_
jQuery.mobile $.mobile.zoom.disable();
途中からではなく、最初から開発を開始してください。
はい、可能です
input[type='text'],input[type='number'],textarea {font-size:16px;}
テスト済みAndroid 4.2 browser and Android Chrome。
https://stackoverflow.com/a/6394497/4264
ズームを続けていることがわかったのは、Chrome with Settings-> Accesibility-> Text scaling than 100%。
今日、この問題に突入し、クロムの更新がすぐにパイプに届き、それが解決する可能性があります。 @Joが指摘した chromium の問題により、
no.28 jdd ... @ chromium.org https://codereview.chromium.org/196133011/ の時点で、自動ズームはモバイル向けに最適化されたビューポート(たとえば、「width = device-width」または固定ページスケールビューポートアノテーション)。
要素の可視性を維持するために、そのようなサイトに編集可能な要素をフォーカスする場合、自動スクロールがまだあるかもしれませんが、ズームは無効になります。これはM41で公開されます(ベータチャンネルにアクセスしてからまだ数週間かかります)。
従来のデスクトップサイトの自動ズームを防止する計画はありません。
この時点で、Chromeはv.40、v.41はベータ版です。Android = Chromeブラウザ。
font-size: 18px;
これにより、Nexus 7(2011)でAndroid 4.3。
この問題はNexus 7でのみ発生し、次のデバイスはすべてfont-sizeに満足しています:16px:
これが誰かを助けることを願っています!
HTML5 Androidアプリ。私は半分の答えを提供することができます。つまり、テキストの拡大縮小を停止する方法フィールドがフォーカスされています。
Jquery Mobileが必要です:
$('#textfield').textinput({preventFocusZoom:true});
まさにそれをします。
しかし、私が言ったように、これは問題の半分しか解決しません。残りの半分は、ユーザーが後でページを再びズームできるようにします。私が見つけたドキュメントはそれを示唆しているようです
$('#textfield').textinput({preventFocusZoom:false});
または
$('#textfield').textinput('option','preventFocusZoom',false);
設定を解除する必要がありますが、どちらのオプションも機能させることができませんでした。後でユーザーを別のページに移動する場合は問題ありませんが、私のように、AJAXを介してコンテンツをロードするだけの場合は、使用が制限されます。
編集:IOSを対象としたものの、
$.mobile.zoom.disable();
ズームも停止します。より適切な一般的な方法で。しかし残念ながら
$.mobile.zoom.enable();
以前のコードのように機能を復元できません。
これは#inputbox
は、入力フォーム要素のIDです。
これを使用して、検索ボックスの自動ズームを停止しますIOSこれは上記の以前の投稿のmodです。mouseoverイベントは最初にしか機能しないが、その後のトリガーに失敗するためです。これは本当のヘアプーラーでした...
$("#inputbox").live('touchstart', function(e){
$('head meta[name=viewport]').remove();
$('head').prepend('<meta name="viewport" content="user-scalable=0" />');
}
);
$("#inputbox").mousedown(zoomEnable);
function zoomEnable(){
$('head meta[name=viewport]').remove();
$('head').prepend('<meta name="viewport" content="user-scalable=1" />');
}
ちょっとしたメモ:
meta name="viewport"
を使用したソリューションは完全に機能します。ただし、ネイティブおよびChromeのブラウザにはAndroidという名前のアクセシビリティ設定があります"ズームを制御するWebサイトのリクエストをオーバーライドします。"設定が設定されている場合、HTML、CSS、またはJavaScriptでズームを無効にすることはできません。
2つのものが必要です
ユーザーがズームできないようにするには、頭の中でこのようなメタタグを使用します。
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
そして、CSSに次のようなものを入れて、ブラウザーがズームしないようにします。
* { font-size:16px; }
できた!ブラウザは、最小のフォントなどに基づいてビューポートのサイズを変更すると思います。たぶん誰かがそれをもっとうまく説明できるかもしれませんが、うまくいきました:)
ズームを無効にできるかどうかはわかりませんが、このような制限を設定できます
<meta id="viewport" name="viewport" content="width=device-width,initial-scale=0.5,maximum-scale=0.5,minimum-scale=0.5,user-scalable=no">
maximum-scale = 0.5およびminimum-scale = 0.5でうまくいくはずです。それは私のために働いた。
入力のフォントサイズを16px=に設定すると、ズームが停止します。モバイルブラウザーは16px未満を想定しているので、ユーザーはズームする必要があるので、なぜ自分でやらないのですか。
input[type='text'],input[type='number'],textarea {font-size:16px;}
body{ -webkit-text-size-adjust:none;}
以下のメタタグを設定することもできますが、ユーザーのスケーリングは完全に防止されます。
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0;"/>
ユーザーのスケーリングが必要で、入力スケーリングのみを無効にする場合は、これを試してください
$("input[type=text], textarea").mouseover(zoomDisable).mousedown(zoomEnable);
function zoomDisable(){
$('head meta[name=viewport]').remove();
$('head').prepend('<meta name="viewport" content="user-scalable=0" />');
}
function zoomEnable(){
$('head meta[name=viewport]').remove();
$('head').prepend('<meta name="viewport" content="user-scalable=1" />');
}
これも試してください
これは良い答えかもしれません:
input, textarea {
max-width:100%;
}
<meta name=viewport content='user-scalable=no'>
を使用しないでください
作業モデル
これはAndroidで動作します。ここにキーがあります:font-sizeのinputは適切なサイズ。ページの幅が320ピクセルの場合、16ピクセルのフォントサイズが必要です。サイズが640pxの場合、32pxのフォントサイズが必要です。
さらに、次のものが必要です
20ワイドバージョン
<meta name="viewport" content="width=320, initial-scale=1, maximum-scale=1, minimum-scale=1" />
640ワイドバージョン
<meta name="viewport" content="width=640, initial-scale=.5, maximum-scale=.5, minimum-scale=.5" />
注:これには、ユーザーのスケーリング可能な属性は含まれていません。それはそれを壊すでしょう。
非表示の入力フィールドに焦点を合わせようとしているときにズームを停止しようとしている人は、非表示の入力を画面領域(または表示可能領域)と同じ大きさ(または少なくとも同じ幅)にすることができます。
例えば.
HIDDENinput.style.width = window.innerWidth;
HIDDENinput.style.height = window.innerHeight;
(オプション)
これを試してください、それは私のデバイスで動作します:
<meta content="minimum-scale=1.0, width=device-width, maximum-scale=1.0, user-scalable=no" name="viewport" />
ただし、入力ボックスをダブルクリックすると、キーボードが上にスライドし、ページの高さが低くなります。
通常、アクセシビリティ機能を無効にしたくないでしょう。
ただし、固定divを追加してその中にWebページを配置するだけで、ズームの問題を回避できます。
#app {
position: fixed;
top: 0em;
bottom: 0em;
left: 0em;
right: 0em;
overflow: scroll;
}
<body>
<div class="app">
<!-- the rest of your web page -->
<input type="text">
</div>
</body>
<body>
<div class="app">
</div>
</body>
おそらく、ズームスケールを1.0にリセットすることで、ズームを回避できますか?私のAndroid(HTC Wildfire S)で、ズームを1.0にリセットすることができます。
_$('meta[name=viewport]').attr('content',
'initial-scale=1.0, maximum-scale=0.05');
_
ただし、これによりビューポートが0、0(ページの左上隅)に移動します。 $().scrollLeft(...)
と.scrollTop(...)
を再度form
に戻します。
(_initial-scale=1.0, maximum-scale=0.05
_はviewport
メタの初期値です。)
(これを行う理由は、Androidズームを防ぐためではなく、他のAndroid破損した_screen.width
_およびその他の関連する値。)
このメタタグをHTMLファイルに追加すると、問題が解決します。
<html><head><meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=0' ></head><body>html code</body></html>
パーティーに少し遅れましたが、昨日の午後を丸ごと過ごしてこの投稿に行き、Androidの機能/バグであることに気付きました。そこで、ソリューションを投稿します。これは私にとってはうまくいきましたが、それでもユーザーのズームが可能です:
メタ:
<meta id="meta1" name="viewport" content="width=device-width,initial-scale=1,minimal-ui"/>
CSS:
html{
position:absolute;
overflow:-moz-scrollbars-vertical;
overflow-y:scroll;
overflow-x:hidden;
margin:0;padding:0;border:0;
width:100%;
height:100%;
}
body{
position: relative;
width: 100%;
height: 100%;
min-height:100%;
margin: 0;
padding: 0;
border: 0;
}
HTMLをposition:absolute
およびoverflow-x:hidden
に設定すると、私にとってはうまくいきました。
タッチスタートでビューポートのユーザースケーラブルプロパティを設定すると、タッチスタートでそれを変更して削除し、再度追加する必要がなく、ぼかしで再び有効にする必要がありました。ユーザーはフィールドに焦点を合わせながらズームすることはできませんが、少額の支払いが必要だと思います。
var zoomEnable;
zoomEnable = function() {
$("head meta[name=viewport]").prop("content", "width=device-width, initial-scale=1.0, user-scalable=yes");
};
$("input[type='text']").on("touchstart", function(e) {
$("head meta[name=viewport]").prop("content", "width=device-width, initial-scale=1.0, user-scalable=no");
});
$("input[type='text']").blur(zoomEnable);
同じ問題が発生しました(Android chrome browser)のみ。このような問題を解決しました。
UserAgentを検出し、テキストフィールドのonFocusおよびonBlurイベントをバインドして、ビューポートメタコンテンツを次のように変更しました
if ((navigator.userAgent.match(/Android/i)) && (navigator.userAgent.toLowerCase().indexOf('chrome') > -1)) {
isAndroidChrome = true;
}
var viewportmeta = document.querySelector('meta[name="viewport"]');
テキストフィールドのonFocus、次のビューポートメタコンテンツviewportmeta.content = 'width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1';
を設定します
テキストフィールドのonBlur、ビューポートメタコンテンツをviewportmeta.content = 'width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1.4';
にリセットしています。必要に応じて最大スケールを設定できます。または、ユーザーがスケーラブルにしたい場合は、最大スケールを設定しないでください。
トリガーを変更すると、入力のonFocus
イベントがmaximum-scale
が1
の場合、ズームインしません。これは私にとって魅力的でした。それがあなたにも役立つことを願っています。
@soshmoが言ったように、user-scalable
はWebKitが好む属性ではないため、これを含めるとWebKitはビューポートタグ全体を破棄します。また、これはmaximum-scale
を1以外に設定した場合にも当てはまり、ズームが停止しませんでした。
すべてのviewport
およびfocus
イベントでblur
をリセットするとうまくいきました:
var htmlWidth = parseInt($('html').outerWidth());
var screenDPI = parseInt(window.devicePixelRatio);
var screenWidth = parseInt(screen.width);
var screenHeight = parseInt(screen.height);
var scaleVal = (((screenWidth * screenDPI) / htmlWidth)/screenDPI);
$('input[type="text"], input[type="password"], input[type="email"]').each(function() {
//unchained for clarity
$(this).focus(function() {
$('meta[name="viewport"]').attr('content', "initial-scale=' + scaleVal + ', maximum-scale=1, minimum-scale=' + (scaleVal) + ', width=device-width, height=device-height");
// Do something to manage scrolling the view (resetting the viewport also resets the scroll)
$('html, body').scrollTop(($(this).offset().top - (screenHeight/3)));
});
$(this).blur(function() {
$('meta[name="viewport"]').attr('content', "initial-scale=' + scaleVal + ', maximum-scale=1, minimum-scale=' + (scaleVal) + ', width=device-width, height=device-height");
});
});
viewport
の設定/リセットを見つけた場合、WebKitが使用しているコンテンツ属性を受け入れることを確認する価値があります。 user-scalable
のようなものを使用するとviewport
が破棄されるため、JavaScriptが機能していても変更が影響を受けないことを理解するのに少し時間がかかりました。
同様の問題に直面して解決したので、回答を投稿します。
私の状態は以下です。
HTMLヘッドのビューポート設定は
<meta name="viewport" content="width=640">
エージェントはAndroid=デフォルトのブラウザです。
Chrome、Firefox、Safariではありません。
Androidバージョンは4.2.x未満です。
私たちの状況の詳細は同じではありませんが、本質的に同じ問題があると思います。
「target-densitydpi = device-dpi」をmeta [name = viewport]タグに追加することで解決しました。
<meta name="viewport" content="width=640, target-densitydpi=device-dpi">
やってみてください。
しかし、「target-densitydpi = device-dpi」には副作用があると言わざるを得ません。
悪い例はこちらです。
この場合の解決策は、次のページに進む前に、javascriptを使用してtarget-densitydpiプロパティを「device-dpi」から「medium-dpi」に書き換えることです。
JQueryを使用した例。
<a href="go-to-the-other" class="resetDensityDpi">Other page</a>
<script>
$(function(){
$('.resetDensityDpi').click(function(){
var $meta = $('meta[name="viewport"]');
$meta.attr('content', $meta.attr('content').replace(/target-densitydpi=device-dpi/, 'target-densitydpi=medium-dpi'));
return true;
});
});
</script>
そして...このコードは新しい問題を引き起こします。
一部のブラウザは、戻るボタンを使用して前のページに戻るときに、キャッシュデータを使用してJavaScriptプロセスの結果をレンダリングします。そのため、前のページは「target-densitydpi = device-dpi」ではなく「target-densitydpi = medium-dpi」として表示されます。
これの解決策は、上記の反対です。
<script>
$(function(){
var rollbackDensityDpi = function() {
// disable back-forword-cache (bfcache)
window.onunload = function(){};
var $meta = $('meta[name="viewport"]');
if ($meta.attr('content').match(/target-densitydpi=medium-dpi/)) {
$meta.attr('content', $meta.attr('content').replace(/target-densitydpi=medium-dpi/, 'target-densitydpi=device-dpi'));
}
};
if (window.addEventListener) {
window.addEventListener("load", rollbackDensityDpi, false);
} else if (window.attachEvent) {
window.attachEvent("onload", rollbackDensityDpi);
} else {
window.onload = rollbackDensityDpi;
}
});
</script>
ありがとうございました。
偶然、私はこれを発見しました:
input {
line-height:40px;
}
Chrome for Androidバージョン18ですが、それは私の場合に固有かもしれませんが、
<meta name='viewport' data='width=800'>
将来の参照のために、Google経由でここに来る場合、これは他のソリューションの1つである可能性があります。
Nexus 7では、メディアクエリが-
@media screen and (max-device-width: 600px) and (orientation : portrait)
そこで、以下のメディアクエリを使用して問題を解決しました-
@media screen and (max-device-width: 600px) and (max-aspect-ratio: 13/9)
これを念頭に置いてページを最初から設計する必要がありますが、完全に効果的です。
キーは @media
css at-rule は、画面が収まるのに十分な大きさであることがわかっている幅のみをコンポーネントに許可します。
たとえば、より大きなモニターでテキストが広がりすぎないようにコンテンツの幅を設定している場合、幅が大きな画面にのみ適用されるようにしてください。
@media (min-width: 960px){
.content{
width : 960px;
}
}
または、幅が500ピクセルの画像がある場合は、小さな画面で非表示にする必要があるかもしれません。
@media (max-width: 500px){
.image{
display : none;
}
}
Galaxy 4で働いた:
コードをHTMLヘッダーインデックスファイルに追加します。
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no;user-scalable=0;"/>