Вирівняти текст та поля вибору з однаковою шириною в CSS?


81

Гаразд, здається, неможливо правильно зрозуміти. У мене є текстове поле та поле вибору. Я хочу, щоб вони мали однакову ширину, щоб вони вирівнювались на лівому та правому полях.

<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            input, select {
                width: 200px;
            }
        </style>
    </head>
    <body>
        <input type="text" value="ABC"><br>
        <select>
            <option>123</option>
        </select>
    </body>
</html>

Це зробить це, на вашу думку, так? Ні. Поле вибору на 6 пікселів коротше у Firefox. Дивіться знімок екрана.скріншот у Firefox - -

Гаразд, дозвольте редагувати код і створити два стилі.

<style type="text/css">
    input {
        width: 200px;
    }
    select {
        width: 206px;
    }
</style>

Гаразд, це працює!

Виправлено у Firefox

О, почекайте, краще протестуйте в Chrome ...

скріншот екрану

FFFFFFFUUUUUUUUUUUU

Хтось може сказати мені, як їх вирівняти у всіх браузерах? Чому я не можу просто зробити width: 200px для всіх, чому всі браузери відображають це по-різному? Крім того, поки ми до цього прийшли, чому текстове поле та поле вибору мають різну висоту? Як отримати їх на однаковій висоті? Спробували висоту та висоту лінії безрезультатно.


Рішення:

Гаразд, я знайшов рішення за деякою допомогою з наведених нижче відповідей. Ключ полягає у використанні властивості box-sizing: border-box, тому, коли ви вказуєте ширину, яка включає межу та відступ. Дивіться чудове пояснення тут . Тоді браузер не може його набити.

Код нижче, також встановили висоту полів однакового розміру та відступили текст всередині вікна, щоб він вирівнювався. Вам також потрібно встановити межу, оскільки Chrome має справді дивно виглядаючу межу, яку він використовує для вибору вікон, які викидають вирівнювання. Це буде працювати для сайтів HTML5 (наприклад, підтримка IE9, Firefox, Chrome, Safari, Opera тощо).

<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            input, select {
                width: 200px;
                border: 1px solid #000;
                padding: 0;
                margin: 0;
                height: 22px;
                -moz-box-sizing: border-box;
                -webkit-box-sizing: border-box;
                box-sizing: border-box;
            }
            input {
                text-indent: 4px;
            }
        </style>
    </head>
    <body>
        <input type="text" value="ABC"><br>
        <select>
            <option>123</option>
            <option>123456789 123123123123</option>
            <option>123456789 123123123123 134213721381212</option>
        </select>
    </body>
</html>

Тільки одне останнє попередження, що ви можете не хотіти, щоб кнопки введення, прапорці тощо були включені в цей стиль, тому використовуйте, input:not([type='button'])щоб не застосовувати його до певних типів, або використовуйте, input[type='text'], input[type='password']щоб вказати ті, до яких ви хочете, щоб це застосовувалось.


3
Якщо вам потрібно мати такий рівень точності, ви не будете щасливі як веб-дизайнер.
Скотт Сондерс,

2
Так, CSS щодня зводить мене з розуму @Scott. :)
zuallauz

2
Зверніть увагу, розмір коробки не підтримується в lte IE7 (близько 3% користувачів). І ніколи не використовуйте: not - це не підтримується в lte IE8, що становить 20% користувачів :)
Анонім

Box-проклейка робить роботу на IE8! Всі ці роки я додавав певні ширини <select> стилю ...
GlennG

розмір коробки працює
П’єр,

Відповіді:


7

Це пов’язано з тим, що <input type="text" />елемент має дещо інший стиль за замовчуванням до <select>елемента, наприклад значення межі, відступів та полів можуть бути різними.

Ви можете спостерігати за типом за замовчуванням через інспектор елементів, такий як Firebug для Firefox або вбудований для Chrome. Крім того, ці таблиці стилів за замовчуванням відрізняються від браузера до браузера.

У вас є два варіанти:

  1. Явно встановіть значення меж, відступів та полів однаковими для обох елементів
  2. Таблиця стилів скидання CSS, яка буде включена до ваших власних таблиць стилів CSS

Я б вибрав варіант 1., оскільки варіант 2. вимагає багато роботи, і в підсумку ви отримаєте купу непотрібних CSS. Але деякі веб-розробники вважають за краще починати з нуля і мати повний контроль.


2
Скидання CSS - це не погана ідея у такому випадку.
Ремі

1
Полегшені скидання CSS дійсно існують, але, звичайно, можуть бути небажані побічні ефекти. Якщо ви починаєте проектувати з таблиці стилів скидання CSS, цей варіант стає набагато привабливішим.
Томас Аптон,

