pub(crate) struct ContainingBlockManager<'a, T> {
pub for_non_absolute_descendants: &'a T,
pub for_absolute_descendants: Option<&'a T>,
pub for_absolute_and_fixed_descendants: &'a T,
}
Expand description
A data structure used to track the containing block when recursing through the Fragment tree. It tracks the three types of containing blocks (for all descendants, for absolute and fixed position descendants, and for fixed position descendants).
Fields§
§for_non_absolute_descendants: &'a T
The containing block for all non-absolute descendants. “…if the element’s position is ‘relative’ or ‘static’, the containing block is formed by the content edge of the nearest block container ancestor box.” This is also the case for ‘position: sticky’ elements. https://www.w3.org/TR/CSS2/visudet.html#containing-block-details
for_absolute_descendants: Option<&'a T>
The containing block for absolute descendants. “If the element has ‘position: absolute’, the containing block is established by the nearest ancestor with a ‘position’ of ‘absolute’, ‘relative’ or ‘fixed’, in the following way:
- In the case that the ancestor is an inline element, the containing block is the bounding box around the padding boxes of the first and the last inline boxes generated for that element. In CSS 2.1, if the inline element is split across multiple lines, the containing block is undefined.
- Otherwise, the containing block is formed by the padding edge of the ancestor.
https://www.w3.org/TR/CSS2/visudet.html#containing-block-details If the ancestor forms a containing block for all descendants (see below), this value will be None and absolute descendants will use the containing block for fixed descendants.
for_absolute_and_fixed_descendants: &'a T
The containing block for fixed and absolute descendants.
“For elements whose layout is governed by the CSS box model, any value
other than none for the transform property also causes the element to
establish a containing block for all descendants. Its padding box will be
used to layout for all of its absolute-position descendants,
fixed-position descendants, and descendant fixed background attachments.”
https://w3c.github.io/csswg-drafts/css-transforms-1/#containing-block-for-all-descendants
See ComputedValues::establishes_containing_block_for_all_descendants
for a list of conditions where an element forms a containing block for
all descendants.
Implementations§
source§impl<'a, T> ContainingBlockManager<'a, T>
impl<'a, T> ContainingBlockManager<'a, T>
pub(crate) fn get_containing_block_for_fragment( &self, fragment: &Fragment, ) -> &T
pub(crate) fn new_for_non_absolute_descendants( &self, for_non_absolute_descendants: &'a T, ) -> Self
pub(crate) fn new_for_absolute_descendants( &self, for_non_absolute_descendants: &'a T, for_absolute_descendants: &'a T, ) -> Self
pub(crate) fn new_for_absolute_and_fixed_descendants( &self, for_non_absolute_descendants: &'a T, for_absolute_and_fixed_descendants: &'a T, ) -> Self
Auto Trait Implementations§
impl<'a, T> Freeze for ContainingBlockManager<'a, T>
impl<'a, T> RefUnwindSafe for ContainingBlockManager<'a, T>where
T: RefUnwindSafe,
impl<'a, T> Send for ContainingBlockManager<'a, T>where
T: Sync,
impl<'a, T> Sync for ContainingBlockManager<'a, T>where
T: Sync,
impl<'a, T> Unpin for ContainingBlockManager<'a, T>
impl<'a, T> UnwindSafe for ContainingBlockManager<'a, T>where
T: RefUnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more