Я пишу веб-службу и хочу вернуть данные как XHTML. Поскольку это данные, а не разметка, я хочу, чтобы они были очень чистыми - никаких лишних <div> или <span>. Однако для удобства разработчиков я также хотел бы сделать возвращаемые данные разумно удобочитаемыми в браузере. Для этого я думаю, что хороший способ сделать это - использовать CSS.
Я специально хочу вставить разрывы строк в определенных местах. Я знаю display: block, но он не работает в той ситуации, с которой я сейчас пытаюсь справиться - form с полями <input>. Что-то вроде этого:
<form>
Thingy 1: <input class = "a" type = "text" name = "one" />
Thingy 2: <input class = "a" type = "text" name = "two" />
Thingy 3: <input class = "b" type = "checkbox" name = "three" />
Thingy 4: <input class = "b" type = "checkbox" name = "four" />
</form>
Я бы хотел, чтобы каждая метка отображалась в той же строке, что и соответствующее поле ввода. Я пробовал это:
input.a:after { content: "\a" }
Но это, похоже, ничего не дало.






Один из вариантов - указать шаблон XSLT в вашем XML, который (некоторые) браузеры будут обрабатывать, позволяя вам включать представление с разметкой, CSS, цветами и т. д., Которые не должны влиять на потребителей веб-службы.
Находясь в XHTML, вы можете просто добавить некоторые отступы вокруг элементов с помощью CSS, например.
форма input.a {margin-bottom: 1em}
Используйте javascript. Если вы используете библиотеку jQuery, попробуйте что-нибудь вроде этого:
$("input.a").after("<br/>")
Или что вам нужно.
Всегда нужно полагаться на js, IF-AND-ONLY-IF, ваш код генерируется какой-либо другой структурой или библиотекой. В противном случае мы можем разместить любые html-теги где захотим :)
Я согласен с Джоном Милликиным. Вы можете добавить теги <span> или что-то еще вокруг каждой строки с определенным классом CSS, а затем при необходимости сделать их display: block. Единственный другой способ, который я могу придумать, - это сделать <input> встроенным блоком и заставить его выдавать «очень большие» padding-right, что приведет к переносу встроенного содержимого.
Даже в этом случае лучше всего логически сгруппировать данные в теги <span> (или аналогичные), чтобы указать, что эти данные принадлежат друг другу (а затем позволить CSS выполнить позиционирование).
следующее даст вам новые строки. Это также приведет к появлению дополнительных пробелов впереди ... вам придется испортить отступ в исходном тексте, удалив табуляцию.
form { white-space: pre }
Лучше всего обернуть все ваши элементы в элементы меток, а затем применить CSS к меткам. Псевдоклассы: before и: after не полностью поддерживаются согласованным образом.
Теги ярлыков имеют множество преимуществ, включая повышенную доступность (на нескольких уровнях) и многое другое.
<label>
Thingy one: <input type = "text" name = "one">;
</label>
затем используйте CSS для элементов метки ...
label {display:block;clear:both;}
Я надеялся избежать лишнего элемента обертывания, поскольку основным потребителем этой страницы является программное обеспечение, а не люди. Но, похоже, это необходимо.
Тем лучше, чтобы программное обеспечение имело согласованные индикаторы запуска и остановки.
(Вам не нужно for = "one", когда вы оборачиваете метку вокруг элемента ввода.)
Отбросьте for = "one" и id = "one", это совершенно не нужно и мешает, потому что для него уже определен name.
проголосовали против, потому что каждый волен выбирать, какое решение применять. иногда другое решение неприменимо или по какой-то причине не принимается заказчиком или менеджером проекта.
Похоже, у вас есть несколько элементов формы, которые вы хотите отобразить в списке, верно? Хм ... если бы только те ребята из спецификаций HTML подумали включить разметку для обработки списка элементов ...
Я бы порекомендовал вам настроить это так:
<form>
<ul>
<li><label>Thingy 1:</label><input class = "a" type = "text" name = "one" /></li>
<li><label>Thingy 1:</label><input class = "a" type = "text" name = "one" /></li>
</ul>
</form>
Тогда CSS становится намного проще.
Не забудьте указать атрибуты label "for", если вы их опустите, нет смысла использовать метку в первую очередь, поскольку она никак не связана с элементом ввода.
Чтобы продолжить, вы также можете вложить элемент ввода (или выбрать и т. д.) Внутрь метки и безопасно опустить атрибут «for».
Сарказм на ТАК ... мне не нравится.
Элементы управления формы обрабатываются браузерами особым образом, поэтому многие вещи не обязательно работают должным образом. Одна из этих вещей - сгенерированный контент - он не работает для элементов управления формой. Вместо этого оберните этикетки в <label> и используйте label:before { content: '\a' ; white-space: pre; }. Вы также можете сделать это, перемещая все и добавляя clear: left к элементам <label>.
когда у меня были громкие слова white-space: pre-line или нет white-space: pre-wrap, я не уверен в кроссбраузерности :)
Почему \ является символом новой строки (я вижу, что он работает, но не могу найти никаких документов по этому поводу).
@SamGoody упоминается в этом документе W3C w3.org/wiki/CSS/Properties/white-space, хотя они не говорят, почему они выбрали \ A вместо \ N или \ R ...
Обратная косая черта, за которой следует шестнадцатеричное число, интерпретируется как ссылка на символ. A - это десятый символ Unicode, который является символом перевода строки.
Решение, которое я искал. Спасибо
@AlexisWilke Чтобы добавить к тому, что объяснил Джим: A = 10 в шестнадцатеричном формате (например, 0xA) и символ 10 Unicode - это новая строка. Они не выбрали явно \a вместо \n.
Элемент CSS clear, вероятно, - это то, что вы ищете для получения разрывов строк. Что-то рядом:
#login form input { clear: both; }
гарантирует, что никакие другие плавающие элементы не останутся по обе стороны от ваших полей ввода.
<form>
<label>Thingy 1: <input class = "a" type = "text" name = "one" /></label>
<label>Thingy 2: <input class = "a" type = "text" name = "two" /></label>
<label>Thingy 3: <input class = "b" type = "checkbox" name = "three" /></label>
<label>Thingy 4: <input class = "b" type = "checkbox" name = "four" /></label>
</form>
и следующий css
form label { display: block; }
Секрет в том, чтобы окружить всю вашу штуку, метку и виджет диапазоном, класс которого выполняет блокировку и очистку:
CSS
<style type = "text/css">
.lb {
display:block;
clear:both;
}
</style>
HTML
<form>
<span class = "lb">Thingy 1: <input class = "a" type = "text" name = "one" /></span>
<span class = "lb">Thingy 2: <input class = "a" type = "text" name = "two" /></span>
<span class = "lb">Thingy 3: <input class = "b" type = "checkbox" name = "three" /></span>
<span class = "lb">Thingy 4: <input class = "b" type = "checkbox" name = "four" /></span>
</form>
Идея правильная, но элемент «метка» более семантически верен.
Кроме того, вся разница между <span> и <div> в том, что промежутки - это встроенные элементы, а div - это блочные элементы. Если вы собираетесь таким образом злоупотреблять промежутками, просто используйте div.
<style type = "text/css">
label, input { float: left; }
label { clear:left; }
</style>
<form>
<label>thing 1:</label><input />
<label>thing 2:</label><input />
</form>
Параметры javascript все усложняют. Сделайте так, как предлагали Джон Галлоуэй или daniels0xff.
Это не настоящий ответ, а комментарий.
Когда я писал это больше года назад, комментариев не было.
Никогда не полагайтесь на javascript, чтобы сделать то, что может легко сделать html / css, потому что нет постепенного ухудшения.