myślę kolejny „przepływu” wymogiem jest to, że overflow
jest ustawione na visible
.
From the CSS2 spec:
pływaków, elementy całkowicie umieszczone, pojemniki blokowe (np inline bloków, stół komórek i obrusy napisów), które nie blokują pola i pola bloku z „nadmiaru” innego niż "visible" (z wyjątkiem sytuacji, gdy ta wartość została przeniesiona do widoku), ustanawia nowe konteksty formatowania bloków dla ich zawartości.
Na podstawie wymagań ty cytowane i wymogu overflow
, jest to jeden ze sposobów, aby to zrobić z jQuery:
function isInFlow(elm, ctxRoot) {
ctxRoot = ctxRoot || document.body;
var $elm = $(elm),
ch = -1,
h;
if (!$elm.length) {
return false;
}
while ($elm[0] !== document.body) {
h = $elm.height();
if (h < ch || !okProps($elm)) {
return false;
}
ch = h;
$elm = $elm.parent();
if (!$elm.length) {
// not attached to the DOM
return false;
}
if ($elm[0] === ctxRoot) {
// encountered the ctxRoot and has been
// inflow the whole time
return true;
}
}
// should only get here if elm
// is not a child of ctxRoot
return false;
}
function okProps($elm) {
if ($elm.css('float') !== 'none'){
return false;
}
if ($elm.css('overflow') !== 'visible'){
return false;
}
switch ($elm.css('position')) {
case 'static':
case 'relative':
break;
default:
return false;
}
switch ($elm.css('display')) {
case 'block':
case 'list-item':
case 'table':
return true;
}
return false;
}
Zobacz ten jsFiddle dla przypadków testowych.
Nie jestem pewien, czy lepiej byłoby użyć window.getComputedStyle()
, czy też nie.
Funkcja sprawdza, czy elm
jest w kontekście formatowania przepływu lub blokowania ctxRoot
(jak było wcześniej nazywane, myślę). Jeśli ctxRoot
nie zostanie dostarczony, sprawdzi to przed elementem body
. Nie sprawdza to, aby upewnić się, że ctxRoot
jest w ruchu. Tak, z tym HTML
<div id="b" style="overflow: hidden;">
<div id="ba">ba
<p id="baa">baa</p>
<span id="bab">bab</span>
<span id="bac" style="display:block;">bac</span>
</div>
</div>
Przypadki testowe są:
var b = $('#b')[0];
console.log('no ',isInFlow(b));
console.log('no ',isInFlow('#ba'));
console.log('yes ',isInFlow('#ba', b));
console.log('no ',isInFlow('#baa'));
console.log('yes ',isInFlow('#baa', b));
console.log('no ',isInFlow('#bab'));
console.log('no ',isInFlow('#bab', b));
console.log('no ',isInFlow('#bac'));
console.log('yes ',isInFlow('#bac', b));
Moje pierwsze pytanie brzmi, dlaczego musisz to wiedzieć? Prawdopodobnie wystarczy przetestować jedną z tych cech w swojej aktualnej aplikacji. – Blazemonger
Jeśli jest to definicja używana tylko w specyfikacji, najlepiej sprawdzić rzeczywiste warunki. – pimvdb
Pracuję nad osobistym projektem strony, który polega na kopiowaniu i wklejaniu stylizowanej treści w przeglądarce. Chcę usunąć górny margines pierwszego elementu w przepływie i dolny margines ostatniego elementu w przepływie. – sbichenko