たとえば以下のようなinputタグがあるとします。
html
1<input type="number" name="ball" placeholder="個">
このとき、placeholderで指定した「個」という文字は、ユーザ入力前には薄いグレー色等で表示されていますよね(一般的なブラウザの場合)。
これはユーザが何か入力をすると消えてしまうわけですが、「個」を表示し続ける方法はないでしょうか?
例示したケースの場合、たとえば数字の1を入力しても「1個」と表示されるようにしたいのです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/06/29 04:26
2019/06/29 04:28

退会済みユーザー
2019/06/29 04:36
2019/06/29 04:39
2019/06/29 04:40

退会済みユーザー
2019/06/29 04:50
2019/06/29 04:54

退会済みユーザー
2019/06/29 05:14
2019/06/29 05:24

退会済みユーザー
2019/06/29 07:19
2019/06/29 07:22

退会済みユーザー
2019/06/29 07:25
2019/06/29 07:42 編集

退会済みユーザー
2019/06/29 07:44
2019/06/29 07:48

退会済みユーザー
2019/06/29 07:52

退会済みユーザー
2019/06/29 07:53
2019/06/29 07:55

退会済みユーザー
2019/06/29 08:03
2019/06/29 12:46

退会済みユーザー
2019/06/29 16:56 編集
2019/06/30 01:11

退会済みユーザー
2019/06/30 01:18
2019/06/30 01:20

退会済みユーザー
2019/06/30 01:26 編集
2019/06/30 01:46

退会済みユーザー
2019/06/30 02:03

回答9件
0
placeholderは「個数を入力してください」などの
ヒントを示してユーザーの操作を補助する目的で使用されるため
質問にあるように「個」だけ表示させるのはUI/UXの観点から問題があります。
無理やり実装することはできますがコード量が無駄に多くなってしまうので
<input type="number" name="ball"> 個
のように
シンプルな記述のほうが良いです。
ほとんどのWebサイトではこのようになっていますし
ユーザーは経験上、こちらのほうがわかりやすいです。
投稿2019/06/29 04:37
総合スコア2939
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/06/29 04:48
2019/06/29 04:59 編集

0
そもそもplaceholderは使えないので、どうしてもそうしなきゃいけないのであればMaterializeのText Inputsのようにフォーカスでラベルを外に逃がすような作りにするとかですね。
どんな事情か知らないですけど、入力に被るのが使いやすいと思う人はなかなかいないと思います。
むしろ「そうしなきゃいけなくなった」レイアウトを見直したほうが利用者には優しい作りになるのではないでしょうか。
そもそも「個」という単位一文字すらスペース確保できないってモバイルUIとして本当に使いやすいの?という疑問はこの質問をみた人の多くが感じるところと思います。
組み方次第でスペースが作り出せるなら組み方を見直してみては。
イレギュラーな対応をしてまで、労力をかけてまで実現して得られる効果がどれほどかは熟考が必要でしょう。
数十日かどうか知らないですが、考える方向性次第では何百時間が無駄になることはよくあります。
自身では多角的に考えたつもりかもしれませんが、そのうえでこの結論だったとすると、「もっと他にあるのでは」と感じるのはある程度経験がある回答者としては自然です。
type=numberの時点で数字しか入力できないわけですし、日付とか電話番号とか入力フォーマットを指定しない単なるラベルなのであれば項目名だけあれば充分のようにも思います。
投稿2019/06/29 05:53
編集2019/07/01 01:25総合スコア80886
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/29 06:07 編集

退会済みユーザー
2019/06/29 07:21

退会済みユーザー
2019/07/01 10:10

退会済みユーザー
2019/07/01 10:10

退会済みユーザー
2019/07/01 10:11 編集

退会済みユーザー
2019/07/01 10:14

退会済みユーザー
2019/07/01 10:18

退会済みユーザー
2019/07/01 10:19

退会済みユーザー
2019/07/01 10:21
2019/07/01 11:33

