100% ओवरफ्लो टेबल कोशिकाओं की चौड़ाई के साथ HTML इनपुट टेक्स्टबॉक्स


106

क्या किसी को पता है कि 100% की चौड़ाई वाले इनपुट तत्व तालिका की कोशिकाओं की सीमा पर क्यों जाते हैं।

इनपुट बॉक्स के नीचे सरल उदाहरण में तालिका की कोशिकाओं की सीमा पर जाना, परिणाम भयानक है। यह परीक्षण किया गया था और यह उसी तरह से होता है: फ़ायरफ़ॉक्स, IE7 और सफारी।

क्या यह आपके लिए समझ में आता है? क्या मुझे कुछ याद आ रहा है, क्या आप एक संभावित समाधान के बारे में जानते हैं?

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">    
<html><head>    
   <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <!-- don't use closing slash in meta tag, it breaks HTML4.01 transitional -->
   <title>Test input text in table</title>
   <style type="text/css">      
      table {border-top: 1px solid #ff0000; border-left: 1px solid #ff0000;}
      table td {border-right: 1px solid #00ff00; border-bottom: 1px solid #00ff00;}
      input[type="text"] {width: 100%;} /* removing this would make input not to go over cells border, but they would be too short, I want them to fit cells size */
   </style>    
</head><body>

<table cellpadding="0" cellspacing="0">
   <tr>
      <td><p>column one hello babe babe babe</p></td>
      <td><p>column two hello babe more</p></td>
      <td><p>column three hello babe more and more</p></td>
   </tr>
   <tr>
      <td><input type="text" value="test"></td>
      <td><input type="text" value="test"></td>
      <td><input type="text" value="test"></td>
   </tr>
</table>

</body></html>

1
मुझे लगता है कि सुझाव है, अगर आप सिर्फ आदानों पेश करने के लिए एक मेज का उपयोग कर रहे हैं, आप एक का उपयोग करना शुरू कर सकते हैं formके साथ labelहै और inputएक के अंदर ulया ol। जो है, कम से कम थोड़ा अधिक अर्थपूर्ण। निश्चित रूप से, हालांकि, आप का उपयोग किया जाना चाहिए form, भले ही आप के साथ रहना है table
डेविड का कहना है कि मोनिका

जवाबों:


216

box-sizingबाहरी गद्दी और सीमा को शामिल करने के लिए आप CSS3 की संपत्ति का उपयोग कर सकते हैं :

input[type="text"] {
     width: 100%; 
     box-sizing: border-box;
     -webkit-box-sizing:border-box;
     -moz-box-sizing: border-box;
}

1
कहने के लिए दुख की बात है लेकिन दुर्भाग्य से IE 7 बॉक्स आकार के साथ सही ढंग से व्यवहार नहीं करता है। IE 7 में निम्नलिखित का प्रयास करें ... css3.info/preview/box-sizing या देखना css-tricks.com/box-sizing
AnthonyVO

@AnthonyVO: सच है, IE7 के लिए एकमात्र समाधान IE सशर्त टिप्पणियों का उपयोग करके इसके लिए विशिष्ट CSS जोड़ना है <!--[if lt IE 8]>औरinput[type="text"] {width:95%}
Marco Demaio

24

चौड़ाई मान सीमा या पैडिंग में नहीं लेता है:

http://www.htmldog.com/reference/cssproperties/width/

आपको प्रत्येक पक्ष में 2px की पैडिंग मिलती है, साथ ही प्रत्येक पक्ष में 1px की सीमा होती है।
100% + 2 * (2px + 1px) = 100% + 6px, जो माता-पिता की td की 100% बाल-सामग्री से अधिक है।

आपके पास इसका विकल्प है:

  • या तो @ pricco के उत्तर केbox-sizing: border-box; अनुसार सेटिंग ;
  • या 0 मार्जिन और पैडिंग (अतिरिक्त आकार से बचने) का उपयोग करना।

श्री पीटीएस के जवाब के आगे आप पेडिंग और बॉर्डर को 0px पर सेट कर सकते हैं फिर 100% काम करना चाहिए।
मौरो

वास्तव में, यहां तक ​​कि td के लिए कोई भी पैडिंग सेट किए बिना - बहुत अच्छी तरह से जोड़ा गया।
एनेव्स

1
इसके अलावा, यदि पैडिंग कोई समस्या पैदा करता है, तो text-indentपाठ के प्रमुख-किनारे के आगे पैडिंग का अनुकरण करना संभव है , और line-heightऊर्ध्वाधर पैडिंग के लिए (हालांकि ऊर्ध्वाधर पैडिंग को बनाए रखना वैसे भी चौड़ाई को प्रभावित नहीं करेगा)।
डेविड कहते हैं कि

14

जैसी चीजों के साथ समस्या यह width:95%;है कि वे व्यापक लचीले लेआउट में सही नहीं दिखती हैं (क्योंकि 5% तब 30 पिक्सल की तरह हो सकती हैं)।

निम्नलिखित समाधान मेरे लिए बहुत अच्छी तरह से काम करते हैं (फ़ायरफ़ॉक्स, IE 9, सफारी में परीक्षण):

<table style="background-color: blue; width: 100%;" cellpadding="0" cellspacing="0">
<tr>
    <td style="background-color: red;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
    <td style="background-color: purple;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
    <td style="background-color: green;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
</tr>
</table>

(सही गद्दी को नोटिस करना आसान बनाने के लिए रंगों को जोड़ा)

ट्रिक इनपुट को दो divs के साथ लपेटने के लिए है, बाहरी में 3px मार्जिन है (जो इसे td से 3px छोटा बनाता है), आंतरिक में 3px पैडिंग है। यह td की तुलना में इनपुट को 6px छोटा बनाता है, जिसे आप शुरू करना चाहते थे।

मैं इस के यांत्रिकी के बारे में निश्चित नहीं हूं, लेकिन यह काम करता है।

इस सरल उदाहरण में, यह सही मार्जिन के साथ सिर्फ एक div के साथ भी काम करता है। 6. हालांकि, मेरे वेब एप्लिकेशन के मामले में, केवल उपरोक्त समाधान काम करता है।

<table style="background-color: blue; width: 100%;" cellpadding="0" cellspacing="0">
<tr>
    <td style="background-color: red;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
    <td style="background-color: purple;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
    <td style="background-color: green;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
</tr>
</table>

यह काम करता है (upvoted +1)। अजीब तरह से, मैंने प्रत्येक <इनपुट> से पहले कुछ पाठ डाला और उन्हें एक ही पंक्ति में रखने के लिए "श्वेत-स्थान: nowrap" जोड़ा, फिर तीन <आदानों> ने तालिका कोशिकाओं को अतिप्रवाह कर दिया, अगर मैं "व्हाइट-स्पेस: नोराप" सब कुछ हटा देता हूं फिर से काम करता है। अजीब।
जोस मैनुअल अबर्का रॉड्रिग्ज

8

समस्या को पहले ही समझाया जा चुका है, इसलिए मैं केवल दोहराऊंगा: चौड़ाई सीमा और पैडिंग को ध्यान में नहीं रखती है। इस पर एक संभव जवाब पर चर्चा नहीं की गई, लेकिन जो मैंने पाया है कि मुझे अपने इनपुट को लपेटने के लिए एक गुच्छा बनाने में मदद मिली है। यहाँ कोड है, और मैं समझाता हूँ कि यह एक दूसरे में कैसे मदद करता है:

<table>
  <tr>
    <td><div style="overflow:hidden"><input style="width:100%" type="text" name="name" value="hello world" /></div></td>
  </tr>
</table>

INPUT को लपेटने वाले DIV के पास न तो कोई पैडिंग है और न ही इसकी कोई सीमा है। यह उपाय है। एक DIV अपने कंटेनर के आकार का विस्तार करेगा, लेकिन यह सीमा और पैडिंग का भी सम्मान करेगा। अब, INPUT का बॉर्डर-लेस और पैड-लेस होने के बाद से उसके कंटेनर के आकार तक कोई समस्या नहीं होगी। यह भी ध्यान दें कि DIV में अपना ओवरफ्लो सेट छिपा हुआ है। ऐसा लगता है कि डिफ़ॉल्ट रूप से आइटम दिखाई देने के डिफ़ॉल्ट ओवरफ्लो के साथ उनके कंटेनर के बाहर गिर सकते हैं। यह सिर्फ यह सुनिश्चित करता है कि इनपुट उसके कंटेनर के अंदर रहता है और इसके माध्यम से प्रहार करने का प्रयास नहीं करता है।

मैंने इसे क्रोम और फायर फॉक्स में परीक्षण किया है। दोनों इस समाधान का अच्छी तरह से सम्मान करते हैं।

अद्यतन : चूंकि मुझे बस एक यादृच्छिक डाउनवोट मिला है, इसलिए मैं कहना चाहूंगा कि अतिप्रवाह से निपटने का एक बेहतर तरीका CSS3 के बॉक्स-साइजिंग विशेषता के साथ है जैसा कि प्रिको द्वारा वर्णित है:

.myinput {
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -ms-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
}

यह प्रमुख ब्राउज़रों द्वारा बहुत अच्छी तरह से समर्थित लगता है और अतिप्रवाह की चाल की तरह "हैकी" नहीं है। हालाँकि, इस दृष्टिकोण के साथ वर्तमान ब्राउज़रों पर कुछ छोटे मुद्दे हैं (देखें http://caniuse.com/#search=box-sizing ज्ञात मुद्दे)।


3
एक संक्षिप्त टिप्पणी: overflow: hidden;सामग्री अभी भी उसी तरह से बॉक्स के बाहर 'के माध्यम से' के माध्यम से 'चुटकुले', लेकिन यह दिखाया जा रहा है के बजाय छोटा है - तो यह अन्य सामग्री को ओवरलैप नहीं करता है।
एनेव्स

2

मुझे पता है कि यह सवाल 3 साल पुराना है, लेकिन समस्या अभी भी मौजूदा ब्राउज़रों के लिए बनी हुई है और लोग अभी भी यहां आ रहे हैं। अब के लिए समाधान calc () है :

input {
    width: calc(100% - 12px); /* IE 9,10 , Chrome, Firefox */
    width: -webkit-calc(100% - 12px); /*For safari 6.0*/
}

यह अधिकांश आधुनिक ब्राउज़रों द्वारा समर्थित है।


1

इनपुट तत्व बॉक्स मॉडल के कारण समस्या है। मैंने हाल ही में मोबाइल उपकरणों के लिए अपने इनपुट को 100% रखने की कोशिश करते हुए इस मुद्दे का एक अच्छा समाधान पाया।

अपने इनपुट को दूसरे तत्व के साथ लपेटें, उदाहरण के लिए एक div। फिर उस आवरण के लिए अपने इनपुट के लिए इच्छित स्टाइल लागू करें। उदाहरण के लिए:

<div class="input-wrapper">
 <input type="text" />
</div>

.input-wrapper {
    border-raius:5px;
    padding:10px;
}
.input-wrapper input[type=text] {
    width:100%;
    font-size:16px;
}

.Input-आवरण को गोल कोने वाले पैडिंग आदि दें, जो भी आप अपने इनपुट के लिए चाहते हैं, तब इनपुट की चौड़ाई 100% दें। आप अपने इनपुट के साथ एक सीमा आदि के साथ अच्छी तरह से गद्देदार हैं, लेकिन कष्टप्रद अतिप्रवाह के बिना!


1

मैंने @ हॉलोडॉम के उत्तर के साथ इस मुद्दे को शुरू किया। मेरे सभी इनपुट्स ली के भीतर समाहित थे, इसलिए मुझे केवल इतना करना था कि ली ओवरफ्लो को सेट किया जाए: इसके लिए छिपी उस अतिरिक्त इनपुट ओवरफ्लो को दूर करने के लिए।

.ie7 form li {
  width:100%;
  overflow:hidden;
}

.ie7 input {
  width:100%;
}

1

इस मार्जिन संघर्ष के बजाय बस करो

input{
    width:100%;
    background:transparent !important;
}

इस तरह से सेल बॉर्डर दिखाई देता है और आप पंक्ति पृष्ठभूमि रंग को नियंत्रित कर सकते हैं


0

DOCTYPE घोषणा से "http://www.w3.org/TR/html4/loose.dtd" को बाहर निकालें और यह आपकी समस्या को ठीक करता है।

चीयर्स! :)


क्या आप http://www.w3.org/TR/html4/strict.dtdस्ट्रिक्ट का उपयोग करते हैं ? संदर्भ। w3.org/QA/2002/04/valid-dtd-list.html वैसे भी यह अब DOCTYPE को बदलने का एक विकल्प नहीं है, जो शायद वेबपेजों में कई अन्य स्टफ के प्रतिपादन को प्रभावित करेगा।
मार्को डेमायो जूल

0

कुछ जावास्क्रिप्ट के साथ आप युक्त TD की सटीक चौड़ाई प्राप्त कर सकते हैं और फिर सीधे इनपुट तत्व को असाइन कर सकते हैं।

निम्नलिखित कच्चे जावास्क्रिप्ट है, लेकिन jQuery इसे क्लीनर बना देगा ...

var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++)
{
    var el = inputs[i];
    if (el.style.width == '100%')
    {
        var pEl = el.parentNode;  // Assumes the parent node is the TD...
        el.style.width = pEl.offsetWidth;
    }
}

इस समाधान के साथ मुद्दे हैं:

1) यदि आपके पास SPAN जैसे किसी अन्य तत्व में आपके इनपुट समाहित हैं, तो आपको लूप अप करने की आवश्यकता होगी और टीडी को ढूंढना होगा क्योंकि SPAN जैसे तत्व इनपुट को लपेटेंगे और इसके आकार को दिखाएंगे और फिर टीडी के आकार तक सीमित रहेंगे।

2) यदि आपके पास अलग-अलग स्तरों पर पैडिंग या मार्जिन जोड़े गए हैं, तो आपको [pEl.offsetWidth] से स्पष्ट रूप से घटाना पड़ सकता है। आपके HTML संरचना के आधार पर गणना की जा सकती है।

3) यदि टेबल कॉलम गतिशील रूप से आकार में हैं, तो एक तत्व के आकार को बदलने से टेबल कुछ ब्राउज़रों में रिफ्लेक्ट हो जाएगा और आपको इनपुट साइज़ को क्रमिक रूप से "ठीक" करने के लिए एक स्टेप इफेक्ट मिल सकता है। इसका उपाय यह है कि कॉलम में विशिष्ट चौड़ाई को प्रतिशत या पिक्सेल के रूप में निर्दिष्ट किया जाए या नई चौड़ाई एकत्र की जाए और उसके बाद उन्हें सेट किया जाए। नीचे कोड देखें ..

var inputs = document.getElementsByTagName('input');
var newSizes = [];
for (var i = 0; i < inputs.length; i++)
{
    var el = inputs[i];
    if (el.style.width == '100%')
    {
        var pEl = el.parentNode;  // Assumes the parent node is the TD...
        newSizes.push( { el: el, width: pEl.offsetWidth });
    }
}

