จัดแนวป้ายกำกับในแบบฟอร์มถัดจากอินพุต


140

ฉันมีสถานการณ์ของรูปแบบพื้นฐานและเป็นที่รู้จักซึ่งฉันต้องจัดแนวป้ายกำกับถัดจากอินพุตให้ถูกต้อง อย่างไรก็ตามฉันไม่รู้ว่าจะต้องทำอย่างไร

เป้าหมายของฉันคือการจัดเรียงป้ายกำกับถัดจากอินพุตทางด้านขวา นี่คือตัวอย่างรูปภาพของผลลัพธ์ที่ต้องการ

ป้อนคำอธิบายภาพที่นี่

ฉันทำซอเพื่อความสะดวกของคุณและเพื่อชี้แจงสิ่งที่ฉันมีตอนนี้ - http://jsfiddle.net/WX58z/

ตัวอย่างข้อมูล:

<div class="block">
    <label>Simple label</label>
    <input type="text" />
</div>
<div class="block">
    <label>Label with more text</label>
    <input type="text" />
</div>
<div class="block">
    <label>Short</label>
    <input type="text" />
</div>

คำตอบ:


198

คำเตือน: คำตอบที่ล้าสมัย

ทุกวันนี้คุณควรหลีกเลี่ยงการใช้ความกว้างคงที่อย่างแน่นอน คุณสามารถใช้ flexbox หรือ CSS grid เพื่อสร้างโซลูชันที่ตอบสนองได้ ดูคำตอบอื่น ๆ


ทางออกที่เป็นไปได้ทางเดียว:

  • ให้ฉลากdisplay: inline-block;
  • ให้ความกว้างคงที่
  • จัดแนวข้อความไปทางขวา

นั่นคือ:

label {
  display: inline-block;
  width: 140px;
  text-align: right;
}​
<div class="block">
    <label>Simple label</label>
    <input type="text" />
</div>
<div class="block">
    <label>Label with more text</label>
    <input type="text" />
</div>
<div class="block">
    <label>Short</label>
    <input type="text" />
</div>

JSFiddle


4
ฉันจะทำงานนี้ได้อย่างไรหากป้ายบางส่วนเป็นช่องทำเครื่องหมายหรือปุ่มตัวเลือก ป้ายกำกับสำหรับองค์ประกอบเหล่านี้จะมีความกว้างคงที่เช่นเดียวกับป้ายกำกับกล่องข้อความซึ่งไม่ต้องการ มีวิธีทำโดยไม่มีความกว้างคงที่บนฉลากหรือไม่?
Rebecca Meritz

@RebeccaMeritz คุณหมายถึงเมื่อมาร์กอัปมีช่องทำเครื่องหมายก่อนและป้ายกำกับหลังจากนั้น? คุณสามารถเพิ่มชั้นเรียนให้กับทั้งสองและจัดสไตล์แยกกัน บางทีคุณควรถามคำถามใหม่เกี่ยวกับเรื่องนี้
bfavaretto

2
จะตอบสนองอย่างไร? และวิธีรับมือกับ i18n? ฉันหมายความว่าป้ายข้อความมีความยาวแตกต่างกันในภาษาที่แตกต่างกันดังนั้นฉันจึงเกรงว่าการตั้งค่าความกว้างคงที่จะไม่สามารถใช้งานได้หากข้อความยาว
Azimuth

@Azimuth ปัจจุบันคุณอาจต้องการใช้ตาราง CSS แทน
bfavaretto

2
นี่คือการทำเครื่องหมายความกว้างคงที่ซึ่งควรเป็นแบบไดนามิกตามความกว้างของฉลากสูงสุด
Samyak Jain

33

แม้ว่าโซลูชันที่นี่จะใช้งานได้ แต่เทคโนโลยีล่าสุดได้สร้างขึ้นเพื่อสิ่งที่ฉันคิดว่าเป็นทางออกที่ดีกว่า CSS Grid Layoutช่วยให้เราจัดโครงสร้างโซลูชันที่สวยงามยิ่งขึ้น

CSS ด้านล่างมีโครงสร้าง "การตั้งค่า" 2 คอลัมน์โดยคอลัมน์แรกคาดว่าจะเป็นป้ายกำกับที่จัดชิดขวาตามด้วยเนื้อหาบางส่วนในคอลัมน์ที่สอง สามารถนำเสนอเนื้อหาที่ซับซ้อนมากขึ้นในคอลัมน์ที่สองโดยการรวมไว้ใน <div>

[หมายเหตุด้านข้าง: ฉันใช้ CSS เพื่อเพิ่ม ":" ที่ลากเส้นป้ายกำกับแต่ละป้ายเนื่องจากนี่เป็นองค์ประกอบที่มีสไตล์ - ความชอบของฉัน]

/* CSS */

div.settings {
    display:grid;
    grid-template-columns: max-content max-content;
    grid-gap:5px;
}
div.settings label       { text-align:right; }
div.settings label:after { content: ":"; }
<!-- HTML -->

<div class="settings">
    <label>Label #1</label>
    <input type="text" />

    <label>Long Label #2</label>
    <span>Display content</span>

    <label>Label #3</label>
    <input type="text" />
</div>


1
เฮ้คุณช่วยเพิ่มซอได้ไหม
สแตน

ใช่ฉันได้อัปเดตคำตอบเพื่อใช้ประโยชน์จากตัวอย่างข้อมูลแล้ว
David Rutherford

Chrome เวอร์ชันและแพลตฟอร์มใดที่คุณมีปัญหา
David Rutherford

1
ทางออกที่ดีที่สุด! ใช้งานได้ดีใน Chrome 73
Philipp Michalski

สุดยอด! หากคุณแทนที่คำจำกัดความของคอลัมน์ด้านบนgrid-template-columns: max-content 1fr;คอลัมน์ที่สองจะใช้ความกว้างที่เหลือทั้งหมด สำหรับฉันแล้วนี่คือจอกศักดิ์สิทธิ์ของเลย์เอาต์ดังกล่าวซึ่งไม่ต้องระบุคอลัมน์หรือความกว้างของเนื้อหาและทุกอย่างจะเข้ากันได้ดีกับพื้นที่ว่างโดยอัตโนมัติ
jeff-h

12

ตอบคำถามเช่นนี้มาก่อนคุณสามารถดูผลลัพธ์ได้ที่นี่:

การสร้างฟอร์มให้มีเขตข้อมูลและข้อความอยู่ติดกัน - วิธีการเชิงความหมายคืออะไร?

ดังนั้นในการใช้กฎเดียวกันกับซอของคุณคุณสามารถใช้display:inline-blockเพื่อแสดงป้ายกำกับและกลุ่มอินพุตของคุณเคียงข้างกันดังนี้:

CSS

input {
    margin-top: 5px;
    margin-bottom: 5px;
    display:inline-block;
    *display: inline;     /* for IE7*/
    zoom:1;              /* for IE7*/
    vertical-align:middle;
    margin-left:20px
}

label {
    display:inline-block;
    *display: inline;     /* for IE7*/
    zoom:1;              /* for IE7*/
    float: left;
    padding-top: 5px;
    text-align: right;
    width: 140px;
}

ปรับปรุงซอ


นี่เป็นวิธีการแก้ปัญหาที่ดีมากยกเว้นว่าคุณต้องฮาร์ดโค้ดตามความกว้างของป้ายกำกับ หากป้ายกำกับใหม่ยาวเกินไปเลย์เอาต์จะแตก ดูเหมือนว่าควรมีวิธีแก้ปัญหาที่แข็งแกร่งกว่านี้หรือไม่?
mattstuehler

8

ฉันใช้สิ่งที่คล้ายกับสิ่งนี้:

<div class="form-element">
  <label for="foo">Long Label</label>
  <input type="text" name="foo" id="foo" />
</div>

สไตล์:

.form-element label {
    display: inline-block;
    width: 150px;
}

4

คุณยังสามารถลองใช้เฟล็กบ็อกซ์

<head><style>
body {
    color:white;
    font-family:arial;
    font-size:1.2em;
}
form {
    margin:0 auto;
    padding:20px;
    background:#444;
}
.input-group {
    margin-top:10px;
    width:60%;
    display:flex;
    justify-content:space-between;
    flex-wrap:wrap;
}
label, input {
    flex-basis:100px;
}
</style></head>
<body>

<form>
    <div class="wrapper">
        <div class="input-group">
            <label for="user_name">name:</label>
            <input type="text" id="user_name">
        </div>
        <div class="input-group">
            <label for="user_pass">Password:</label>
            <input type="password" id="user_pass">
        </div>
    </div>
</form>

</body>
</html>

นั่นเป็นสิ่งที่สวยงาม แต่ไม่ใช่สิ่งที่เขาขอ ดูภาพใน op
phorgan1

3

ฉันรู้ว่านี่เป็นเธรดเก่า แต่วิธีแก้ปัญหาที่ง่ายกว่าคือการฝังอินพุตไว้ในป้ายกำกับดังนี้:

<label>Label one: <input id="input1" type="text"></label>


ฉันกำลังมองหาวิธีแก้ปัญหานี้ (รวมอินพุตไว้ในป้ายกำกับ) แต่มีข้อความที่สอดคล้องกัน
Natim

0

นี่คือความกว้างของป้ายทั่วไปสำหรับป้ายทุกรูปแบบ ไม่มีอะไรแก้ไขความกว้าง

เรียกเครื่องคิดเลข setLabelWidth พร้อมป้ายกำกับทั้งหมด ฟังก์ชันนี้จะโหลดป้ายกำกับทั้งหมดบน UI และค้นหาความกว้างของฉลากสูงสุด ใช้ค่าส่งคืนของฟังก์ชันด้านล่างกับป้ายกำกับทั้งหมด

     this.setLabelWidth = function (labels) {
            var d = labels.join('<br>'),
                dummyelm = jQuery("#lblWidthCalcHolder"),
                width;
            dummyelm.empty().html(d);
            width = Math.ceil(dummyelm[0].getBoundingClientRect().width);
            width = width > 0 ? width + 5: width;
            //this.resetLabels(); //to reset labels.
            var element = angular.element("#lblWidthCalcHolder")[0];
            element.style.visibility = "hidden";
            //Removing all the lables from the element as width is calculated and the element is hidden
            element.innerHTML = "";
            return {
                width: width,
                validWidth: width !== 0
            };

        };

0

คุณสามารถทำสิ่งนี้:

HTML:

<div class='div'>
<label>Something</label>
<input type='text' class='input'/>
<div>

CSS:

.div{
      margin-bottom: 10px;
      display: grid;
      grid-template-columns: 1fr 4fr;
}

.input{
       width: 50%;
}

หวังว่านี่จะช่วยได้! :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.