退会済みユーザー
2019/07/01 11:33

退会済みユーザー
2019/07/01 11:34
2019/07/01 11:35

退会済みユーザー
2019/07/01 11:36

退会済みユーザー
2019/07/01 11:36

退会済みユーザー
2019/07/01 11:38

退会済みユーザー
2019/07/01 11:38
2019/07/01 11:41

退会済みユーザー
2019/07/01 11:42

退会済みユーザー
2019/07/01 11:44

退会済みユーザー
2019/07/01 11:50

退会済みユーザー
2019/07/01 11:51

退会済みユーザー
2019/07/01 13:23 編集

退会済みユーザー
2019/07/01 11:53

退会済みユーザー
2019/07/01 11:54

退会済みユーザー
2019/07/01 11:56

退会済みユーザー
2019/07/01 11:57
2019/07/01 11:59

退会済みユーザー
2019/07/01 12:06 編集

退会済みユーザー
2019/07/01 12:08

退会済みユーザー
2019/07/01 12:24

退会済みユーザー
2019/07/01 12:27
2019/07/01 12:28

退会済みユーザー
2019/07/01 12:41

退会済みユーザー
2019/07/01 12:45

退会済みユーザー
2019/07/01 12:51

退会済みユーザー
2019/07/01 12:52

退会済みユーザー
2019/07/01 12:57

退会済みユーザー
2019/07/01 13:00

退会済みユーザー
2019/07/01 13:04 編集

退会済みユーザー
2019/07/01 13:05

退会済みユーザー
2019/07/01 13:07

退会済みユーザー
2019/07/01 13:09

退会済みユーザー
2019/07/01 13:14

退会済みユーザー
2019/07/02 00:52

退会済みユーザー
2019/07/02 00:55

退会済みユーザー
2019/07/02 12:24

退会済みユーザー
2019/07/02 12:26

退会済みユーザー
2019/07/02 12:28
2019/07/03 00:39

退会済みユーザー
2019/07/03 10:17

退会済みユーザー
2019/07/03 10:22

0
少々トリッキーなやり方として、
- 枠のない
<input>
(こちらが実際に入力フォームとなります)と、その外側に<div>
(見た目上はこちらが枠を表示する)を用意する <input>
の外側、<div>
の内側に「個」を書いておく
このようにすれば、見た目上は枠内に「個」が出ているように見えますし、この「個」がデータとして混ざることはありません。。
投稿2019/06/29 05:25
総合スコア146469
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/06/29 07:41

退会済みユーザー
2019/06/29 09:11

