Skip to content

Commit

Permalink
[fix] Fixed #276
Browse files Browse the repository at this point in the history
  • Loading branch information
Federico Zivolo committed Jul 23, 2017
1 parent 1762a67 commit ffd478a
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 2 deletions.
2 changes: 1 addition & 1 deletion packages/popper/package.json
Expand Up @@ -35,7 +35,7 @@
"build": "node bundle.js",
"lint": "eslint .",
"test": "popper-karma",
"test:dev": "NODE_ENV=development npm run test",
"test:dev": "BROWSERS=Chrome NODE_ENV=development npm run test",
"coverage": "NODE_ENV=coverage npm run test"
},
"devDependencies": {
Expand Down
10 changes: 10 additions & 0 deletions packages/popper/src/utils/getOffsetParent.js
@@ -1,3 +1,4 @@
import getStyleComputedProperty from './getStyleComputedProperty';
/**
* Returns the offset parent of the given element
* @method
Expand All @@ -14,5 +15,14 @@ export default function getOffsetParent(element) {
return window.document.documentElement;
}

// .offsetParent will return the closest TD or TABLE in case
// no offsetParent is present, I hate this job...
if (
['TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 &&
getStyleComputedProperty(offsetParent, 'position') === 'static'
) {
return getOffsetParent(offsetParent);
}

return offsetParent;
}
4 changes: 3 additions & 1 deletion packages/popper/src/utils/isOffsetContainer.js
@@ -1,9 +1,11 @@
import getOffsetParent from './getOffsetParent';

export default function isOffsetContainer(element) {
const { nodeName } = element;
if (nodeName === 'BODY') {
return false;
}
return (
nodeName === 'HTML' || element.firstElementChild.offsetParent === element
nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element
);
}
49 changes: 49 additions & 0 deletions packages/popper/tests/functional/core.js
Expand Up @@ -1498,4 +1498,53 @@ describe('[core]', () => {
},
});
});

// test for #276
it('correct position if offset parent has borders', done => {
jasmineWrapper.innerHTML = `
<style>
table {
margin-top: 50px;
}
#reference {
background: orange;
width: 50px;
height: 50px;
}
#popper {
background: green;
width: 50px;
height: 50px;
}
</style>
<table>
<tbody>
<tr>
<td>
<div id="reference">
ref
</div>
<div id="popper">
pop
</div>
</td>
</tr>
</tbody>
</table>
`;

const reference = document.getElementById('reference');
const popper = document.getElementById('popper');

new Popper(reference, popper, {
placement: 'bottom',
onCreate(data) {
expect(getRect(reference).bottom).toBeApprox(getRect(popper).top);
expect(getRect(reference).left).toBeApprox(getRect(popper).left);
data.instance.destroy();
done();
},
});
});

});

0 comments on commit ffd478a

Please sign in to comment.