2011/07/25

属性セレクタ

属性セレクタとは、CSS側から「属性」を指定することができる機能です。
要素[属性=値]
例えば、input要素のtype属性が”tel”のものだけに効果を適用するには、以下のように指定します。
input[type=”tel”]
属性セレクタには、この他に以下の物があります。

属性セレクタ内容
要素[属性^=値]属性が「値」で開始する要素
要素[属性$=値]属性が「値」で終了する要素
要素[属性*=値]属性が「値」を含む要素

下の例では、INPUT要素の「type属性」毎に枠の色と形、太さを変えています。



氏名:

電話:

メール:


<style type="text/css">
input[type="text"] {
    border-radius:8px;
    border:1px solid #000000;
}
input[type="tel"] {
    border-radius:4px;
    border:2px solid #AAAAFF;
}
input[type="email"] {
    border-radius:2px;
    border:2px solid #FF0000;
}
</style>
氏名:<input type="text" name="name"><br>
電話:<input type="tel" name="tel"><br>
メール:<input type="email" name="email"><br>

要素セレクタ2

要素セレクタ1の続きです。

下の例は セレクタの「nth-of-type」を使って「冷やし中華」の部分だけを目立たせています。



あんこシューマイ
いちご餃子
アイスニラレバ
アメチャーハン
チョコ冷やし中華

<style type="text/css">
tr:nth-child(odd) {
    background-color:#CCFFFF;
}
tr:nth-child(even) {
    background-color:#FFFFFF;
}
tr:nth-of-type(5)
td:nth-of-type(2) {
    background-color:#FFFF55;
}
</style>
<table border="1" boardercolor="#0000FF">
<tr><td>あんこ</td><td>シューマイ</td></tr>
<tr><td>いちご</td><td>餃子</td></tr>
<tr><td>アイス</td><td>ニラレバ</td></tr>
<tr><td>アメ</td><td>チャーハン</td></tr>
<tr><td>チョコ</td><td>冷やし中華</td></tr>
</table>


セレクタには他に以下の物があります。
下の表もテーブルを使用しているので黄色い部分がありますが(CSSが効いているためです。)、気にしないで下さい。








セレクタ内容
nth-child(条件)前から「条件」要素の指定
nth-last-child(条件)後ろから「条件」要素の指定
nth-of-type(条件)同一要素を対象として、前から「条件」要素の指定
nth-last-of-type(条件)同一要素を対象として、後ろから「条件」要素の指定
first-child最初の要素の指定
last-child最後の要素の指定

要素セレクタ1

要素セレクタとは、CSS側から要素を指定することができる機能です。
例えば、CSSでテーブルの特定セル(要素)の色を変えたりすることができます。
下の例は、行(tr)要素の奇数(Odd)の色を水色に、偶数(Even)の色を白色に変更しています。



あんこシューマイ
いちご餃子
アイスニラレバ
アメチャーハン
チョコ冷やし中華

<style type="text/css">
tr:nth-child(odd) {
    background-color:#CCFFFF;
}
tr:nth-child(even) {
    background-color:#FFFFFF;
}
</style>
<table border="1" boardercolor="#0000FF">
<tr><td>あんこ</td><td>シューマイ</td></tr>
<tr><td>いちご</td><td>餃子</td></tr>
<tr><td>アイス</td><td>ニラレバ</td></tr>
<tr><td>アメ</td><td>チャーハン</td></tr>
<tr><td>チョコ</td><td>冷やし中華</td></tr>
</table>

入力要素のチェック2

JavaScriptからValidityのエラー詳細を取得することができます。

名前内容
element.willValidate入力チェックが行われるか(true/false)
element.setCustomerValidity(エラーメッセージ)任意のエラーメッセージをセット
element.validity.valueMissing入力必須(required属性)なのに入力がない場合true
element.validity.valueTypeMismatchpattern属性のパターンに一致しない場合true
element.validity.tooLongmaxlengthより入力文字数が長い場合にtrue
element.validity.rangeUnderflowmin属性より値が小さい場合にtrue
element.validity.rangeOverflowmax属性より値が大きい場合にtrue
element.validity.stepMismatch入力値がstep属性で指定された値と一致しない場合にtrue
element.validity.customError独自エラーが設定されている場合にtrue
element.validity.valid入力チェックを全て通る場合にtrue
element.validity.checkValidity()入力チェックを全て通る場合にtrue。falseの場合にinvalidイベントを生成
element.validity.validationMessage入力チェックが行われた際のエラーメッセージを返却


下の例は、フォームに値を入力してから「送信」ボタンを押すとチェック結果が表示されます。


氏名:
年齢:
住所:
メールアドレス:
電話番号:



