ขนาดอินพุตกับความกว้าง


231
<input name="txtId" type="text" size="20" />

หรือ

<input name="txtId" type="text" style="width: 150px;" />

สิ่งที่เป็นรหัสข้ามเบราว์เซอร์ที่ดีที่สุด?

แน่นอนมันขึ้นอยู่กับข้อกำหนด แต่ฉันอยากรู้ว่าผู้คนตัดสินใจอย่างไรและพื้นฐานอะไร


17
มันเป็นความคิดที่ดีที่จะใช้ "px" บนเว็บ คุณอาจลองใช้หน่วยที่เกี่ยวข้องแทน ("em", "%" ฯลฯ )
kangax

37
@kangax เป็นเพียงความคิดเห็นเดียว ไม่มีความเห็นเป็นเอกฉันท์เกี่ยวกับการใช้งาน px
Kos

7
@ คอสมันเป็นฉันทามติ ไม่ใช่อีกต่อไป (ด้วย IE และเบราว์เซอร์เก่าอื่น ๆ ) ที่ล่วงลับไปแล้ว
kangax

9
@ Kangax ฉันไม่เคยได้รับบันทึกนั้น ... ฉันใช้ px ตลอดเวลาและมีอยู่เสมอ
Andrew

คำตอบ:


180

คุณสามารถใช้ทั้งสอง สไตล์ css จะแทนที่sizeแอตทริบิวต์ในเบราว์เซอร์ที่สนับสนุน CSS และทำให้ฟิลด์มีความกว้างที่ถูกต้องและสำหรับที่ไม่เป็นเช่นนั้นก็จะถอยกลับไปตามจำนวนอักขระที่ระบุ

แก้ไข:ฉันควรจะได้กล่าวถึงว่าsizeแอตทริบิวต์ไม่ได้เป็นวิธีที่แม่นยำของการปรับขนาด: ตามข้อกำหนด HTMLก็ควรจะหมายถึงจำนวนตัวอักษรของตัวอักษรในปัจจุบันการป้อนข้อมูลที่จะสามารถที่จะแสดงในครั้งเดียว

อย่างไรก็ตามเว้นแต่แบบอักษรที่ระบุเป็นแบบอักษรที่มีความกว้างคงที่ / monospace นี่ไม่ใช่การรับประกันว่าจำนวนตัวอักษรที่ระบุจะปรากฏให้เห็นจริง ในฟอนต์ส่วนใหญ่อักขระที่แตกต่างจะมีความกว้างต่างกัน คำถามนี้มีคำตอบที่ดีเกี่ยวกับปัญหานี้

ตัวอย่างด้านล่างแสดงให้เห็นถึงทั้งสองวิธี

