Powiedzmy, że mam pole tekstowe, które chcę wypełnić całą linię. Dałbym mu taki styl:
input.wide {display:block; width: 100%}
Powoduje to problemy, ponieważ szerokość zależy od zawartości pola tekstowego. Pola tekstowe mają domyślnie margines, obramowanie i wypełnienie, co powoduje, że pole tekstowe o szerokości 100% jest większe niż jego pojemnik.
Na przykład tutaj po prawej:
Czy istnieje sposób, aby pole tekstowe wypełniało szerokość kontenera bez rozszerzania się poza niego?
Oto przykładowy kod HTML pokazujący, co mam na myśli:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
<style type="text/css">
#outer{border: 1px solid #000; width: 320px; margin: 0px;padding:0px}
#inner{margin: 20px; padding: 20px; background: #999;border: 1px solid #000;}
input.wide {display:block; margin: 0px}
input.normal {display:block; float: right}
</style>
</head>
<body>
<div id="outer">
<div id="inner">
<input type="text" class="wide" />
<input type="text" class="normal" />
<div style="clear:both;"></div>
</div>
</div>
</body>
</html>
Jeśli zostanie to uruchomione, możesz zobaczyć, patrząc na „normalne” pole tekstowe, że „szerokie” pole tekstowe wystaje poza pojemnik. „Normalne” pole tekstowe unosi się do faktycznej krawędzi kontenera. Próbuję sprawić, by „szerokie” pole tekstowe wypełniało swój kontener, nie wykraczając poza krawędź, tak jak „normalne” pole tekstowe.
Tak: za pomocą właściwości CSS3 „rozmiar pudełka: ramka” można ponownie zdefiniować, co „szerokość” ma obejmować zewnętrzne wypełnienie i ramkę.
Niestety, ponieważ jest to CSS3, obsługa nie jest bardzo dojrzała, a ponieważ proces specyfikacji jeszcze się nie zakończył, w międzyczasie ma różne nazwy tymczasowe w przeglądarkach. Więc:
Oldschoolową alternatywą jest po prostu umieszczenie pewnej ilości „padding-right” na otaczającym elemencie <div> lub <td> równej temu, ile dodatkowej lewej / prawej strony padding / border w „px”, twoim zdaniem, przeglądarki podać dane wejściowe. (Zazwyczaj 6px dla IE <8.)
źródło
To rozwiązało problem dla mnie!
Bez potrzeby zewnętrznego div. Po prostu zastosuj go do podanego pola tekstowego.
Dzięki tej właściwości „Właściwości szerokości i wysokości (oraz właściwości min / max) obejmują zawartość, dopełnienie i obramowanie, ale nie margines”
Zobacz opis nieruchomości w w3schools .
Mam nadzieję, że to komuś pomoże!
źródło
Właśnie natknąłem się na ten problem, a jedynym rozwiązaniem, jakie mogłem znaleźć, które działało we wszystkich moich testowych przeglądarkach (IE6, IE7, Firefox) było:
Kod:
Tutaj całkowity przelew poziomy dla elementu wejściowego wynosi 6px - 2x (wypełnienie + ramka) - więc ustawiliśmy prawo dopełniania dla wewnętrznego DIV równego 6px.
źródło
obsługa zmiany rozmiaru pudełka jest całkiem dobra: http://caniuse.com/#search=box-sizing
Więc jeśli nie kierujesz na IE7, powinieneś być w stanie rozwiązać tego rodzaju problemy za pomocą tej właściwości. Warstwa taka jak sass lub mniejsza ułatwia obsługę takich prefiksów reguł, btw.
źródło
W rzeczywistości jest tak, ponieważ CSS definiuje 100% w stosunku do całej szerokości kontenera, w tym jego marginesów, ramek i wypełnienia; oznacza to, że przestrzeń jest dostępna. jego zawartość jest mniejsza niż 100%, chyba że pojemnik nie ma marginesów, ramek ani wypełnienia.
Jest to sprzeczne z intuicją i powszechnie uważane przez wielu za błąd, z którym się teraz utknęliśmy . Skutecznie oznacza to, że% wymiarów nie nadaje się do niczego poza pojemnikiem najwyższego poziomu, a nawet wtedy, tylko jeśli nie ma marginesów, ramek ani wypełnienia.
Zauważ, że marginesy, obramowania i dopełnienie pola tekstowego są zawarte w określonym dla niego rozmiarze CSS - to kontener wyrzuca rzeczy.
Dopuszczalnie pracowałem nad tym, używając 98%, ale jest to mniej niż idealne rozwiązanie, ponieważ pola wejściowe mają tendencję do zmniejszania się w miarę powiększania się pojemnika.
EDYCJA: Natknąłem się na to podobne pytanie - nigdy nie wypróbowałem udzielonej odpowiedzi i nie wiem na pewno, czy dotyczy ona twojego problemu, ale wydaje się, że tak będzie.
źródło
Jednym z rozwiązań, które może działać (działa dla mnie) jest zastosowanie ujemnego marginesu na wejściu (pole tekstowe) ... lub stałej szerokości dla ie7 lub porzucenie obsługi ie7. Powoduje to, że piksel ma idealną szerokość. Dla mnie jest to 7, więc dodałem 3 i 4, ale nadal jest idealny
Miałem ten sam problem i nienawidziłem mieć dodatkowych div na granicy itp!
Oto moje rozwiązanie, które wydaje się działać!
Powinieneś użyć arkusza stylów tylko ie7, aby uniknąć starhacków.
źródło
Jeśli nie możesz użyć,
box-sizing:border-box
możesz spróbować usunąćwidth:100%
i umieścić bardzo dużysize
atrybut w<input>
elemencie, ale wadą jest to, że musisz zmodyfikować HTML i nie możesz tego zrobić tylko za pomocą CSS:źródło
Jeśli nie musisz tego robić dynamicznie (na przykład twoja forma ma stałą szerokość), możesz po prostu ustawić szerokość
<input>
elementów potomnych na szerokość ich pojemnika minus wszelkie dekoracje, takie jak wypełnienie, margines, obramowanie itp .:źródło
Jeśli nie możesz użyć funkcji zmiany rozmiaru pola (np. Podczas konwersji HTML na PDF za pomocą iText). Spróbuj tego:
CSS
HTML
źródło
To działa:
Pierwsza „szerokość” to zasada rezerwowa dla starszych przeglądarek.
źródło
Po prostu nadaj stylowi wartość wejściową, aby uzyskać dodatkowe wypełnienie. W poniższym przykładzie wypełnienie na wejściu wyniesie 10 pikseli po lewej i prawej stronie, przy całkowitym przesunięciu wypełnienia wynoszącym 20 pikseli:
źródło