Обзор Инлайновый контекст форматирования


Содержание

One more step

Please complete the security check to access codepen.io

Why do I have to complete a CAPTCHA?

Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.

What can I do to prevent this in the future?

If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.

If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.

Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.

Cloudflare Ray ID: 534196f02ea08de1 • Your IP : 188.64.174.135 • Performance & security by Cloudflare

Усачёв М., Стрельцын И. — Инлайновый контекст форматирования

Эта книга посвящена одной из самых важных и вместе с тем самой загадочной, неизученной, неоднозначной иполной неочевидных сюрпризов стороне действующей спецификации CSS — визуальному форматированию текста.

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

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

Что такое контекст форматирования?

Рекомендованные сообщения

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Войти

Уже зарегистрированы? Войдите здесь.

Статистика пользователей

Сейчас на странице 0 пользователей

Нет пользователей, просматривающих эту страницу.

Спрашивают сейчас

Автор: npofopr
Создана 18 октября

Автор: digenis
Создана 20 часов назад

Автор: envoleon
Создана Суббота в 11:42

Обзор: Инлайновый контекст форматирования

Гость » 22 окт 2020, 10:22

Инлайновый контекст форматирования

Год : 2012
Автор : Усачёв М., Стрельцын И.
Жанр : CSS
Издательство : css-live.ru
Серия : Тайны CSS 2.1
Язык : Русский
Формат : PDF
Качество : Изначально компьютерное (eBook)
Интерактивное оглавление : Да
Количество страниц : 77
Описание :
Эта книга, написанная создателями css-live.ru (Максимом Усачёвым aka psywalker и Ильёй Стрельцыным aka SelenIT), посвящена одной из самых важных и вместе с тем самой загадочной, неизученной, неоднозначной иполной неочевидных сюрпризов стороне действующей спецификации CSS — визуальному форматированию текста.

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

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

1. Введение в инлайновый контекст форматирования (ИКФ): основные понятия (1-я публикация цикла “Тайны CSS2.1″). 6

2. Введение в инлайновый контекст форматирования (ИКФ): основные понятия (2-я публикация цикла “Тайны CSS2.1″). 11
3. ИКФ: высота строки, часть 1 (3-я публикация цикла “Тайны CSS2.1″). 17

4. ИКФ: высота строки, часть 2 (4-я публикация цикла “Тайны CSS2.1″). 21

5. ИКФ: высота строки, часть 3 (5-я публикация цикла “Тайны CSS2.1″). 25


6. ИКФ: высота строки, часть 4 (6-я публикация цикла “Тайны CSS2.1″). 30

7. ИКФ: высота строки, часть 5 (7-я публикация цикла “Тайны CSS2.1″). 35

8. ИКФ: Вертикальное выравнивание в строке, часть 1 (8-я публикация цикла “Тайны CSS2.1″). 44

9. ИКФ: Вертикальное выравнивание в строке, часть 2 (9-я публикация цикла “Тайны CSS2.1″). 49

10. ИКФ: Вертикальное выравнивание в строке, часть 3 (10-я публикация цикла “Тайны CSS2.1″). 58

11. ИКФ: Горизонтальное выравнивание, часть 1 (11-я публикация цикла “Тайны CSS2.1″). 61

12. ИКФ: Горизонтальное выравнивание, часть 2 (12-я публикация цикла “Тайны CSS2.1″). 65

13. ИКФ: Горизонтальное выравнивание, часть 3 (13-я публикация цикла “Тайны CSS2.1″). 70

Контекст для статичного метода

Решил вынести часть кода в метод, чтоб использовать из других классов. И столкнулся с проблемой: «Не знаю как получить контекст для статичного метода». Android Studio все поподчеркивало. Пока не нашел, как исправить. Может кто подскажет?

1 ответ 1

Если вам внутри метода необходим какой либо объект (а контекст — это объект), то передавайте его туда параметром, как, собственно у вас сделано в приведенном куске кода (а на скриншоте нет).

ContentFragment.this — это некорректная конструкция для статического метода, так как для него не существует никакого this . this — это объект, а статический метод является методом класса. Если вам нужен ContentFragment.this , то передавайте его параметром

Илон Маск рекомендует:  Псевдоэлементы CSS

Цель то какая у вас? Что в итоге хотите получить? обратиться к методу 1-класса из 2-класса — это не цель, это попытка ее достичь, скорее всего неправильная, из разряда «как закрутить шуруп молотком»

Модель визуального форматирования

Нормальное расположение

