Wypełnienie w danych wejściowych łamie szerokość 100%


133

Ok, więc wiemy, że ustawienie dopełnienia obiektu powoduje zmianę jego szerokości, nawet jeśli jest ustawiona jawnie. Chociaż można argumentować za logiką, która za tym stoi, powoduje to pewne problemy z niektórymi elementami.

W większości przypadków po prostu dodajesz element podrzędny i dodajesz do niego wypełnienie zamiast ustawionego na 100%, ale w przypadku danych wejściowych formularza nie jest to możliwy krok.

Spójrz na to: http://sandman.net/test/formcss.html

Drugie wejście ma wypełnienie ustawione na 5 pikseli, co zdecydowanie wolę od ustawienia domyślnego. Ale niestety powoduje to wzrost wielkości wejściowej o 10 pikseli we wszystkich kierunkach, w tym dodanie 10 pikseli do 100% szerokości.

Problem polega na tym, że nie mogę dodać elementu podrzędnego do danych wejściowych, więc nie mogę tego naprawić. Więc pytanie brzmi:

Czy istnieje sposób na dodanie dopełnienia wewnątrz danych wejściowych, przy jednoczesnym zachowaniu szerokości 100%? Musi to być 100%, ponieważ formularze będą renderować się z różnymi szerokościami rodziców, więc nie znam wcześniej szerokości rodzica.


3
Zobacz stackoverflow.com/questions/628500/… aby dowiedzieć się, jak używać box-sizingatrybutu CSS3
Daniel LeCheminant

15
Muszę tylko powiedzieć, dzięki za cały czas podtrzymywanie przykładowej strony. Doprowadza mnie do szału, gdy ktoś umieszcza adres URL w pytaniu i jest wyłączony po udzieleniu odpowiedzi lub nie używa czegoś takiego jak jsfiddle.
Jonathan Dumaine

Odnośnie używania atrybutu rozmiaru pudełka; mój problem był ten sam, ale przy wysokości - ustawienie wysokości na 100% oznacza wysokość + obramowanie + wypełnienie = wysokość pojemnika. Aby dane wejściowe miały rzeczywistą wysokość kontenera, wystarczyło użyć rozmiaru box-sizing: content-box.
Skychan

Z wyjątkiem tego, co właśnie powiedziałem, nie działa w IE. IE11 z rozmiarem pudełka: skrzynka zawartości w ogóle nie dostosowuje wysokości do wysokości: 100%. Szanuje go przy określonej wysokości w pikselach. Tak więc wysokość: 31 pikseli bez rozmiaru pudełka jest o 6 pikseli mniejsza niż wysokość: 31 pikseli + rozmiar pudełka: zawartość pola. Ale chodzi o to, aby użyć wysokości: 100%, więc nie martwię się o konkretny rozmiar piksela!
Skychan

Odpowiedzi:


294

Używając CSS3, możesz użyć rozmiaru pola właściwości , aby zmienić sposób, w jaki przeglądarka oblicza szerokość wejścia .

  input.input {
    width: 100%;
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
    -moz-box-sizing: border-box;    /* Firefox, other Gecko */
    box-sizing: border-box;         /* Opera/IE 8+ */
  }

Możesz przeczytać więcej na ten temat tutaj: http://css-tricks.com/box-sizing/


@ Víctor Dieppa Garriga Dziękuję, to świetne rozwiązanie.
sinanakyazici

1
Wsparcie jest następujące: Chrome (dowolne): rozmiar pudełka Opera 8.5+: rozmiar pudełka Firefox (dowolne): -moz-box-rozmiar Safari 3: -webkit-box-sizing (bez prefiksu w wersjach 5.1+) IE8 +: box -rozmiar. Polecam również to dla zaakceptowanej odpowiedzi, jest to bardziej eleganckie rozwiązanie.
Baconbeastnz

1
Aby wyjaśnić obsługę rozmiarów pudełek w IE, właściwość rozmiarów pudełek w IE zależy od trybu dokumentu IE, działa ona w „trybie standardów IE8” i wyższych. Będzie więc działać w wersji przeglądarki IE8 również wtedy, gdy tryb dokumentu to „Tryb standardów IE8”. Mam nadzieję, że to pomoże
Sanjeev

Szczerze mówiąc, box-sizing: border-box;to pierwsza rzecz, o której pomyślałem, ale absolutnie nie działa na mnie. Może prapradziadkowie się display: flex;z tym bawią?
Cody

Wygląda na to, że jest obsługiwany we wszystkich głównych przeglądarkach bez prefiksu i był przez kilka wersji: caniuse.com/#feat=css3-boxsizing
Jason

7

Nie wiem, na ile jest kompatybilny z różnymi przeglądarkami (działa w Firefoksie i Safari), ale możesz wypróbować to rozwiązanie:

DIV.formvalue {
padding: 15px;
}
input.input {
margin: -5px;
}

(Opublikowałem tylko wartości, które zmieniłem)