// Set the sizes AFTER to avoid stepping...
for (var i = 0; i < newSizes.length; i++)
{
    newSizes[i].el.style.width = newSizes[i].width;
}

0

मैंने आवेदन करके समस्या का हल किया box-sizing:border-box; तालिका कोशिकाओं को स्वयं इनपुट और आवरण के साथ ऐसा करने के अलावा।


0

मैंने इसका उपयोग करके समस्या को हल किया

tr td input[type=text] {
  width: 100%;
  box-sizing: border-box;
  -webkit-box-sizing:border-box;
  -moz-box-sizing: border-box;
  background:transparent !important;
  border: 0px;
}

-1

मैंने आमतौर पर इसे ठीक करने के लिए अपने इनपुट की चौड़ाई 99% तक निर्धारित की है:

input {
    width: 99%;
}

आप डिफ़ॉल्ट शैलियों को भी हटा सकते हैं, लेकिन यह कम स्पष्ट कर देगा कि यह एक पाठ बॉक्स है। हालाँकि, मैं इसके लिए कोड वैसे भी दिखाऊंगा:

input {
    width: 100%;
    border-width: 0;
    margin: 0;
    padding: 0;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

विज्ञापन @ मीटर


-2

समस्या border-widthइनपुट तत्व में निहित है । शीघ्रता से, margin-leftइनपुट तत्व को इन पर सेट करने का प्रयास करें -2px

table input {
  margin-left: -2px;
}

ऐसा मत सोचो। यह बस बॉक्स को बाईं ओर शिफ्ट करता है और बाएं मार्जिन को नष्ट करता है
cc युवा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.