<script type="text/javascript">
function check() {
    var f = document.myForm;
    var items = f.elements;
    var len = items.length;
    for(var i=0;i<len;i++){
        var elm = items.item(i);
        if (elm.nodeName == "INPUT" && elm.validity){
            var elm_error = f.querySelector("#" + elm.name + "_error");
            if(elm_error) elm_error.innerHTML = "";
            // 入力値エラーだった場合
            if(elm.validity.valid == false) {
                // 入力値エラーの種類の判定とエラー・メッセージの定義
                var err_msg = "";
                // 必須入力に値がない場合
                if(elm.validity.valueMissing) {
                    err_msg = "入力をご確認ください。";
                }
                // 入力タイプが違う場合
                else if(elm.validity.typeMismatch) {
                    err_msg = "入力フォーマットをご確認ください。";
                }
                // 入力パターンが違う場合
                else if(elm.validity.patternMismatch) {
                    err_msg = "入力形式をご確認ください。";
                }
                // 入力数値が小さすぎる場合
                else if(elm.validity.rangeUnderflow) {
                    err_msg = "18歳未満は受付できません。";
                }
                // 入力数値が最大値を超える場合
                else if(elm.validity.rangeOverflow) {
                    err_msg = "66歳以上は受付できません。";
                }
                // 入力内容が最大長を超える場合
                else if(elm.validity.tooLong) {
                    err_msg = "入力内容が長すぎます。";
                }
                // その他のエラー
                else {
                    err_msg = "入力内容をご確認ください。";
                }
                // エラーメッセージ表示
                if(elm_error) elm_error.innerHTML = err_msg;
            }
        }
    }
}
</script>
<form id="personInfo" name="myForm" action="">
    <p>氏名: <input type="text" name="name" maxlength="5" required placeholder="名前を入力します。">
                 <span id="name_error" style="color: #FF0000;"></span></p><br>
    <p>年齢:<input type="number" name="age" min="18" max="65" required placeholder="年齢を数値で入力します。">
                 <span id="age_error" style="color: #FF0000;"></span></p><br>
    <p>住所: <input type="text" name="address" required placeholder="東京都渋谷区・・">
                 <span id="address_error" style="color: #FF0000;"></span></p><br>
    <p>メールアドレス: <input type="email" name="email" required placeholder="xxxx@google.com">
                 <span id="email_error" style="color: #FF0000;"></span></p><br>
    <p>電話番号: <input type="tel" name="tel" required pattern="[0-9]{2,4}-[0-9]{2,4}-[0-9]{4}" placeholder="03-1234-5678">
                 <span id="tel_error" style="color: #FF0000;"></span></p><br>
    <p><button type="button" onclick="check()">送信</button></p>
</form>

入力要素のチェック1

form欄で入力された値をjavascriptから参照するには、validityプロパティを使用します。
下の例は、送信ボタンが押された時に入力欄のチェック結果をjavascriptのalertを使って表示します。



電話番号:

<script type="text/javascript">
function check() {
    var result = document.myForm.phone.validity;
    window.alert(result.valid);
}
</script>
<form id="validitySample" name="myForm" action="">
電話番号:<input type="tel" name="phone" pattern="[0-9]{12}" required>
<button type="submit" onclick="check()">送信</button>
</form>

formの入力要素をform外で指定する

formで入力要素を外部の要素と関連づけるには、fieldset要素を使います。
fieldsetを使うとform要素から外部の要素が呼び出せるようになります。


名前:

電話:

メール:

住所:


<fieldset form="personinfo">
名前:<input type="text" name="name" size="40"><br>
電話:<input type="tel" name="tel" size="12"><br>
メール:<input type="email" name="email"><br>
住所:<input type="text" name="address" size="20"><br>
</fieldset>
<form id="personinfo" action="" method="post">
    <button type="submit">送信</button>
</form>

決まった型での値入力

入力欄の型が決まっている場合、入力値を決まったパターンに強制させることができます。
pattern属性で定型文字列を指定し、required属性で入力必須かどうかを指定します。
inputのtypeがemail/password/search/tel/text/urlの場合に型を指定することができます。

formのアクション実行時にパターンのチェックや必須項目かのチェックがクライアント側で行われ、エラーの場合はメッセージが表示されます。パターンは正規表現で指定します。正規表現についてはそれだけで1冊の本ができてしまう位奥深いので、本サイトでの説明は省略します。


カード番号:

<form name="creditcard" action="">
カード番号:<input type="text" name="number" pattern="[0-9]{16}" required title="16桁のカード番号を入力して下さい。" placeholder="0123456789012345">
</form>

novalidate属性を付けるとチェックを行わないように指定することもできます。
ただし、本項執筆時点では対応しているブラウザは存在しないようです。


カード番号:

<form name="creditcard" action="">
カード番号:<input type="text" name="number" pattern="[0-9]{16}" required title="16桁のカード番号を入力して下さい。" placeholder="0123456789012345" novalidate>
</form>