@font-face {
    font-family: 'Diplomata';
    font-style: normal;
    font-weight: 400;
    src: local('Diplomata'), local('Diplomata-Regular'), url(https://fonts.gstatic.com/s/diplomata/v8/8UgOK_RUxkBbV-q561I6kFtXRa8TVwTICgirnJhmVJw.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
@font-face {
    font-family: 'Open Sans Condensed';
    font-style: normal;
    font-weight: 300;
    src: local('Open Sans Condensed Light'), local('OpenSansCondensed-Light'), url(https://fonts.gstatic.com/s/opensanscondensed/v11/gk5FxslNkTTHtojXrkp-xBEur64QvLD-0IbiAdTUNXE.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
p {
  margin: 0 0 10px 0;
}
input {
  font-size: 20px;
}
.narrow-font {
  font-family: 'Open Sans Condensed', sans-serif;
}
.wide-font {
  font-family: 'Diplomata', cursive;
}
.set-width {
  width: 220px;
}
<p>
  <input type="text" size="10" class="narrow-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="narrow-font set-width" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font set-width" value="0123456789" />
</p>


2
@ Mark B. ขอบคุณสำหรับคำตอบของคุณ ฉันใช้แบบอินไลน์เพื่อถามคำถามที่นี่
rajakvk

ไม่ต้องกังวล - ฉันคิดว่าคุณอาจมี แต่ฉันเพิ่งจะชี้ให้เห็นในกรณี
Mark Bell

แบบอักษรส่วนใหญ่ไม่กว้างแบบโมโน เกี่ยวกับ "จำนวนตัวอักษรในฟิลด์จะสามารถแสดงในครั้งเดียว" .... ตัวละครใดที่คุณหมายถึง?
Pacerier

@Pacerier จำนวนตัวอักษรที่ใช้ในการป้อนแบบอักษร: jsbin.com/zimako/1
Mark Bell

1
@ jbyrd ใช่นั่นเป็นกรณี - แต่คำตอบนั้นถูกต้องตามข้อกำหนดของ HTML ฉันได้แก้ไขคำตอบแล้วเพื่อชี้แจงสิ่งเล็กน้อย
Mark Bell

49

ฉันขอแนะนำวิธีที่ดีที่สุดคือตั้งค่าความกว้างของสไตล์ในหน่วย em :) ดังนั้นสำหรับขนาดอินพุต 20 ตัวอักษรที่ตั้งค่าไว้style='width:20em':)


4
จุดที่น่าสนใจอย่างไรก็ตามในความกว้างของการทดสอบของฉัน: 20em ทำให้อินพุตมีขนาดใหญ่กว่า 20 อักขระ
Christophe

32
"em" คือการวัดความสูงของตัวละคร 'M' นั่นคือสาเหตุที่กล่องมีขนาดใหญ่เกินไป
humbads

9
ใน CSS em จะสัมพันธ์กับขนาดตัวอักษรของพาเรนต์โดยตรงหรือใกล้เคียงที่สุด ตัวอย่าง: หากขนาดตัวอักษรที่สืบทอดมาขององค์ประกอบคือ 16px และคุณตั้งค่าขนาดตัวอักษรเป็น 2em ขนาดผลลัพธ์จะเป็น 32px (16px * 2em) หน่วย "em" ไม่ใช่ปริมาณอักขระ เพิ่มเติม: w3.org/TR/css3-values/#font-relative-lengthsและkyleschaeffer.com/development/css-font-size-em-vs-px-vs-pt-vsและj.eremy.net/confused -about-rem-and-em
delroh

1
@humbads คุณไม่ได้หมายถึงการวัดความกว้างของตัวละคร 'M' ใช่ไหม
Jess

5
@ เจสคำถามที่ดี ในการพิมพ์ตัวอักษร 'em' ใช้เพื่อหมายถึงความกว้างของตัวอักษร 'M' เป็นเวลานานฉันเชื่อในสิ่งเดียวกัน อย่างไรก็ตามใน CSS และการพิมพ์ดิจิทัลตัวอักษร 'em' จะเท่ากับความสูงของแบบอักษรเป็นแต้ม นี่คือเพื่อรองรับชุดอักขระที่ไม่มีอักขระ 'M' หรือตำแหน่ง 'M' ไม่ใช่ความสูงหรือความกว้างทั้งหมดของแบบอักษร
humbads

21

size ไม่สอดคล้องกันในเบราว์เซอร์ที่แตกต่างกันและการตั้งค่าแบบอักษรที่เป็นไปได้

widthชุดในรูปแบบพิกเซลอย่างน้อยจะให้สอดคล้อง modulo ปัญหากล่องขนาด คุณอาจต้องการกำหนดรูปแบบใน 'em' หากคุณต้องการกำหนดขนาดให้สัมพันธ์กับแบบอักษร (แม้ว่าอีกครั้งสิ่งนี้จะไม่สอดคล้องกันเว้นแต่คุณจะตั้งค่าfontตระกูลและขนาดอินพุตของคุณอย่างชัดเจน) หรือ '%' หากคุณสร้าง แบบฟอร์มเลย์เอาต์ของเหลว ไม่ว่าจะด้วยวิธีใดสไตล์ชีตอาจเป็นที่นิยมในstyleแอตทริบิวต์inline

คุณยังคงต้องsizeสำหรับการ<select multiple>ที่จะได้รับความสูงที่สอดรับกับตัวเลือกที่ถูกต้อง <input>แต่ฉันได้ใช้มันใน


13

ฉันอยากจะบอกว่านี่ขัดกับ "ภูมิปัญญาดั้งเดิม" แต่โดยทั่วไปฉันชอบที่จะใช้ขนาด เหตุผลนี้เป็นเหตุผลที่หลายคนบอกว่าไม่: ความกว้างของฟิลด์จะแตกต่างกันไปในแต่ละเบราว์เซอร์ขึ้นอยู่กับขนาดตัวอักษร โดยเฉพาะจะมีขนาดใหญ่พอที่จะแสดงจำนวนอักขระที่ระบุโดยไม่คำนึงถึงการตั้งค่าเบราว์เซอร์

ตัวอย่างเช่นถ้าฉันมีฟิลด์วันที่ฉันมักจะต้องการฟิลด์ที่กว้างพอที่จะแสดงอักขระ 8 หรือ 10 ตัว (สองหลักเดือนและวันและทั้งปีสองหรือสี่หลักพร้อมตัวคั่น) การตั้งค่าคุณลักษณะขนาดรับประกันได้ว่าฉันจะเห็นวันที่ทั้งวันได้โดยไม่ต้องเปลืองเนื้อที่ ในทำนองเดียวกันสำหรับตัวเลขส่วนใหญ่ - ฉันทราบช่วงของค่าที่คาดหวังดังนั้นฉันจะตั้งค่าคุณลักษณะขนาดเป็นจำนวนหลักที่เหมาะสมรวมถึงจุดทศนิยมถ้ามี

เท่าที่ฉันสามารถบอกได้ว่าไม่มีคุณลักษณะ CSS ทำเช่นนี้ ตัวอย่างเช่นการตั้งค่าความกว้างเป็น em จะขึ้นอยู่กับความสูงไม่ใช่ความกว้างและดังนั้นจึงไม่แม่นยำมากหากคุณต้องการแสดงจำนวนอักขระที่ทราบ

แน่นอนว่าตรรกะนี้ไม่ได้นำไปใช้เสมอ - ตัวอย่างเช่นฟิลด์ป้อนชื่ออาจมีอักขระจำนวนเท่าใดก็ได้ ในกรณีเหล่านั้นฉันจะย้อนกลับไปยังคุณสมบัติความกว้าง CSS โดยทั่วไปจะเป็น px แต่ผมจะบอกว่าส่วนใหญ่ของฟิลด์ฉันจะทำให้มีการจัดเรียงเนื้อหาที่รู้จักกันบางส่วนและแอตทริบิวต์โดยระบุขนาดที่ผมสามารถตรวจสอบว่าส่วนใหญ่ของเนื้อหาในที่สุดกรณีจะปรากฏโดยไม่ต้องตัด


คุณยังสามารถใช้exหน่วยนี้ได้แม้ว่าการใช้ขนาดยังคงช่วยลดความซับซ้อนของกรณีส่วนใหญ่โดยไม่มีรหัส / คลาสใน css ของคุณสำหรับความกว้าง
สี่สิบ

@Forty จริงๆแล้วคุณทำไม่ได้ exเป็นความสูงของตัวอักษร (เฉพาะ "X") ไม่ใช่ความกว้าง - emเช่นเดียวกับ เนื่องจากไม่มีความสัมพันธ์ที่แน่นอนระหว่างความสูงและความกว้างของอักขระ (x หรืออย่างอื่น) จึงไม่มีเหตุผลที่จะเชื่อว่าการใช้ความสูงของอักขระเพื่อกำหนดความกว้างของฟิลด์จะทำให้ฟิลด์มีความกว้างที่เหมาะสมเพื่อแสดง จำนวนอักขระที่กำหนด มันอาจจะกว้างขึ้นหรือแคบลงขึ้นอยู่กับตัวอักษร ตอนนี้chหน่วยดูเหมือนจะมีแนวโน้ม แต่ไม่ได้รับการสนับสนุนใน IE น้อยกว่า 9 ซึ่งจะเป็นปัญหาเมื่อฉันเขียนสิ่งนี้
ibrewster

ใช่ แต่ความสูงของ x มักจะไม่เล็กกว่าความกว้างส่วนใหญ่แล้วจริง ๆ แล้วสูงกว่าหรือใกล้เคียงกันเล็กน้อยดังนั้นมันจึงเข้าใกล้ chน่าจะดีกว่านี้น่าเสียดายที่เลขศูนย์บางบางและมันอาจไม่สามารถวัดพื้นที่อักขระเต็มได้ ...
Forty

@Forty True จึงเป็นการตอกย้ำจุดเดิมของฉันว่าไม่มีแอตทริบิวต์ CSS ที่ดีสำหรับการตั้งค่าความกว้างของฟิลด์อินพุตให้เป็นจำนวนอักขระที่เฉพาะเจาะจงในขณะที่sizeแอตทริบิวต์นั้นพยายามทำอย่างนั้น คุณอาจพูดถูกว่าexเป็นทางเลือกที่สมเหตุสมผล แต่ความจริงก็ยังคงเป็นคุณลักษณะความสูงไม่ใช่แอตทริบิวต์ความกว้าง sizeเป็นแอตทริบิวต์ width ไม่ใช่แค่ css
ibrewster

มันก็พอใกล้จะใช้เพียงแค่ไม่ได้ในทางปฏิบัติสำหรับกรณีนี้ :)
สี่สิบ

4

ฉันเพิ่งผ่านการต่อสู้กับตารางที่ไม่สามารถทำให้เล็กลงได้ไม่ว่าองค์ประกอบใดที่ฉันพยายามทำให้ความกว้างของตารางเล็กลงเหมือนเดิม ฉันค้นหาโดยใช้ firebug แต่ไม่พบองค์ประกอบที่ตั้งค่าความกว้างสูงมาก

ในที่สุดฉันก็ลองเปลี่ยนขนาดคุณลักษณะขององค์ประกอบข้อความเข้าและแก้ไขมัน ด้วยเหตุผลบางประการคุณลักษณะขนาดจึงข้ามความกว้าง css ฉันใช้ jQuery เพื่อเพิ่มแถวในตารางแบบไดนามิกและเป็นแถวเหล่านี้ที่มีอินพุต ดังนั้นบางทีเมื่อมันมาถึงการเพิ่มอินพุตแบบไดนามิกโดยใช้ appendTo () ฟังก์ชั่นมันอาจจะเป็นการดีกว่าที่จะกำหนดขนาดของแอททริบิวพร้อมกับความกว้าง



1

คุณสามารถปรับขนาดโดยใช้สไตล์และความกว้างเพื่อปรับขนาดกล่องข้อความ นี่คือรหัสสำหรับมัน

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

</head>
<body>
<div align="center">

    <form method="post">
          <div class="w3-row w3-section">
            <div class="w3-rest" align = "center">
                <input name="lastName" type="text" id="myInput" style="width: 50%">
            </div>
        </div>
    </form>
</div>
</body>
</html>

ใช้จัดตำแหน่งเพื่อจัดกึ่งกลางกล่องข้อความ


1

ทั้งsizeแอตทริบิวต์ใน HTML และwidthคุณสมบัติใน CSS <input>จะกำหนดความกว้างของนั้น หากคุณต้องการตั้งค่าความกว้างเป็นสิ่งที่ใกล้เคียงกับความกว้างของอักขระแต่ละตัวให้ใช้**ch**หน่วยใน

input {
    width: 10ch;
}

0

HTML ควบคุมความหมายเชิงความหมายขององค์ประกอบต่างๆ CSS ควบคุมเลย์เอาต์ / สไตล์ของหน้า ใช้ CSS เมื่อคุณควบคุมเค้าโครงของคุณ

กล่าวโดยย่ออย่าใช้ size = ""


ขนาดสามารถฝังอยู่ในความหมายขององค์ประกอบ ตัวอย่างเช่นการเริ่มต้นตรงกลางมีอักขระเดียว ชื่อแรก OTOH ไม่มีการ จำกัด ขนาดโดยธรรมชาติ - เว้นแต่คุณจะมีในฐานข้อมูลของคุณ
Derobert

4
@derobert: ฉันเข้าใจผิด แต่โดยปกติแล้วคุณแสดงว่าการใช้ maxlength-attribute สำหรับอินพุต [type = text | รหัสผ่าน] และไม่ได้มีขนาดคุณสมบัติ
Horst Gutmann

2
@ Horst: ดีฉันจะแสดงชื่อกลางเริ่มต้นด้วยทั้งสอง (เนื่องจากข้อ จำกัด นั้นสมเหตุสมผลกับผู้ใช้) และฐานข้อมูลจะ จำกัด เพียงหนึ่งด้วยความยาวสูงสุด
Derobert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.