Как я могу получить абсолютно позиционированный div, выходящий за пределы его относительно позиционированного родителя, который имеет переполнение: auto?

Большинство существующих ответов либо зависят от некоторой внешней библиотеки, либо требуют специальной версии 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("  ");
  }
}
30
задан Dai 16 May 2017 в 20:10
поделиться

8 ответов

Вашей проблемой является родитель 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>
44
ответ дан Dai 16 May 2017 в 20:10
поделиться
  • 1
    Это только работало на меня после удаления одинарных кавычек [приблизительно 110], иначе загрузки энергии, жалующиеся на не нахождение метки. Это для gvim на окнах. – Ein 3 July 2013 в 04:14

Учитывая Ваши спецификации, это является лучшим, я мог, придумал:

<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;, таким образом, полосы прокрутки появятся в случае необходимости, и выпадающее отделение будет похоже, оно расширяется, "снаружи это - родитель". Оба держатся вместе под тем же родительским отделением, поскольку Вы заявили, что они контекстуально относились друг к другу.

4
ответ дан lima 16 May 2017 в 20:10
поделиться
  • 1
    Я использовал это, чтобы немедленно начать вводить при фиксации в мерзавце: 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.: (

4
ответ дан buti-oxa 16 May 2017 в 20:10
поделиться

Это невозможно. Если Вы устанавливаете overflow:auto на родительском DIV, который блокирует любой дочерний DIV от того, чтобы убегать из поля содержания.

Вы могли попытаться играть с z-index значения, но это может заставить Вас слепнуть в левом глазу.

идея состояла бы в том, чтобы обернуть родительский DIV с другим DIV так, чтобы DIV, который Вы хотите к всплывающему, был расположен согласно DIV прародителя. Но тот путь даст Вам кистевой туннель и не будет работать также, потому что необходимо было бы знать, где в потоке родительского DIV Вы хотите, чтобы дочерний DIV был.

3
ответ дан bjb568 16 May 2017 в 20:10
поделиться
  • 1
    Это должно быть принятым ответом, по-моему, потому что он не зависит от bash' s файлы конфигурации, которые могли бы быть релевантными при выполнении gvim с неинтерактивной, оболочкой без входов в систему (-c). – Bengt 7 January 2014 в 03:38

Я сказал бы, что то, что это контекстно-зависимо, - то, что вызывает Вас проблемы. Возможно, Вы могли реструктурировать, как это настраивается? У меня был бы родительский класс отделения, который предоставляет контекст этим двум, и их отделились друг от друга в этом отделении (использующий родственника, располагающего для выравнивания их, как Вы хотите?)

Мой 2c

0
ответ дан Ape-inago 16 May 2017 в 20:10
поделиться
  • 1
    vim +star также doesn' t вмешиваются в ронение к нормальному режиму – Christopher Bottoms 21 February 2014 в 05:27

Просто удалите эти переполнение: автоматический часть и близко внутреннее отделение правильно с закрывающим тэгом, тот путь это работает в IE6, IE7, Firefox 3 и Opera =>, вероятно, все браузеры.

0
ответ дан jeroen 16 May 2017 в 20:10
поделиться
  • 1
    Если Вы хотите сделать его стандартом все время, необходимо добавить VimEnter к списку событий, этот способ, которым это все еще работает, если Вы просто звоните vim без каких-либо аргументов. – Skillmon 7 June 2017 в 18:42

Попытка с помощью переполнения: видимый; вместо этого.

-1
ответ дан Justin Gallagher 16 May 2017 в 20:10
поделиться
  • 1
    +1 я думаю, читая форму OP, это наиболее вероятно, чем он был после. По существу: он хочет что-то не-энергия. Или, по крайней мере, меньшее-количество-энергия. – sehe 13 July 2012 в 21:21

я не уверен, как достигнуть того, что я хочу.

Ни один не 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>
5
ответ дан bobince 16 May 2017 в 20:10
поделиться
  • 1
    That' s, потому что одинарные кавычки don' t работают как этот над окнами. – Steve Bennett 3 October 2013 в 16:12