I do hate this, scrollbars and borders around my webpage.
As I have a webpage that is adding every post at the bottom, the height is dynamic, i.e. is not every time an x amount of pixels.
<!DOCTYPE html> <html> <body> <h1>Timdows iframe example</h1> <iframe src="https://timdows.com"> </iframe> </body> </html>
In order to remove some things, I turned myself into google. There are doznes of solutions, some work, some do not.
I want a clean vanilla javascript implementation (that I also understand and can maintain).
Lets setup the wordpress website that will host our iframe. In this case I use the plugin Elementor.
Hmm, lets see. I start with a height of 3500, that is way more than needed. Upon a message received, some javascript code is executed.
This code checks if there is a property called ‘frameHeight’ and gets the value of it, that is then (added with a nice 50px) set to the iframe element.
What happens is that the 3500pixel iframe is slunk to the correct height.
<iframe id="iframe" src="https://timdows.com" title="Test iframe" height="3500px"></iframe> <script> window.onmessage = (e) => { if (e.data.hasOwnProperty("frameHeight")) { document.getElementById("iframe").style.height = `${e.data.frameHeight + 50}px`; } }; </script>
This frameHeight is get from some angular methods. Lets dive into them.
– onInit, get the data from the service, and when it is received, use a 0 timeout in order to have the data bound to the DOM, then call sendPostMessage
– afterViewInit, make a listener if the window is resized, and then also call sendPostMessage
– sendPostMessage, it looks for the iframe-container (this is the most outer container of my page) and gets the container height. It uses postMessage to send data. In the body it sets the frameHeight property
<script> constructor( private pagesService: any, private el: ElementRef, private renderer: Renderer2) { } ngOnInit(): void { this.pagesService.getAllPages() .subscribe(data => { this.pageData = data; setTimeout(() => { this.sendPostMessage(); }, 0); }); } ngAfterViewInit(): void { this.renderer.listen('window', 'resize', () => this.sendPostMessage()); } private sendPostMessage(): void { const container = this.el.nativeElement.querySelector('#iframe-container'); if (this.height !== container.offsetHeight) { this.height = container.offsetHeight; window.parent.postMessage({ frameHeight: this.height }, '*'); console.log("The iframe-container frame height is:", this.height); } } </script>
After all of this, my page has no scrollbars anymore, and regardsless of the amount of content presented, it always sizes to the correct height.