Tôi nghĩ một yêu cầu "trong dòng" khác là overflow
được đặt thành visible
.
From the CSS2 spec:
Floats, yếu tố hoàn toàn vị trí, container khối (như inline-block, bảng tế bào, và bảng chú thích) mà không chặn hộp, và hộp khối với 'tràn' khác hơn 'có thể nhìn thấy' (trừ khi giá trị đó được truyền đến khung nhìn) thiết lập các bối cảnh định dạng khối mới cho nội dung của chúng.
Dựa trên các yêu cầu bạn trích dẫn và yêu cầu overflow
, đây là một cách để làm điều đó với 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;
}
Xem này jsFiddle cho các trường hợp kiểm tra.
Tôi không chắc chắn sẽ tốt hơn nếu sử dụng window.getComputedStyle()
hay không.
Chức năng đang kiểm tra xem elm
có ở trong ngữ cảnh định dạng luồng hoặc chặn của ctxRoot
(như trước đây được gọi là, tôi nghĩ). Nếu ctxRoot
không được cung cấp, nó sẽ kiểm tra phần tử body
. Điều này không kiểm tra để đảm bảo rằng ctxRoot
đang hoạt động. Như vậy, với HTML này
<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>
Các trường hợp kiểm tra là:
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));
câu hỏi đầu tiên của tôi là, tại sao bạn cần phải biết điều này? Bạn có thể chỉ cần kiểm tra một trong những phẩm chất này trong ứng dụng thực tế của bạn. – Blazemonger
Nếu đây là định nghĩa chỉ được sử dụng trong đặc điểm kỹ thuật, bạn nên kiểm tra các điều kiện thực tế. – pimvdb
Tôi đang làm việc trên một dự án phụ cá nhân có liên quan đến việc sao chép và dán nội dung theo kiểu trong trình duyệt. Tôi muốn loại bỏ lề trên của phần tử đầu tiên trong luồng và lề dưới của phần tử cuối cùng trong luồng. – sbichenko