1

状況:

複数のページにわたる質問の長いリストを含むサイトがあります。

各質問は、ラベルと入力で構成されています。質問 div のグループは、追加の div 内にあり、グループ化やボーダー スタイルなどを提供します。

問題:

質問に番号を付けたいのですが、番号付けのハードコーディングは避けたいです。<li>ただし、 をdiv またはラベル内に配置するのは無効な htmlです。

さらに、一部の質問 div は、ユーザー入力に応じて条件付きで非表示または表示されます。したがって、div は重要な機能を提供し、数字はこれらの div とともに非表示および表示する必要があります (そのため、それぞれ<li>を div の外側に配置すると問題が発生します。

コード:

これは、2 つの質問「ブロック」を示す、私のフォームの簡素化された構造の例です。

<form id="myform" method="post" action="/destinaion/page.php">
    <div class="formfield">
        <div class="page1">
            <div class="lowerborder">
                <div class="question">                      
                    <label for="q2">Question 1</label> 
                    <input type="number" id="q1" name="q1"/>
                </div>

                <div class="question">                      
                    <label for="q1">Question 2</label> 
                    <input type="number" id="q2" name="q2"/>
                </div>
            </div>
        </div>
    </div>
</form>

div クラスのフォーム フィールドにはフォーム ページが含まれ、page1 にはページ 1 のさまざまなスタイリングの詳細が含まれます。

質問から順序付きリストを作成したいのですが、おそらく次のようなものです

目標達成の試み:

<form id="myform" method="post" action="/destination/page.php">
    <div class="formfield">
    <ol>
        <div class="page1">
            <div class="lowerborder">
                <div class="question">                      
                    <label for="q2"><li>Question 1</li></label> 
                    <input type="number" id="q1" name="q1"/>
                </div>

                <div class="question">                      
                    <label for="q1"><li>Question 2</li></label> 
                    <input type="number" id="q2" name="q2"/>
                </div>
            </div>
        </div>
    </ol>
    </div>
</form>

しかし、ご覧のとおり、a) 有効な html ではなく、b) すべてのブラウザーでうまく動作しない を<li>入れています。<label>

<li>リスト項目が多数のネストされた div で区切られている場合、無効な親内に要素を配置しないようにするにはどうすればよいですか?

jsFiddle:

上記の試行のフィドルを参照してください。私が達成しようとしているいくつかのスタイリングと機能を含めます(ネストされたdivによるスタイリング、明らかにする隠された質問など)

4

1 に答える 1

4

他の要素を挿入せずに必要なすべてを実行する方法を示すこのフィドルを参照してください。私はどこにも単一のdivの必要性さえ見つけませんでした。

注:私は最初float:left、回答を適切に並べるために質問に使用しました。ただし、これにより、IEは質問の左側ではなく、回答のすぐ左側の数字をレンダリングしました。使用に切り替えたところdisplay:inline-block、すべてがIEでも機能するようになりました。