0
placeholder属性
コントロールが値を持たない場合、placeholder属性は、データ入力を伴うユーザーの支援を意図する短いヒント(単語や短いフレーズ)を表す。ヒントは、サンプル値または期待された形式の簡単な説明かもしれない。指定される場合、属性は、U+000A LINE FEED(LF)またはU+000D CARRIAGE RETURN(CR)文字を含まない値を持たなければならない。
**placeholder属性は、labelの代替として使用すべきでない。**ヒントや他の助言テキストについては、title属性がより適切である。
Note: このメカニズムは非常に似ているが微妙に異なる:コントロールのlabelによって与えられるヒントは毎回表示され、placeholder属性に与えられた短いヒントはユーザーが値を入力する前にのみ表示され、ユーザーが詳細なヘルプを要求する際にtitle属性におけるヒントは表示される。
WCAG 2.0
Webページのアクセシビリティを満たす基準に、WCAG というものがあり、この基準に適合する場合の実装を書きます。
Web Content Accessibility Guidelines (WCAG) 2.0 は、ウェブコンテンツをよりアクセシブルにするための広範囲に及ぶ推奨事項を網羅している。 このガイドラインに従うことで、全盲又はロービジョン、ろう又は難聴、学習障害、認知障害、運動制限、発話困難、光過敏性発作及びこれらの組合せ等を含んだ、様々な障害のある人に対して、コンテンツをアクセシブルにすることができる。又、このガイドラインに従うと、多くの場合、ほとんどの利用者にとってウェブコンテンツがより使いやすくなる。
3.2.2 入力時: ユーザインタフェース コンポーネント の設定を変更することが、コンテキストの変化を自動的に引き起こさない。ただし、利用者が使用する前にその挙動を知らせてある場合を除く。 (レベル A)
あなたは「テキスト入力時もplaceholderを常時表示する」という非標準機能がある事を、ユーザに事前に知らせなければなりません。
3.2.5 要求による変化: コンテキストの変化は利用者の要求によってだけ生じるか、又は、そのような変化を止めるメカニズムが利用できる。 (レベル AAA)
あなたは「テキスト入力時もplaceholderを常時表示する」という非標準機能を、ユーザが任意で無効化にできるようにしなければなりません。
1.4.6 コントラスト (高度) : テキスト及び文字画像の視覚的提示には、少なくとも 7:1 のコントラスト比がある。ただし、次の場合は除く: (レベル AAA)
あなたは「placeholderテキスト」と「入力テキスト」の両方に 7:1 のコントラスト比を保証しなければなりません。
HTML
1<input type="text" placeholder="一" value="|">
例えば、上記HTMLでは「placeholder = 一」「入力テキスト = |」であり、重ねてみれば「十」のように見えます。
しかし、あなたは「一」と「|」のそれぞれに 7:1 のコントラスト比を保証し、それぞれ区別して読めるようにしなければなりません。
Re: zico_teratail さん
投稿2019/06/29 10:07
総合スコア18194
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/06/30 02:06

退会済みユーザー
2019/07/02 00:56 編集

0
タグには JavaScript とありましたが、 CSS だけでも可能です。
placeholder
は input
にフォーカスしたり入力値がある場合は、非表示になります。ですので、フォーカス時と入力値があるときに「個」の表示を右にずらせば希望通りのことができるかと思います。
html
1<span> 2 <input type="number" name="ball" id="amount" placeholder=" "> 3 <label for="ball"></label> 4</span>
css
1span { 2 position: relative; 3} 4 5label::before { 6 content: '個'; 7 position: absolute; 8 opacity: .3; 9 left: 0; 10 right: initial; 11} 12 13input:focus + label::before { 14 right: 1.5em; 15 left: initial; 16} 17 18input:not(:placeholder-shown) + label::before { 19 right: 1.5em; 20 left: initial; 21}
追記: 上記サンプルは、 Internet Explorer と Microsoft Edge では動作しないので、 JavaScript でクラスを付け外ししたほうが実用的だと思います。
投稿2019/06/29 04:13
編集2019/06/29 04:34総合スコア403
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/29 04:40
2019/06/29 05:51 編集

退会済みユーザー
2019/06/30 01:10

0
ベストアンサー
こういう話でしょうか。
サンプル
html
1<input type="number" name="ball" placeholder="個"> 2<input type="hidden" name="hiddenBall" placeholder="個">
js
1var target = document.querySelector('input[name=ball]'); 2var hiddenTarget = document.querySelector('input[name=hiddenBall]'); 3target.addEventListener('blur',function(){ 4 target.placeholder = target.value+'個'; 5 [hiddenTarget.value, target.value] = [target.value, null]; 6});
投稿2019/06/29 12:07
総合スコア37350
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/29 12:08

退会済みユーザー
2019/06/30 01:05
2019/06/30 02:22

退会済みユーザー
2019/06/30 02:29

退会済みユーザー
2019/07/02 00:47

0
inputの後ろにspanでも書いて、ネガティブマージンで上に重ねる。
inputには margin-rightでも設定しておけばいいんでないの?
投稿2019/06/29 08:31

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/06/29 09:04

退会済みユーザー
2019/06/29 10:14

退会済みユーザー
2019/06/29 11:02

退会済みユーザー
2019/06/29 16:30

退会済みユーザー
2019/06/29 16:43

0
面白そうなので、作ってみました。
Chromeでしか確認してませんでしたが、どうやら、Chrome以外はうまくいかないようです。ブラウザによって取得できるプロパティの値とかに違いがあるので、そこら辺かも知れません。Chromeでだけで見てください。
CoffeeScript
1### 2# できていないところ 3- 高さについて微調整が必要なときがある。 4- placeholderのcolorが取得できない。 5- Google Chrome以外での動作。 6### 7 8[document.getElementsByTagName('input')...].forEach (el) -> 9 waku = document.createElement('span') 10 wakuBody = document.createElement('span') 11 wakuSuffix = document.createElement('span') 12 13 waku.appendChild(wakuBody) 14 waku.appendChild(wakuSuffix) 15 16 waku.style.pointerEvents = 'none' 17 waku.style.overflow = 'hidden' 18 waku.style.whiteSpace = 'nowrap' 19 20 waku.style.position = 'absolute' 21 boderWidth = parseFloat(getComputedStyle(el, null).getPropertyValue('border')) 22 waku.style.top = "#{el.offsetTop + boderWidth}px" 23 waku.style.left = "#{el.offsetLeft + boderWidth}px" 24 waku.style.padding = window.getComputedStyle(el, null).getPropertyValue('padding') 25 waku.style.height = window.getComputedStyle(el, null).getPropertyValue('height') 26 waku.style.width = window.getComputedStyle(el, null).getPropertyValue('width') 27 waku.style.fontSize = window.getComputedStyle(el, null).getPropertyValue('font-size') 28 waku.style.fontFamily = window.getComputedStyle(el, null).getPropertyValue('font-family') 29 waku.style.fontWeight = window.getComputedStyle(el, null).getPropertyValue('font-weight') 30 31 # スタイルの情報には無いが、上下中央添えにする。 32 # 高さとかによってはたぶん微調整が必要。 33 waku.style.verticalAlign = 'middle' 34 trueHeight = 35 parseFloat(window.getComputedStyle(el, null).getPropertyValue('height')) - 36 parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-top')) - 37 parseFloat(window.getComputedStyle(el, null).getPropertyValue('padding-bottom')) 38 waku.style.lineHeight = "#{trueHeight}px" 39 40 wakuBody.style.zIndex = -1 41 wakuBody.style.opacity = 0 42 # ::placeholderは取得できないみたい。 43 # https://stackoverflow.com/questions/52355140/get-the-correct-placeholder-color-with-js 44 # wakuSuffix.style.color = window.getComputedStyle(el, '::placeholder').getPropertyValue('color') 45 # wakuSuffix.style.opacity = window.getComputedStyle(el, '::placeholder').getPropertyValue('opacity') 46 # うまくいかないので、透明度半分で固定 47 wakuSuffix.style.opacity = 0.5 48 wakuSuffix.innerText = el.placeholder 49 el.style.zIndex = 0 50 el.placeholder = '' 51 el.parentNode.insertBefore(waku, el.nextSibling) 52 53 el.addEventListener 'input', (e) -> 54 wakuBody.innerText = e.target.value 55 56# 下はフォーム送信の確認用 57document.getElementById('form').addEventListener 'submit', (e) -> 58 e.preventDefault() 59 console.log(new URLSearchParams(new FormData(e.target)).toString())
質問者の想定しているものがいまだによく理解できていませんが、質問文の要件を満たすものが「可能」か「不可能」かでいうと、「可能」が回答になると思います。
投稿2019/07/01 11:51
編集2019/07/01 21:51総合スコア21741
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2019/07/02 00:45

0
<input type="text" name="ball" value="個">
これでどうでしょうか?
※注釈
フォームの出力先にも「1個」という文字列を送りたい場合
投稿2019/06/29 03:50
編集2019/06/29 05:09総合スコア57
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/29 04:26
2019/06/29 20:00

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。