1
Powoduje to problem w IE.
Tarik

Cóż, nie dziwi mnie to zbytnio :) Nie myśl, że istnieje proste rozwiązanie dla różnych przeglądarek bez zmiany znaczników.
michaelk

Ok, głosuję teraz za tym rozwiązaniem, ponieważ dodanie marginesu: -5px najwyraźniej nie jest naruszeniem. Dodałem czwarte wejście do strony, która to używa i wydaje się, że faktycznie działa. jigsaw.w3.org/css-validator/…
Sandman

7

Jedną z opcji jest owinięcie INPUTw a, DIVktóre ma wypełnienie.

CSS:

div.formvalue {
    background-color: #eee;
    border: 1px solid red;
    padding: 10px;
    margin: 0px;
}

div.paddedInput {
    padding: 5px;
    border: 1px solid black;
    background-color: white;
}

div.paddedInput input {
    border: 0px;
    width: 100%;
}

HTML:

<div class="formvalue">
    <div class="paddedInput"><input type="text" value="Padded!" /></div>
</div>

8
Wypełnienie elementu div kontenera daje inne wyniki niż dodanie wypełnienia do pola wejściowego.
Felix Fung

Dodaj do tego, co powiedział Felix Fung - Tracisz możliwość klikania myszą w obszarze wypełnienia i skupiasz się na polu wprowadzania - wśród innych bardziej zauważalnych problemów. Chciałem tylko zwrócić uwagę na ten mniej zauważony / znany problem - denerwuje mnie to bez końca podczas korzystania ze stron internetowych, które używają tego hacka.
eselk

5

Tutaj calcna ratunek mogą przyjść zapomniani :

input {
  width: calc(100% - 1em);
  padding: 0.5em;
}

Ponieważ wiemy, że wypełnienie zwiększy szerokość elementu, po prostu odejmujemy wypełnienie od całkowitej szerokości. Jest obsługiwany przez wszystkie główne przeglądarki, jest responsywny i nie wymaga niechlujnych elementów div wrapper.


4

Mam pewne problemy z czymś podobnym do tego. Mam tds z wejściami 100% i małą wyściółką. To, co zrobiłem, to skompensowanie wypełnienia na TD w następujący sposób:

.form td {
    padding-right:8px;
}

.form input, .form textarea {
    border: 1px solid black;
    padding:3px;
    width:100%;
}

dopełnienie 8 pikseli, aby uwzględnić obramowanie i wypełnienie obszaru wejściowego / tekstowego. Mam nadzieję że to pomoże!


Ta technika świetnie sprawdza się przy ustawianiu szerokości komórek, które zawierają wypełnione dane wejściowe, z komórkami, które ich nie mają. Po prostu zastosuj dopełnienie w prawo selektywnie do dowolnego TD, który zawiera wejście o 100% szerokości.
Seb Barre

1

Być może zdejmij obramowanie + tło inputi zamiast tego zamknij je w divramce + tło ​​i szerokość: 100% i ustaw margines na input?


To jest rodzaj hackowania, którego obecnie używam w przypadku tego problemu, ale wolałbym używać obramowania na wejściu z „powodów stylowych” lub czegokolwiek. Ale tak, obecnie to robię, więc jest to realne rozwiązanie
Sandman

1

Jednym z rozwiązań, które znalazłem, jest absolutne pozycjonowanie wejścia za pomocą względnie umieszczonego tagu nadrzędnego.

<p class="full-width-input">
    <input type="text" class="text />
</p>

Zastosuj styl:

p.full-width-input {
    position: relative;
    height: 35px;
}

p.full-width-input input.text {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    padding: 5px;
}

Jedyną rzeczą, o której należy pamiętać, jest to, że znacznik akapitu wymaga ustawienia wysokości, ponieważ jego bezwzględnie ustawione elementy potomne nie zwiększą wysokości. Pozwala to uniknąć konieczności ustawiania width: 100%, blokując go po lewej i prawej stronie elementu nadrzędnego.


0

Spróbuj użyć wartości procentowych do wypełnienia:

.input { 

  // remove border completely
  border: none;

  // don't forget to use the browser prefixes
  box-shadow: 0 0 0 1px silver;

  // Use PERCENTAGES for at least the horizontal padding
  padding: 5%; 

  // 100% - (2 * 5%)
  width: 90%; 

}

Jeśli martwisz się o użytkowników starszych przeglądarek, którzy nie widzą cienia pola, po prostu nadaj wejściu subtelny kolor tła jako kopię zapasową. Jeśli używasz pikseli do tego rodzaju rzeczy, prawdopodobnie używasz ich gdzie indziej, co może stanowić kilka dodatkowych wyzwań, daj mi znać, jeśli je napotkasz.


-3

Jedyne, co wiem, aby temu zapobiec, to przypisanie takich wartości 100% -10. Ale ma jednak pewne problemy ze zgodnością.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.