Боксы при нормальном обтекании относятся к контексту форматирования , который может быть уровня блока и инлайн, но не тем и другим одновременно. Боксы блока находятся в контексте форматирования блока. Инлайн-боксы находятся в контексте инлайн-форматирования.

Контекст форматирования блока

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

В контексте форматирования блока левый внешний край бокса касается левого края содержащего блока (для форматирования справа-налево — касается правый край). Это верно даже в случае с поплавками (хотя область содержимого может усекаться из-за поплавков).

Информацию о разрывах страниц в страничных носителях см. в разделе допустимые разрывы страниц.

Контекст инлайн-форматирования

В контексте инлайн-форматирования боксы устанавливаются по горизонтали, один за другим, начиная от верха содержащего блока. Горизонтальные поля, рамки и заполнение рассматриваются как отношения между боксами. Боксы могут быть выровнены по вертикали несколькими способами: могут быть выровнены их нижние или верхние края или базовые линии текста внутри них. Прямоугольная область, содержащая боксы, которые образуют строку, называется строчный бокс .

Ширина cтрочного бокса определяется содержащим блоком. Высота cтрочного бокса определяется правилами из раздела вычисление высоты строки. Строчный бокс всегда имеет высоту, достаточную для содержащихся в нём боксов. В то же время, он может быть выше, чем самый высокий из содержащихся в нём боксов (если, например, боксы выровнены так, что базовые линии выстроены). Если высота бокса В меньше, чем высота cтрочного бокса , содержащего его, то вертикальное выравнивание В внутри cтрочного бокса определяется свойством ‘vertical-align’.

Если несколько инлайн-боксов не входят по горизонтали в один cтрочный бокс , они распределяются на два или более вертикально упакованных строчных бокса . Таким образом, параграф будет вертикальным стеком из строчных боксов . Строчные боксы упакованы по вертикали без разделения и никогда не перекрываются.

Вообще, левый край cтрочного бокса касается левого края его содержащего блока, и правый край касается правого края его содержащего блока. В то же время, боксы-поплавки могут появляться между краем содержащего блока и краем строчного блока. Таким образом, хотя строчные боксы в том же самом контексте инлайн-форматирования обычно имеют ту же самую ширину (что и содержащий блок), они могут иметь и другую ширину из-за поплавков, уменьшающих горизонтальное пространство. Строчные боксы в том же самом контексте инлайн-форматирования обычно различаются по высоте (например, одна строка может содержать высокое изображение, а другие строки — только текст).

Если суммарная ширина инлайн-боксов в строке меньше, чем ширина cтрочного бокса , содержащего их, то их распределение по горизонтали внутри cтрочного бокса определяется свойством ‘text-align’. Если это свойство имеет значение ‘justify’, ПА может уплотнить инлайн-боксы .

Поскольку инлайн-бокс не может превысить ширину cтрочного бокса , длинные инлайн-боксы разделяются на несколько боксов, и эти боксы распределяются на несколько строчных боксов . Если инлайн-бокс разделён, то поля, рамки и заполнение не имеют визуального эффекта в тех местах, где происходит разделение. Форматирование полей, рамок и заполнения может не быть определено полностью, если разделение происходит внутри двунаправленного внедрения.

Инлайн-боксы могут также быть разделены на несколько боксов внутри одного cтрочного бокса из-за двунаправленной обработки текста.

Вот пример конструкции инлайн-боксов. Следующий параграф (созданный элементом Р уровня блока в HTML) содержит анонимный текст, распределённый между элементами EM и STRONG:

Элемент P генерирует бокс блока, содержащий пять инлайн-боксов, три из которых — анонимные:

  • Anonymous: «Several»
  • EM: «emphasized words»
  • Anonymous: «appear»
  • STRONG: «in this»
  • Anonymous: » sentence , dear.»

Чтобы сформатировать параграф, ПА вставляет пять боксов в cтрочный бокс. В этом примере бокс, генерируемый для элемента P, устанавливает содержащий блок для строчных боксов . Если содержащий блок достаточно широк, все инлайн-боксы войдут в один cтрочный бокс:

если нет, инлайн-боксы будут разделены и распределены по нескольким строчным боксам. Предыдущий параграф может быть разделён так:

В предыдущем примере бокс EM был разделён на два бокса EM (назовём их «split1» и «split2»). Поля, рамки, заполнение или текстовый орнамент не имеют видимого эффекта после split1 или до split2.

Рассмотри следующий пример:

В зависимости от ширины P, боксы могут распределиться так:

  • Поле вставлено до «emphasized» и после «words».
  • Заполнение вставлено до, сверху и снизу от «emphasized» и после, сверху и снизу от «words». Пунктирная рамка отображается с трёх сторон в каждом случае.

Относительное позиционирование

После того, как бокс расположен в соответствии с нормальным расположением, он может быть сдвинут относительно этой позиции. Это называется относительным позиционированием. Смещение бокса (B1) таким способом не окажет воздействия на бокс (B2), следующий за ним: B2 получит такую позицию, как будто B1 не смещён и B2 не перемещается после применения смещения B1. Это предполагает, что относительное позиционирование может вызывать взаимное перекрытие боксов.

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

Относительно позиционированный бокс генерируется, когда свойство ‘position’ элемента имеет значение ‘relative’. Смещение специфицируется свойствами ‘top’ , ‘bottom’ , ‘left’ и ‘right’ .

Динамическое перемещение боксов, позиционированных относительно, может создавать эффекты анимации в среде скриптов (см. также свойство ‘visibility’). Относительное позиционирование можно использовать также как общую форму под- и надиндексов, за исключением того, что высота строки не устанавливается автоматически при рассмотрении позиционирования. См. дополнительно описание вычисления высоты строки.

Примеры относительного позиционирования есть в разделе Сравнение нормального позиционирования, поплавков и абсолютного позиционирования.

Пройти месячные онлайн-курсы от HTML Academy «Базовый HTML и CSS» и «Продвинутый HTML и CSS»

Полезные ссылки в этапах цели!

Постоянно натыкаюсь на отзывы (на различных ресурсах) о курсах HTML Academy, где пишут, что у них самое лучшее обучение HTML и CSS. Стало интересно, чем же они отличаются от остальных, заинтересовал их метод. Когда-то раньше проходил пару бесплатных интерактивных мини-курсов на их сайте, но так как я знал большинство из имеющейся там информации — меня процесс изучения особо не впечатлил и не зацепил. Но отзывы на форумах веб-разработчиков все не прекращались, и вот в итоге решил пройти их курсы, закрепив тем самым знания, что-то вспомнить, что-то узнать из упущенного ранее.

В данной цели будет рассматриваться Базовый Месячный онлайн-интенсив.
На данный момент дошел до 4-го раздела.

Верстать буду следующим образом:

  • PhpStorm;
  • UPDATE 21.03.2020:AngularJS;
  • TypeScript (изучаю его сейчас как раз, пока основы);
  • Gulp с настроенными плагинами и Live Reload;
  • Jade;
  • Stylus.

Все файлы будут выложены на Github, включая файлы сборщика.
На Codepen тоже выложу, для наглядности.

Критерий завершения

Все уроки по курсу просмотрены, выполнены все задания из курса, сверстаны все макеты и выложены на github/codepen

Личные ресурсы

Сам курс, время, желание, phpstorm, photoshop

Экологичность цели

Эта цель позволит мне закрепить мои знания по HTML и CSS и, в принципе, пополнить портфолио тестовыми проектами :)

Приложения и сервисы для сравнения текста

Описание приложений : Kaleidoscope, Araxis Merge, Deltawalker, Sublime Text; сервисов: Diff checker, NUM2WORD; и работы в терминале.

Для работы с текстом я использую функцию отслеживания изменений (контроль версий), чтобы при необходимости вернуться к предыдущему варианту. Такая функция есть в приложениях Pages, Microsoft Word, Scrivener, в онлайн-редакторах Google Docs, Draft. Но они не подходят, если необходимо сравнить два разных документа. В Word есть функция сравнения, но после загрузки двух документов выводится только один, с указанием отличий. Нет двухпанельного режима, в котором сравниваются документы и визуально выделяются отличия, как в перечисленных ниже приложениях и сервисах.

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

Приложения: Kaleidoscope, Araxis Merge, Deltawalker, Sublime Text.

Цикл статей «Инлайновый контекст форматирования» в PDF-формате

Где-то около полугода мы с моим коллегой по цеху SelenIT2 копались в спецификациях, чтобы изучить одну из самых важных и загадочных сторон действующей спецификации CSS — визуальное форматирование текста.


Для многих не секрет, что спецификация — это лабиринт и что порой выбраться из него не так-то и просто. Поэтому периодически нам приходилось обращаться за помощью к таким гуру, как Boris Zbarsky, fantasai и не только.

Все наши раскопки и заключения мы выписывали в статьи, а статьи в цикл «Тайны CSS 2.1». Спустя пол года тема была раскрыта полностью и заняла тринадцать добротных статей.

И тут мы подумали, а почему бы не собрать все эти публикации в одном месте? Таким образом на свет появилась идея с электронной книгой в формате PDF. Мы решили, что она будет полезна по многим причинам. Во-первых, это удобно, ведь вся тема находится только в ней, во-вторых, книгу в pdf-формате можно читать находясь в оффлайне, в-третьих, многие любят читать именно книжный вариант, а не лазить по сайту, ну и в конце концов такую книжку можно взять с собой в дорогу, благо сейчас 2012 год и с этим нет проблем.

Так как мы не планируем бросать изучение спецификаций и собираемся писать статьи и выпускать ещё книжки, очень хотелось бы узнать ваше мнение, как вообще идея и удобно ли это для пользователей?

Как работает контекст блочного форматирования CSS?

Спецификации CSS2.1 говорят о том, что в контексте форматирования блоков блоки располагаются вертикально, начиная сверху. Это происходит, даже если на пути присутствуют плавающие элементы, кроме случаев, когда блок-блок устанавливает новый контекст форматирования блока. Как мы знаем, когда браузеры отображают блоки блоков в контексте форматирования блоков, плавающий элемент опускается, почему работает создание нового контекста форматирования блоков?

Как блоки (блоки блоков и встроенные блоки) расположены в нормальном потоке?

Я где-то читал, что блочные элементы генерируют блочные блоки, но плавающие элементы игнорируются, когда пользовательский агент рисует блок, и учитывают их при заполнении контента. Хотя плавающие элементы будут перекрывать границу блоков других элементов, решение заключается в создании нового контекста форматирования блока для перекрывающихся элементов с использованием overflow:hidden .

«Новый контекст форматирования блока по-прежнему является блочным форматированием», поэтому при рисовании блока он также будет обрабатывать плавающий элемент, как если бы он не выходил. Это правильно или я неправильно понял «новый контекст форматирования блока?»

Обновление: больше вопросов

Говоря: «Именно это поведение полезно для макетов столбчатых стилей. Однако основное его использование — это прекращение операций с плавающей точкой, скажем, в div с« основным содержимым », на самом деле очищение столбцов с плавающей стороной, то есть операций с плавающей точкой, которые появляются ранее в исходном коде».

Я не понимаю смысла, приведу пример, может быть, вы меня поймете.

Я думал, что плавающая коробка должна всплывать наверх связующего блока — div с content класса. Кроме того, если всплывающее окно появляется ранее в разметке, то оно будет отображать то, что я думаю, должно быть.

Как мы можем это объяснить? Можем ли мы использовать «блочный контекст форматирования и встроенный контекст форматирования», чтобы объяснить это?

1 ответ

Плавания, абсолютно позиционированные элементы, блочные контейнеры (такие как встроенные блоки, ячейки таблиц и заголовки таблиц), которые не являются блочными блоками, и блочные блоки с «переполнением», отличным от «видимого» (кроме случаев, когда это значение было распространено) к окну просмотра) установите новые контексты форматирования блока для их содержимого.

С моим жирным шрифтом, это установить бит, который важен

Это означает, что элемент, который вы используете overflow (что-либо кроме видимого) или float или inline-block ..etc on, становится ответственным за расположение его дочерних элементов. Это дочерние элементы, которые затем «содержатся», независимо от того, являются ли они плавающими или разрушающимися полями, они должны полностью содержаться ограничивающим их родителем.

В контексте форматирования блока левый внешний край каждого блока касается левого края содержащего блока (для форматирования справа налево касание правого края)

Что означает вышеуказанная строка:

Поскольку блок может быть только прямоугольным и не иметь неправильную форму, это означает, что новый контекст форматирования блока между двумя поплавками (или даже рядом с ним) не будет охватывать соседние поплавки. Внутренние, дочерние блоки могут простираться только до того, чтобы касаться их родителей левой (или правой в RTL) кромки. Именно это поведение полезно для макетов столбчатых стилей. Основное использование этого, однако, заключается в том, чтобы останавливать операции с плавающей точкой, скажем, в div с «основным содержимым», фактически очищая боковые столбцы с плавающей точкой, то есть операции с плавающей точкой, которые появляются ранее в исходном коде.

В обычных обстоятельствах float должен очистить все предыдущие плавающие элементы, которые ранее плавали во всем исходном коде, а не только в отображаемом вами «столбце».

Это свойство указывает, какие стороны блока (ов) элемента могут не быть смежными с более ранним плавающим блоком. Свойство ‘clear’ не учитывает плавающие элементы внутри самого элемента или в других контекстах форматирования блока

Допустим, у вас есть макет из трех столбцов, в котором левый и правый столбцы смещены влево и вправо соответственно, боковые столбцы теперь находятся в новых контекстах форматирования блоков, потому что они перемещаются (помните, что float также является одним из свойств, устанавливающих новый BFC). ), так что вы можете свободно перемещать элементы списка внутри них, и они очищают только те float, которые уже находятся внутри боковых столбцов, которые больше не заботятся о плавающих ранее в исходном коде

Сделать основной контент новым контекстом блочного форматирования или нет?

Теперь этот средний столбец, вы можете просто разметить его с обеих сторон, чтобы он аккуратно сидел между двумя боковыми плавающими столбцами и занимал оставшуюся ширину, обычным способом получить желаемую ширину, если центральный столбец «жидкий» — что будет все будет хорошо, пока вам не понадобится использовать float / просвет внутри вашего содержимого div (обычное явление для тех, кто использует хаки «clearfix» или шаблоны, включая их)

Возьмите этот очень простой код:

Это производит следующее:

В целом это хорошо, особенно если у вас нет фоновых цветов или внутренних (в основном содержимом) плаваний — обратите внимание, что плавания в порядке (еще не очищены), они, вероятно, делают то, что вы, кроме них, но они, H3 ‘s верхнее поле и нижнее поле в действительности не содержатся в содержимом div (светло-серый фон).

Итак, к тому же простому маргинальному сценарию из приведенного выше кода добавьте:

в CSS, и измените второе всплывающее окно HTML на:

На этот раз вы получите это:

Второй поплавок очищает правую сторону, но очищает всю высоту правой колонки. Правый столбец находится в исходном коде раньше, поэтому он очищается, как сказано! Вероятно, не желаемый эффект, хотя, также обратите внимание, что поля h3 и p по-прежнему свернуты (не содержатся).

Заставь его установить контекст форматирования блока, ради детей!

и, наконец, заставить главный столбец контента взять на себя ответственность — стать контекстом блочного форматирования — за его содержимое: remove margin: 0 200px; из основного содержимого CSS и ADD overflow: hidden; и вы получите это:

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

При широком использовании перезагрузок в наши дни поля становятся менее заметными (а IE до сих пор не совсем их понимает), однако то, что только что произошло с «основным контентом» центра, так это то, что он стал контекстом блочного форматирования и теперь отвечает за его собственные дочерние (потомковые) элементы. На самом деле это очень похоже на раннее представление Microsoft о hasLayout, в нем используются те же свойства display: inline-block , float и overflow что угодно, кроме видимых, и, конечно, ячейки таблицы всегда имеют разметку . однако без ошибок;)

Надеюсь, это поможет, любые вопросы не стесняйтесь задавать!

Обновление: больше информации в вопросе:

Когда вы говорите «но плавающие элементы игнорируются, когда пользовательский агент рисует блок и учитывает их при заполнении контента».

Да, плавающие элементы обычно перекрывают свои контейнеры, это то, что вы имеете в виду относительно родительских границ? Когда элемент блока нарисован и содержит плавающий элемент, родительский элемент самого блока рисуется в виде прямоугольника под плавающей точкой, и это «встроенные анонимные блоки» или просто «линейные блоки» других дочерних элементов, которые сокращаются, чтобы освободить место для поплавок

Возьми этот код:

Который производит это:

Вы видите, что родительский элемент на самом деле не содержит float, так как он не переносит его полностью . float просто плавает поверх содержимого — если бы вы продолжали добавлять содержимое в div, он в конечном итоге был бы перенесен под плавающей точкой, потому что не было бы необходимости (анонимных) «строковых блоков» элемента p больше сокращать себя.

Я покрасил элемент абзаца, чтобы вы могли видеть, что он тоже фактически находится под плавающей точкой, темно-серый фон — это то место, где начинается абзац, белый текст — то, где начинается «анонимная строка» — только они на самом деле «освобождают место». «для поплавка, если вы не скажете это иначе (т.е. вы измените контекст)

Опять же, ссылаясь на рисунок выше, если вы хотите выделить левую сторону элемента p , да, это остановит перенос текста под нижней частью поплавка, потому что «линейные блоки» (белый текст) будут касаться только левого края их контейнера, и вы перенесете цветной фон p вправо, вдали от float, но вы не измените поведение контекста форматирования p . Как и в центре столбца на первом рисунке выше;)

Илон Маск рекомендует:  Strong сильное подчеркивание
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL