ปัญหา
ฉันมี<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 - (เขตข้อมูลด้านซ้าย -% - ความกว้าง)% ความกว้าง