【JQuery】スマホ・タブレットでも使える、ひらがなソフトウェアキーボードを作ってみた
おはようございます。
今日はまた久しぶりに JQuery の話し。
まあ JQuery じゃなくてもいいんですが、簡単に実装できちゃうので使いますよね。
スマホやタブレットでは入力欄にフォーカスすると端末のキーボードが出てきますが、
それがちょっと使いにくい画面なんかでは自前でキーボードを実装した方がいい場合がありますよね。
スポンサーリンク
画面
こういった感じの、クリックして要素を表示する(メニューなど)ような動作を実現する場合は、
リスト要素(ul,li)を使うことが多いのですが、ちょっと自分が使いたい場面はテーブルの方が都合がよかったので。
常に全ての文字を表示しないのも、画面が狭い場合を考慮してのものです。
css
a:focus, *:focus {
outline:none;
}
.table-bordered > tbody > tr > td {
border: solid 2px #cccccc;
}
.dropdown > div.selected {
display: block;
}
.dropdown a {
display:block;
padding: 10px 0px;
color: black;
text-decoration: none;
}
.table-bordered > tbody > tr > td.dropdown:hover {
background-color: #f4c7aa;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #fcf8e3;
z-index: 1;
width: 50px;
top: 56px;
left: 0px;
}
.dropdown.selected > div {
display: block;
}
.dropdown-content a {
color: black;
padding: 10px 0px;
text-decoration: none;
display: block;
border: 1px solid #f4f4f4;
width: 50px;
height:50px;
}
.dropdown-content a:hover {
background-color: #f4c7aa;
}
.form-group {
margin:10px;
}
html
画面は、Bootstrapでちょっと見やすい感じにました。
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css"> <link rel="stylesheet" href="css/sample.css"> <script type="text/javascript" src="js/sample.js"></script> </head> <div class="wrapper"> <div class="container-fluid"> <div class="row"> <table class="table table-bordered table-keybord" style="margin: 0px;"> <tr> <td class="text-center warning dropdown"><a href="#">あ</a><div class="dropdown-content"><a href="#">い</a><a href="#">う</a><a href="#">え</a><a href="#">お</a></div></td> <td class="text-center warning dropdown"><a href="#">か</a><div class="dropdown-content"><a href="#">き</a><a href="#">く</a><a href="#">け</a><a href="#">こ</a></div></td> <td class="text-center warning dropdown"><a href="#">さ</a><div class="dropdown-content"><a href="#">し</a><a href="#">す</a><a href="#">せ</a><a href="#">そ</a></div></td> <td class="text-center warning dropdown"><a href="#">た</a><div class="dropdown-content"><a href="#">ち</a><a href="#">つ</a><a href="#">て</a><a href="#">と</a></div></td> <td class="text-center warning dropdown"><a href="#">な</a><div class="dropdown-content"><a href="#">に</a><a href="#">ぬ</a><a href="#">ね</a><a href="#">の</a></div></td> <td class="text-center warning dropdown"><a href="#">は</a><div class="dropdown-content"><a href="#">ひ</a><a href="#">ふ</a><a href="#">へ</a><a href="#">ほ</a></div></td> <td class="text-center warning dropdown"><a href="#">ま</a><div class="dropdown-content"><a href="#">み</a><a href="#">む</a><a href="#">め</a><a href="#">も</a></div></td> <td class="text-center warning dropdown"><a href="#">や</a><div class="dropdown-content"><a href="#">ゆ</a><a href="#">よ</a></div></td> <td class="text-center warning dropdown"><a href="#">ら</a><div class="dropdown-content"><a href="#">り</a><a href="#">る</a><a href="#">れ</a><a href="#">ろ</a></div></td> <td class="text-center warning dropdown"><a href="#">わ</a><div class="dropdown-content"><a href="#">を</a></div></td> <td class="text-center warning dropdown"><a href="#">ん</a><div class="dropdown-content"><a href="#">ー</a></div></td> <td class="text-center warning dropdown"><a href="#" class="dakuten">゛</a></td> <td class="text-center warning dropdown"><a href="#" class="handaku">゜</a></td> <td class="text-center warning dropdown"><a href="#" class="komoji">小</a></td> <td class="text-center warning dropdown"><a href="#" class="backspace"><i class="fa fa-backspace" /></a></td> </tr> </table> </div> <div class="row"> <form class="form-inline"> <div class="form-group"> <label>テキスト:</label> <input id="input-text" type="text" class="form-control" placeholder="入力"> </div> </form> </div> </div> </div> </html>
スクリプト
javascript
var voiced_list = {
'か' : ['か', 'が'],
'き' : ['き', 'ぎ'],
'く' : ['く', 'ぐ'],
'け' : ['け', 'げ'],
'こ' : ['こ', 'ご'],
'さ' : ['さ', 'ざ'],
'し' : ['し', 'じ'],
'す' : ['す', 'ず'],
'せ' : ['せ', 'ぜ'],
'そ' : ['そ', 'ぞ'],
'た' : ['た', 'だ'],
'ち' : ['ち', 'ぢ'],
'つ' : ['つ', 'づ'],
'て' : ['て', 'で'],
'と' : ['と', 'ど'],
'は' : ['は', 'ば', 'ぱ'],
'ひ' : ['ひ', 'び', 'ぴ'],
'ふ' : ['ふ', 'ぶ', 'ぷ'],
'へ' : ['へ', 'べ', 'ぺ'],
'ほ' : ['ほ', 'ぼ', 'ぽ'],
}
var lower_case = {
'あ' : ['あ', 'ぁ'],
'い' : ['い', 'ぃ'],
'う' : ['う', 'ぅ'],
'え' : ['え', 'ぇ'],
'お' : ['お', 'ぉ'],
'つ' : ['つ', 'っ'],
'や' : ['や', 'ゃ'],
'ゆ' : ['ゆ', 'ゅ'],
'よ' : ['よ', 'ょ'],
'わ' : ['わ', 'ゎ'],
}
$(function(){
// 文字クリック
$(".dropdown a").on("click", function(){
$(this).parents(".dropdown").siblings().removeClass("selected");
// サイズ調整
$(".dropdown-content").css("width", $(this).parents(".dropdown").css("width"));
$(".dropdown-content a").css("width", $(this).parents(".dropdown").css("width"));
// 1回選択でキーボード表示
// 2回目の選択で文字入力
if ($(this).parents(".dropdown").hasClass("selected")) {
setString(this, $("#input-text"));
$(this).parents(".dropdown").removeClass("selected");
} else {
$(this).parents(".dropdown").addClass("selected");
}
// 削除、濁点、半濁点、小文字は別途処理する
if ($(this).attr("class")) {
console.log("child other")
$(this).parents(".dropdown").removeClass("selected");
setString(this, $("#input-text"));
}
});
// フィルタ以外の場所が選択されたら閉じる
$(".wrapper").on("click", function(event) {
var target = $(event.target).parents();
if (!target.hasClass("dropdown")) {
$(target).find("td.selected, div.selected").removeClass("selected");
}
});
});
/**
* 濁点、半濁点に変換
*/
function convertChar(str, mode) {
if (mode == 3) {
for (item in lower_case) {
var hira = lower_case[item][0];
var lowe = lower_case[item][1];
if (str == hira) {
return lowe;
} else if (str == lowe) {
return hira;
}
}
} else {
for (item in voiced_list) {
var hira = voiced_list[item][0];
var daku = voiced_list[item][1];
var hann = "";
if (voiced_list[item][2]) {
hann = voiced_list[item][2];
}
if ((str == hira || str == hann) && mode == 1) {
return daku;
} else if ((str == hira || str == daku) && mode == 2) {
return hann;
} else if (str == daku || str == hann) {
return hira;
}
}
}
return str;
}
/**
* 文字をセット
*/
function setString(element, input) {
var value = $(input).val();
// 削除
if ($(element).hasClass("backspace")) {
if (value.length > 0) {
value = value.substring(0, value.length -1);
}
$(input).val(value);
return;
}
// 濁点
if ($(element).hasClass("dakuten")) {
if (value.length > 0) {
var char = value.substring(value.length -1, value.length);
value = value.substring(0, value.length -1);
$(input).val(value + convertChar(char, 1));
}
return;
}
// 半濁点
if ($(element).hasClass("handaku")) {
if (value.length > 0) {
var char = value.substring(value.length -1, value.length);
value = value.substring(0, value.length -1);
$(input).val(value + convertChar(char, 2));
}
return;
}
// 小文字
if ($(element).hasClass("komoji")) {
if (value.length > 0) {
var char = value.substring(value.length -1, value.length);
value = value.substring(0, value.length -1);
$(input).val(value + convertChar(char, 3));
}
return;
}
var text = $(element).text();
if (text != "") {
$(input).val(value + text);
}
}サンプルイメージ
初期表示。
各行の頭文字を横並びに表示。
試しに「た」をクリック、た行が表示される。
た行の中から「と」を選択、テキスト欄に入力される。
そのほか、濁音、半濁音、小文字、バックスペースに対応。
まとめ
結構使いどころは難しいかもしれませんが、
何かのお役に立てれば。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません