Какой HTML / CSS вы бы использовали для создания текстового ввода с фоном? - PullRequest
12 голосов
/ 09 февраля 2009

У меня есть дизайн веб-сайта, который включает в себя поля ввода текста, которые выглядят так:

Поле ввода http://img401.imageshack.us/img401/4453/picture1ts2.png

Мне интересно, как лучше всего создать это поле ввода.

Одна из идей, которые у меня есть, состоит в том, чтобы всегда иметь делитель вокруг ввода с фоновым изображением и отключить все границы в поле ввода и заданную ширину в пикселях, например:

<div class="borderedInput"><input type="text" /></div>

Я пытался отговорить их от использования этого формата, но они не будут обескуражены, так что, похоже, мне придется это сделать.

Это лучше или есть другой способ?

-

Trial:

Я попробовал следующее:

<style type="text/css">
input.custom {
    background-color: #fff;
    background:url(/images/input-bkg-w173.gif) no-repeat;
    width:173px;
    height:28px;
    padding:8px 5px 4px 5px;
    border:none;
    font-size:10px;
}
</style>
<input type="text" class="custom" size="12" />

, но в IE (6 и 7) он делает следующее, когда вы печатаете больше ширины:

по длине http://img240.imageshack.us/img240/1417/picture2kp8.png

Ответы [ 7 ]

10 голосов
/ 09 февраля 2009

Я бы сделал это так:

<style type="text/css">
div.custom {
    background:url(/images/input-bkg-w173.gif) no-repeat;
    padding:8px 5px 4px 5px;
}
div.custom input {
    background-color: #fff;
    border:none;
    font-size:10px;
}
</style>
<div class="custom"><input type="text" class="custom" size="12" /></div>

Вам просто нужно отрегулировать значения отступов, чтобы все было правильно. На мой взгляд, это определенно лучшее решение, так как в любом другом случае вы работаете с целым полем ввода. И все поле ввода - по определению - поле, в которое пользователи могут вводить текст.

Если вы можете положиться на JavaScript, вы можете программно оборачивать такие div-элементы вокруг полей ввода.

Edit: С помощью jQuery вы можете сделать это следующим образом:

$( 'input.custom' ).wrap( '<div class="custom"></div>' );

CSS:

div.custom {
    background:url(/images/input-bkg-w173.gif) no-repeat;
    padding:8px 5px 4px 5px;
}
input.custom {
    background-color: #fff;
    border:none;
    font-size:10px;
}

И ваш HTML:

<input class="custom" ... />
4 голосов
/ 09 февраля 2009

Вам не нужен элемент div, вы можете назначить фон для ввода напрямую.

Редактировать: Вот рабочий код. Я проверил это, но вам придется настроить его под свои нужды. Насколько я могу судить, здесь все нужно.

input {
    background: #FFF url(test.png) no-repeat bottom right;
    width: 120px;
    height: 20px;
    line-height:20px;
    padding:0;
    text-indent:3px;
    margin:0;
    border: none;
    overflow:hidden;
}

Edit2: Я не совсем уверен, почему мне отказывают в голосовании, но этот метод должен работать, если вам не нужно изображение больше, чем сам элемент ввода. В этом случае вы должны использовать дополнительный элемент div. Однако если размер изображения совпадает с размером ввода, дополнительная разметка не требуется.

Edit3: Хорошо, после того, как Бобинс указал на проблему, я становлюсь немного ближе. Это будет работать в IE6 & 7 и близко к FF, но я все еще работаю над этой частью.

input {
    background: #FFF url(test.png) no-repeat 0px 0px;
    background-attachment:fixed;
    width: 120px;
    height: 20px;
    line-height:20px;
    padding:0px;
    text-indent:3px;
    margin:0;
    border: none;
}
body>input {
    background-position:13px 16px;
}

Edit4 : Хорошо, я думаю, что получил его на этот раз, но он требует использования селектора CSS3, поэтому он не будет проверяться как CSS 2.1.

input { 
    background: #FFF url(test.png) no-repeat 0px 0px;
    background-attachment:fixed;
    width: 120px;
    height: 20px;
    line-height:20px;
    padding:0px;
    text-indent:3px;
    margin:0;
    border: none;
}
body>input { 
    background-position:13px 16px;
}
body>input:enabled { 
    background-position:9px 10px;
}

body> input будет предназначаться для всего, кроме IE6, body> input: enabled будет предназначаться для любых элементов формы, которые отключены не для всех браузеров, кроме IE 6, 7 и 8. Однако, потому что: enabled это CSS3-селектор , он не проверяется как CSS2.1. Я не смог найти подходящий селектор CSS2, который позволил бы мне отделить IE7 от других браузеров. Если проблема не в проверке (пока, пока валидатор не переключится на CSS3), это проблема для вас, тогда я думаю, что ваш единственный вариант - дополнительный элемент div.

1 голос
/ 09 февраля 2009

Вы оценили, используя фоновое изображение, как это:

<style type="text/css"> 
  input{ 
  background-color: #AAAAAA; 
  background-image: url('http://mysite.com/input.gif'); 
  border: 0px; 
  font-family: verdana; 
  font-size: 10px; 
  color: #0000FF; 
} 

0 голосов
/ 23 декабря 2011

Самый простой способ избавиться от переполнения без JavaScript прост:

  1. Создайте 3 пролета и установите их высоту на высоту изображение.
  2. Разрежьте изображение на 3 части, гарантируя, что вы обрежете изображение таким образом, чтобы левая и правая круглые части будут на 1-м и 3-м изображениях соответственно.
  3. Установить фон первого участка изображения с левой границей и установите для него повторение.
  4. Установить фон третьего пролета к изображению с правой границей и установите его в нет повтора.
  5. Поместите ввод в средний промежуток, помня установить его высоту на высоту пролетов, а его фон на 2-е изображение и только повтор-х.
  6. Это будет гарантировать, что вход будет казаться, что расширяется по горизонтали после заполнения ввода. нет перекрытия, и JS не требуется.

HTML Предполагая, что высота изображения составляет 60 пикселей, ширина первого и третьего диапазона составляет 30 пикселей,

<span id="first">nbsp;</span><br />
<span id="second"><input type="text" /></span><br />
<span id="third">nbsp;</span>

CSS

span#first{background:url('firstimage') no-repeat; height:60px; width:30px;}
span#third{background:url('thirdimage') no-repeat; height:60px; width:30px;}
span#second input{background:url('second image') repeat-x; height:60px;}

Это должно решить вашу проблему.

0 голосов
/ 13 февраля 2009

okoman правильно понял аспект CSS. Могу ли я предложить использовать <label> для улучшения семантической структуры разметки?

<label id="for-field-name" for="field-name">
    <span class="label-title">Field Name <em class="required">*</em></span>
    <input id="field-name" name="field-name" type="text" class="text-input" />
</label>

<style type="text/css">
    label, span.label-title { display: block; }
</style>

Мало того, что это более доступно, но и предоставляет множество хуков, которые вы можете использовать для любого типа манипулирования DOM, валидации или специфического для поля стиля в будущем.

Редактировать: Если вы не хотите, чтобы заголовок метки отображался по какой-либо причине, вы можете присвоить ему класс 'accessibility' и установить класс display: none; в CSS. Это позволит программам чтения с экрана понимать ввод, но скрывать его от обычных пользователей.

0 голосов
/ 13 февраля 2009

AFAIK, проблему с фоновой прокруткой можно решить либо в Firefox и в друзьях, либо в Internet Exploder; но не делайте всех счастливыми сразу.

Обычно я бы сказал, чтобы стилизовать ввод напрямую, но теперь, когда я думаю об этом, пример div звучит не слишком плохо и должен позаботиться о вашей проблеме с прокруткой фонового изображения.

В этом случае вы должны установить div в качестве позиции: относительный и поместить в него входные данные с правильными отступами и шириной (или шириной 100%, если отступ равен 0), прозрачный фон и поместить изображение в div.

0 голосов
/ 09 февраля 2009

Я делал это несколько раз. У меня есть фоновое изображение внутри div и использую css для позиционирования поля ввода соответственно.

Загляните на следующий созданный мною сайт, который использовал эту технику, и используйте код: http://www.ukoffer.com/ (информационный бюллетень справа)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...