コメント:

  • いくつかのセクションが繰り返され、スタイルルールが矛盾しているスタイルシートをクリーンアップしました。不要なルールを削除しました。

  • クラスを使用して質問のグループを区切る線を作成し、質問の下部ではなく上部の境界線にも適用するようにしました。これにより、非表示の質問なので、グループを終了する非表示の質問がある場合でも使用できます。おそらくグループを始めることはないでしょう。追加の要素に境界線を付ける必要はありませんでした。

  • 私の意見では、「Reveal」チェックボックスのラベルはその横のテキストである必要があります。これにより、そのテキストをクリックしてチェックボックスをオンまたはオフにすることができます。そのため、ラベルを使用するのではなく、質問であるアイテムに「質問」クラスを追加しました。適切なスタイルにするために、スタイル「質問」を質問に適用する必要があります。これをラベル要素(他の何かのためであるかどうかに関係なく)に適用するか、スパンまたは他の要素を使用して、ラベルでない場合にテキストを含めることができます。

  • IE 7は、質問のスタイルが。であるにもかかわらず、ばかげて数字を行の一番下に配置しvertical-align:topます。現時点ではそれを修正する方法はわかりませんが、CSSの癖の私よりも専門家にとっては別の質問になる可能性があります。

  • IEは「非表示」メソッドをうまく処理できず、余分なスペースを取り、子要素が表示されないことを明らかにするときに、代わりに絶対位置を使用しました(ドキュメントフローから削除することで同じ効果があります)。仕組みについては、CSSを参照してください。

  • リビールスクリプトを適用する方法を変更しました。個々のアイテムを手動で配線する代わりに、チェックボックス自体にデータ値を設定し、準備完了イベントでそれを使用してページを適切に配線します。公開された質問にIDを追加するだけで(または一度に複数の質問を公開する必要がある場合は代わりにクラスを使用して)、より多くの質問を公開するチェックボックスと、data-togglehidden="l4"IDを指定して右に切り替えるデータエキスパンド属性を設定できるようになりました。チェックボックス要素。スクリプトを変更する必要はありません。

  • あなたが「div-itis」を持っているかもしれないように少し見えます。それは至る所でdivを増やす傾向です。恥ずかしがる必要はありません。HTML開発に不慣れだったとき、私もdiv-itisを経験しました。あなたはこのような経験のためにそれから成長するでしょう。一般に、divでラップしてスタイルを設定するのではなく、通常の非divページ要素を使用して直接スタイルを設定する必要があります。Divは、関連する機能のグループのスタイルを設定したり、さまざまな要素のボックスを提供したりする必要がある場合に役立ちます。divを不適切に使用している可能性がある1つのヒントは、それらに1つのアイテム(特に別のdiv)しかない場合です。それが必要な場合もありますが、自問してみてください。代わりに、スタイルを親要素または子要素に移動できますか?

  • あなたが言及し、元のhtmlマークアップに含まれていた「ページ」がどのように機能するかについてもっと知る必要があります。htmlにはページなく、htmlが印刷される場合のみです。そのため、それが何を意味するのか、またはページのスタイルを設定する方法がよくわかりません。

olとliの間に追加の要素を必要とせずに、クリーンアップされたhtmlを次に示します。

<form id="myform" method="post" action="/destination/page.php">
    <ol class="formfield">
        <li>
            <label class="question" for="q1">What is your first name?</label>
            <input type="text" id="q1" name="q1"/>
        </li>
        <li>
            <label class="question" for="q2">A very long question 2 that is sure to run to a second line just to prove that such a thing will work properly and not mess up the layout, described in your own words?</label>
            <input type="text" id="q2" name="q2"/>
        </li>
        <li class="begingroup">
            <span class="question">Are you the type of person who likes to needlessly answer extra questions?</span>
            <input type="checkbox" id="q3" name="q3" data-togglehidden="l4"/>
            <label for="q3">Yes, yes, that's me!!!</label>
        </li>
        <li id="l4" class="hidden">
            <label class="question" for="q4">Why do you like to do extra needless work?</label>
            <input type="text" id="q4" name="q4"/>
        </li>
        <li class="begingroup">
            <label class="question" for="q5">What was your first pet's name?</label>
            <input type="text" id="q5" name="q5"/>
        </li>
    </ol>
</form>

Firefox16.0.2では次のようになります。Firefox16.0.2のフォーム

そしてIE7.0.5730.13COでは:IE7.0.5730.13COのフォーム

CSS:

ol.formfield {
    width: 500px;
    margin: 10px auto;
    padding: 16px 16px 16px 0;
    border: 5px groove #005E9B;
    list-style: decimal outside;
    color: black;
    background-color: #6Fc2F7;    
    font-family: 'Oxygen', sans-serif;
    font-size:15px;
}

ol.formfield li {
    clear: both;
    padding: 2px;
    margin-left: 1.7em;
}

ol.formfield li.begingroup {
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px solid #005E9B;
}

.question {
    display:inline-block;
    width:300px;
    vertical-align:top;      
}

.hidden {
    position: absolute;
    height: 0;
    width: 0;
    overflow: hidden;
}

ol.formfield input {
    border-radius:5px; /* css 3 */
    -moz-border-radius:5px; /* mozilla */
    -webkit-border-radius:5px; /* webkit */
}

dataそして、要素の値に基づいて非表示/表示を接続するスクリプト:

$('ol.formfield input:checkbox')
    .each(function() {
        var d = $(this).data('togglehidden');
        if(d) {
            $(this).on('change', function() {
                if ($(this).attr('checked')) {     
                    $('#' + d)
                        .removeClass('hidden')
                        .find(':input')
                        .focus();
                } else {
                    $('#' + d).addClass('hidden');
                }
            });
        }
    });
于 2012-11-21T01:47:04.810 に答える