Я спробував встановити явне значення, padding:0; margin:0; border:1px solid #000;яке отримує ширину текстових / виділених полів, які добре вишикуються. Однак, якщо ви подивитесь на текст у двох полях, ви помітите, що текст у полі вибору додатково заповнюється. Майже потрібно додати ще один конкретний input { padding-left: 5px; }стиль після першого, щоб виправити. Будь-які ідеї? Я використовував скидання CSS на веб-сайті, який я створював, перш ніж зробити цей базовий тестовий код, але проблема все ще була там. Скидання CSS, очевидно, не вирішило цю конкретну проблему ширини тексту / поля вибору.
zuallauz

1
Спробуйте input {text-indent: 5px;}PS <select>тег дуже жорсткий і специфічний для операційної системи - він ігноруватиме багато CSS.
Кріс Кеннон,

Так, відступ тексту працює, якщо ви додасте цей додатковий стиль ... але лише для одного браузера. Тоді він відступає різну кількість у Chrome, тож ще на 2-3 пікселі! Можливо, потрібно якось скинути відступи для виділення та тексту?
zuallauz

3

Це наблизить вас, але такий рівень точності майже неможливий.

<div style="width: 200px"><input type="text" style="width: 100%; margin: 0; padding: 0" /></div>
<div style="width: 200px">
    <select id="Select1" style="width: 100%; margin: 0; padding: 0">
        <option>1</option>
    </select>
</div>

3

Різні браузери застосовують різні стилі за замовчуванням. Я виявив, що скидання полів і відступів до 0 робить обидва елементи однаковими по ширині як у Firefox, так і в Chrome.

<html>
    <head>
        <title>Test</title>
        <style type="text/css">
            input, select {
                margin: 0;
                padding: 0;
                width: 200px;
            }
        </style>
    </head>
    <body>
        <input type="text" value="ABC"><br />
        <select>
            <option>123</option>
        </select>
    </body>
</html>

Мені особисто подобається використовувати мінімальну таблицю стилів скидання CSS, як YUI CSS Reset, перш ніж намагатись зробити дизайн чудовим у багатьох браузерах.


2
У IE вибір все ж на пару пікселів коротший. Тож поки ідеального рішення немає, ми можемо наблизитись близько))
салют

1
Ах, IE. Це майже здається, що це насолоджує бути унікальним. У мене немає жодної версії IE для тестування, але чи відрізняється вона навіть у пізніших версіях, наприклад 9 або 10?
Томас Аптон,

1
Я тестував з IE9, і він все ще мав різницю в ширині 2 пікселі.
салют

Якщо ви подивитесь на текст у двох полях, то помітите, що текст у полі вибору додатково заповнюється. Майже потрібно додати конкретну input { padding-left: 5px; }. Це правильний спосіб зробити це? Я використовував скидання CSS на веб-сайті, який я створював, перш ніж зробити цей базовий тестовий код, але проблема все ще була там. Скидання CSS не вирішило цю конкретну проблему ширини поля вибору тексту / вибору.
zuallauz

1
Подаючи лівий відступ до введення - це те, як я спробував би вирівняти текст у цих двох елементах, якби це було вимогою. Не забувайте, що ці елементи виглядають по-різному в різних операційних системах. Я не впевнений, що спроба вирівняти текст inputта selectелементи є вартою справою, враховуючи всі речі. Вирівнювання зовнішніх країв цих елементів виглядає досить добре, естетично.
Thomas Upton,

2

Додайте клас як до тегів select, так і до введення, тобто:

<input class='custom-input'/>
<select class='custom-input'></select>

потім змініть css нижче відповідно до вашого дизайну:

.custom-input {
        width:140px;
        border:1px solid #ccc;
        margin:1px;
        padding:3px;
        box-sizing: border-box;
        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
        -ms-box-sizing:content-box;
        -moz-box-sizing:content-box;
        -webkit-box-sizing:content-box;
        box-sizing:content-box;
    }

obvs це виправлення для підтримки браузерів


0

Якщо ви використовуєте таблиці 4 вхідних даних, ви можете використовувати наступне рішення - також сумісне з ie7:

<tr style="width:1px;"><td style="width:inherit;position:relative;">
    <select style="width:100%;"> 
    </select> 
</td></tr>
<tr><td>
    <input type="text" style="width:150px;"/>
</td></tr>

Таким чином ширина комірки таблиці буде фіксована до ширини вводу,

І таким чином вибір, отже, завжди брав би решту ширини та ідеально вирівнювався з d введенням.


Це багато додаткового HTML. Це проблема CSS із рішенням CSS.
GlennG

0

Спробуйте видалити межі за замовчуванням з обох елементів:

select, input {
 border:0;
}

0

Так, надзвичайно розчаровує. Однак у мене ніколи не було проблем з цим, поки я не поставив тег "<! DOCTYPE html>" у верхній частині моєї HTML-сторінки. Моя веб-сторінка відображалася належним чином на всіх платформах, які я міг протестувати, доки я не розміщу тег у верхній частині документа.

Хоча це "справжня специфікація", схоже, це джерело цих проблем із вирівнюванням. FWIW, я використовую елементи HTML5, вбудований CSS тощо, все без цього тегу, щоб вказати HTML5. YMMV.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.