ปัญหา
ฉันมี<select>ที่หนึ่งใน<option>ค่าข้อความของมันยาวมาก ฉันต้องการ<select>ปรับขนาดเพื่อให้ไม่กว้างกว่าพาเรนต์แม้ว่าจะต้องตัดข้อความที่แสดงออก max-width: 100%ควรทำเช่นนั้น
ก่อนปรับขนาด:

สิ่งที่ฉันต้องการหลังจากปรับขนาด:

แต่ถ้าคุณโหลดตัวอย่าง jsFiddle นี้และปรับขนาดความกว้างของแผงผลลัพธ์ให้เล็กกว่าของ<select>คุณจะเห็นได้ว่าตัวเลือกภายในนั้น<fieldset>ล้มเหลวในการลดขนาดความกว้างลง
สิ่งที่ฉันเห็นจริงหลังจากปรับขนาด:

อย่างไรก็ตามหน้าเว็บที่เทียบเท่ากับ<div>แทนที่จะเป็น<fieldset>สเกลจะถูกต้อง คุณจะเห็นว่าและทดสอบการเปลี่ยนแปลงของคุณได้ง่ายขึ้นถ้าคุณมีและถัดจากแต่ละอื่น ๆ บนหน้าหนึ่ง และถ้าคุณลบแท็กโดยรอบการปรับขนาดจะทำงาน แท็กเป็นอย่างใดก่อให้เกิดการปรับขนาดแนวนอนเพื่อแบ่ง<fieldset><div><fieldset><fieldset>
ทำหน้าที่เป็นถ้ามีกฎ<fieldset> CSS fieldset { min-width: min-content; }( min-contentหมายถึงความกว้างที่เล็กที่สุดซึ่งไม่ทำให้เด็กล้น) หากฉันแทนที่<fieldset>ด้วย<div>ด้วยmin-width: min-contentจะมีลักษณะเหมือนกันทุกประการ แต่ไม่มีกฎmin-contentในสไตล์ของฉันในสไตล์ชีทเริ่มต้นของเบราว์เซอร์หรือปรากฏใน CSS Inspector ของ CSS ของ Firebug ผมพยายามที่จะแทนที่รูปแบบที่มองเห็นได้ในทุก<fieldset>ใน Firebug ของ CSS สารวัตรและในสไตล์ชีตเริ่มต้นของ Firefox forms.cssแต่นั่นก็ไม่ได้ช่วย การเอาชนะโดยเฉพาะmin-widthและwidthไม่ได้ทำอะไรเช่นกัน
รหัส
HTML ของ fieldset:
<fieldset>
<div class="wrapper">
<select id="section" name="section">
<option value="-1"></option>
<option value="1501" selected="selected">Sphinx of black quartz, judge my vow. The quick brown fox jumps over the lazy dog.</option>
<option value="1480">Subcontractor</option>
<option value="3181">Valley</option>
<option value="3180">Ventura</option>
<option value="3220">Very Newest Section</option>
<option value="1481">Visitor</option>
<option value="3200">N/A</option>
</select>
</div>
</fieldset>
CSS ของฉันที่ควรใช้งานได้ แต่ไม่ใช่:
fieldset {
/* hide fieldset-specific visual features: */
margin: 0;
padding: 0;
border: none;
}
select {
max-width: 100%;
}
การรีเซ็ตwidthคุณสมบัติเป็นค่าเริ่มต้นไม่ได้ทำอะไรเลย:
fieldset {
width: auto;
min-width: 0;
max-width: none;
}
CSS เพิ่มเติมที่ฉันพยายามและล้มเหลวในการแก้ไขปัญหา :
/* try lots of things to fix the width, with no success: */
fieldset {
display: block;
min-width: 0;
max-width: 100%;
width: 100%;
text-overflow: clip;
}
div.wrapper {
width: 100%;
}
select {
overflow: hidden;
}
รายละเอียดเพิ่มเติม
ปัญหายังเกิดขึ้นในตัวอย่าง jsFiddle ที่มีความครอบคลุมและซับซ้อนมากขึ้นซึ่งคล้ายกับหน้าเว็บที่ฉันพยายามแก้ไข คุณจะเห็นได้ว่าสิ่ง<select>นั้นไม่ใช่ปัญหา - อินไลน์บล็อคdivยังไม่สามารถปรับขนาดได้ แม้ว่าตัวอย่างนี้จะซับซ้อนกว่า แต่ฉันคิดว่าการแก้ไขกรณีง่าย ๆ ข้างต้นจะแก้ไขกรณีที่ซับซ้อนมากขึ้นด้วย
[แก้ไข: ดูรายละเอียดการสนับสนุนเบราว์เซอร์ด้านล่าง]
สิ่งหนึ่งที่อยากรู้เกี่ยวกับปัญหานี้คือถ้าคุณตั้งค่าdiv.wrapper { width: 50%; }การ<fieldset>หยุดการปรับขนาดตัวเอง ณ จุดนั้นขนาดเต็ม<select>จะกระทบกับขอบของวิวพอร์ต ปรับขนาดเกิดขึ้นถ้า<select>มีwidth: 100%แม้ดูเหมือนว่ามันมี<select>width: 50%

หากคุณให้<select>ตัวเองwidth: 50%พฤติกรรมนั้นจะไม่เกิดขึ้น ตั้งค่าความกว้างได้อย่างถูกต้อง

