Большинство существующих ответов либо зависят от некоторой внешней библиотеки, либо требуют специальной версии Java. Вот простой код для правильной печати строки JSON, но только с использованием общих Java-API (доступный в Java 7 для более высоких версий, но не для старой версии).
Основная идея заключается в тигрене основанного на форматировании по специальным символам в JSON. Например, если наблюдается «{» или «[], код создаст новую строку и увеличит уровень отступа.
Отказ от ответственности: я тестировал это только для некоторых простых случаев JSON (базовый ключ- пара значений, список, вложенный JSON), поэтому может потребоваться некоторая работа для более общего текста JSON, например строкового значения с кавычками внутри или специальных символов (\n, \ t и т. д.).
/**
* A simple implementation to pretty-print JSON file.
*
* @param unformattedJsonString
* @return
*/
public static String prettyPrintJSON(String unformattedJsonString) {
StringBuilder prettyJSONBuilder = new StringBuilder();
int indentLevel = 0;
boolean inQuote = false;
for(char charFromUnformattedJson : unformattedJsonString.toCharArray()) {
switch(charFromUnformattedJson) {
case '"':
// switch the quoting status
inQuote = !inQuote;
prettyJSONBuilder.append(charFromUnformattedJson);
break;
case ' ':
// For space: ignore the space if it is not being quoted.
if(inQuote) {
prettyJSONBuilder.append(charFromUnformattedJson);
}
break;
case '{':
case '[':
// Starting a new block: increase the indent level
prettyJSONBuilder.append(charFromUnformattedJson);
indentLevel++;
appendIndentedNewLine(indentLevel, prettyJSONBuilder);
break;
case '}':
case ']':
// Ending a new block; decrese the indent level
indentLevel--;
appendIndentedNewLine(indentLevel, prettyJSONBuilder);
prettyJSONBuilder.append(charFromUnformattedJson);
break;
case ',':
// Ending a json item; create a new line after
prettyJSONBuilder.append(charFromUnformattedJson);
if(!inQuote) {
appendIndentedNewLine(indentLevel, prettyJSONBuilder);
}
break;
default:
prettyJSONBuilder.append(charFromUnformattedJson);
}
}
return prettyJSONBuilder.toString();
}
/**
* Print a new line with indention at the beginning of the new line.
* @param indentLevel
* @param stringBuilder
*/
private static void appendIndentedNewLine(int indentLevel, StringBuilder stringBuilder) {
stringBuilder.append("\n");
for(int i = 0; i < indentLevel; i++) {
// Assuming indention using 2 spaces
stringBuilder.append(" ");
}
}
Вашей проблемой является родитель position:relative. Так как у Вас есть то расположение на элемент, внутреннее поле будет ВСЕГДА оставаться в переполнении (position:absolute, относительно ближайшего расположенного родителя).
Для предотвращения проблемы можно удалить "position:relative" из внешнего отделения и добавить отделение обертки с "position:relative";. необходимо будет тогда добавить "top:0"; объявление Вашему внутреннему отделению (у Вас должно всегда быть это, на самом деле).
конечным результатом является одно дополнительное отделение, и это похоже на это: (можно удалить стиль "z-index:-1", я просто добавил это, таким образом, Вы видите результат лучше)
<div style="position:relative;border:1px solid blue;">
<div style="height: 100px; width: 100px; background: red; overflow: auto;">
if there is some really long content here, it will cause overflow, but the green box will not
<div style="position:absolute; z-index:-1; left: 20px; top:0; height: 200px; width: 200px; background: green;">
</div>
</div>
</div>
Учитывая Ваши спецификации, это является лучшим, я мог, придумал:
<div style="position: relative; height: 100px; width: 100px; background: red;">
<div style="height: 100px; width: 100px; overflow: auto;">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
<div style="position: absolute; top: 20px; left: 20px; height: 100px; width: 100px; background: green;"></div>
</div>
Там у Вас есть свое отделение с overflow: auto;
, таким образом, полосы прокрутки появятся в случае необходимости, и выпадающее отделение будет похоже, оно расширяется, "снаружи это - родитель". Оба держатся вместе под тем же родительским отделением, поскольку Вы заявили, что они контекстуально относились друг к другу.
git config --global core.editor "vim -c 'startinsert'"
– Daniel Böhmer
26 February 2016 в 22:35
Вы используете абсолютное расположение внутреннего отделения для расположения его относительно внешнего отделения, но Вы не хотите, чтобы его содержание рассчитало как внешнее содержание отделения. Для достижения этого необходимо разделить внутреннюю позицию отделения от внутреннего содержания отделения. Можно попытаться сделать это путем помещения содержания в фиксированное отделение
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
<head> <title>Test</title> </head>
<body>
<div style="position: relative; height: 100px; width: 100px; background: red; overflow: auto;">
<div style="position: absolute; top: 20px; left: 20px; height: 10px; width: 10px;">
<div style="position: fixed; height: 100px; width: 100px; background: green;"></div>
</div>
</div>
</body>
</html>
, прием - то, что фиксированное отделение w/o возглавляет/понимает/оставляет/исправляет определенный, расположит себя в его "статическое" положение, которое, кажется, то, в чем Вы нуждаетесь.
у Вас могут быть проблемы с z-порядком, но от Вашего объяснения Вы действительно хотите, чтобы Ваше "меню" было выше всего остального. (Я предполагаю, что это приходит и уходит). Вы будете уверенный иметь проблемы при печати страницы - если будет больше чем одна страница, зафиксированный элемент повторяется.
Как jvenema указанный, это не будет работать в IE6.: (
Это невозможно. Если Вы устанавливаете overflow:auto
на родительском DIV, который блокирует любой дочерний DIV от того, чтобы убегать из поля содержания.
Вы могли попытаться играть с z-index
значения, но это может заставить Вас слепнуть в левом глазу.
идея состояла бы в том, чтобы обернуть родительский DIV с другим DIV так, чтобы DIV, который Вы хотите к всплывающему, был расположен согласно DIV прародителя. Но тот путь даст Вам кистевой туннель и не будет работать также, потому что необходимо было бы знать, где в потоке родительского DIV Вы хотите, чтобы дочерний DIV был.
-c
).
– Bengt
7 January 2014 в 03:38
Я сказал бы, что то, что это контекстно-зависимо, - то, что вызывает Вас проблемы. Возможно, Вы могли реструктурировать, как это настраивается? У меня был бы родительский класс отделения, который предоставляет контекст этим двум, и их отделились друг от друга в этом отделении (использующий родственника, располагающего для выравнивания их, как Вы хотите?)
Мой 2c
vim +star
также doesn' t вмешиваются в ронение к нормальному режиму
– Christopher Bottoms
21 February 2014 в 05:27
Просто удалите эти переполнение: автоматический часть и близко внутреннее отделение правильно с закрывающим тэгом, тот путь это работает в IE6, IE7, Firefox 3 и Opera =>, вероятно, все браузеры.
VimEnter
к списку событий, этот способ, которым это все еще работает, если Вы просто звоните vim
без каких-либо аргументов.
– Skillmon
7 June 2017 в 18:42
Попытка с помощью переполнения: видимый; вместо этого.
я не уверен, как достигнуть того, что я хочу.
Ни один не I —  more информация о том, что Вы хотите?
, Возможно, это была бы хорошая идея разделить элемент с переполнением от элемента с вЂposition: relative’, особенно если это только используется для определения местоположения абсолютной внутренней части.
<div style="position: relative;">
<div style="height: 100px; width: 100px; background: red; overflow: auto;">...</div>
<div style="position: absolute; top: 20px; left: 20px; height: 100px; width: 100px; background: green;">...</div>
</div>