ฉันไม่เข้าใจเหตุผลของความแตกต่างนั้น แต่มันอาจไม่เกี่ยวข้อง
ฉันยังพบคำถามที่คล้ายกันมากHTML fieldset ช่วยให้เด็กที่จะขยายไปเรื่อย ๆ ถามไม่สามารถหาวิธีการแก้ปัญหาและการคาดเดาว่าจะมีวิธีการแก้ปัญหาไม่<fieldset>แตกต่างจากการเอา แต่ฉันสงสัยว่าถ้ามันเป็นไปไม่ได้ที่จะทำให้การ<fieldset>แสดงผลถูกต้องทำไมเป็นเช่นนั้น? อะไร<fieldset>'s ข้อมูลจำเพาะหรือเริ่มต้น CSS ( ณ คำถามนี้ ) ทำให้เกิดพฤติกรรมนี้หรือไม่? พฤติกรรมพิเศษนี้อาจถูกบันทึกไว้ที่ใดที่หนึ่งเนื่องจากเบราว์เซอร์หลายตัวทำงานเช่นนี้
เป้าหมายพื้นหลังและข้อกำหนด
เหตุผลที่ฉันพยายามทำเช่นนี้เป็นส่วนหนึ่งของการเขียนสไตล์มือถือสำหรับหน้าเว็บที่มีอยู่ด้วยฟอร์มขนาดใหญ่ แบบฟอร์มมีหลายส่วนและส่วนหนึ่งถูกห่อ<fieldset>ด้วย บนสมาร์ทโฟน (หรือถ้าคุณทำให้หน้าต่างเบราว์เซอร์เล็ก) ส่วนของหน้าเว็บที่<fieldset>มีความกว้างกว่าส่วนที่เหลือของแบบฟอร์ม แบบฟอร์มส่วนใหญ่จำกัดความกว้างของมันได้ดี แต่ส่วนที่<fieldset>ไม่มีจะบังคับให้ผู้ใช้ย่อหรือเลื่อนไปทางขวาเพื่อดูส่วนนั้นทั้งหมด
ฉันแค่ระมัดระวังในการลบ<fieldset>เพราะมันถูกสร้างขึ้นในหลาย ๆ หน้าในแอพขนาดใหญ่และฉันไม่แน่ใจว่าตัวเลือกใดใน CSS หรือ JavaScript อาจขึ้นอยู่กับมัน
ฉันสามารถใช้ JavaScript ได้ถ้าต้องการและโซลูชัน JavaScript นั้นดีกว่าไม่มีอะไรเลย แต่ถ้าจาวาสคริปต์เป็นวิธีเดียวที่จะทำสิ่งนี้ฉันอยากรู้อยากเห็นคำอธิบายว่าทำไมจึงไม่สามารถทำได้ด้วย CSS และ HTML เท่านั้น
แก้ไข: รองรับเบราว์เซอร์
บนเว็บไซต์ฉันต้องรองรับ Internet Explorer 8 และใหม่กว่า (เราเพิ่งลดการสนับสนุน IE7) Firefox ล่าสุดและ Chrome ล่าสุด หน้านี้ควรทำงานบนสมาร์ทโฟน iOS และ Android พฤติกรรมที่เสื่อมโทรมเล็กน้อย แต่ยังคงใช้งานได้เป็นที่ยอมรับได้สำหรับ Internet Explorer 8
ผมครั้งแล้วครั้งเล่าเสียของฉันfieldsetเช่นบนเบราว์เซอร์ที่แตกต่างกัน ใช้งานได้จริงแล้วในเบราว์เซอร์เหล่านี้:
- Internet Explorer 8, 9 และ 10
- โครเมียม
- Chrome สำหรับ Android
มันหยุดในเบราว์เซอร์เหล่านี้:
- Firefox
- Firefox สำหรับ Android
- Internet Explorer 7
ดังนั้นเบราว์เซอร์เดียวที่ฉันใส่ใจเกี่ยวกับการแบ่งรหัสปัจจุบันคือ Firefox (ทั้งบนเดสก์ท็อปและมือถือ) หากรหัสได้รับการแก้ไขเพื่อให้ทำงานใน Firefox โดยไม่ทำลายในเบราว์เซอร์อื่น ๆ นั่นจะช่วยแก้ปัญหาของฉันได้
เทมเพลต HTML ของไซต์ใช้ความคิดเห็นตามเงื่อนไขของ Internet Explorer เพื่อเพิ่มคลาสดังกล่าว.ie8และ.oldieให้กับ<html>องค์ประกอบ คุณสามารถใช้คลาสเหล่านั้นใน CSS ของคุณหากคุณต้องการแก้ไขสไตล์ที่แตกต่างใน IE เรียนเพิ่มเป็นเช่นเดียวกับในรุ่นเก่าของ HTML5 Boilerplate
<fieldset>(หรือdiv.wrapper) select { width:100% }สิ่งที่จะต้องมีความกว้างและ max-widthดูเหมือนจะให้องค์ประกอบบางส่วนของความกว้างดั้งเดิมของพาเรนต์แล้วไม่ปรับขยายในขณะที่widthปรับสเกลกับพาเรนต์ ฉันคิดว่าจะทำในสิ่งที่คุณต้องการ (แต่ฉันอาจเข้าใจผิด) ในซอที่ซับซ้อนยิ่งขึ้นของคุณลองให้เขตข้อมูลในคอลัมน์ด้านซ้ายเป็น% -width และความกว้าง min-pixel จากนั้นให้เขตข้อมูลทางด้านขวา 100 - (เขตข้อมูลด้านซ้าย -% - ความกว้าง)% ความกว้าง