Angular (original) (raw)

This guide explains how to create an Angular Directive for iframe-resizer using the Framework API.

Install Framework API

Install the core iframe-resizer Framework API with the following command.


npm install @iframe-resizer/core --save

Create Angular Directive

Create the following directive, which exposes the full iframe-resizer feature set.


import {

  Directive,

  EventEmitter,

  Input,

  Output,

  ElementRef,

} from "@angular/core"

// @ts-expect-error types declared below

import connectResizer from "@iframe-resizer/core"

export type iframeResizerObject = {

  moveToAnchor: (anchor: string) => void

  resize: () => void

  sendMessage: (message: string, targetOrigin?: string) => void

}

type iframeResizerObjectPrivateMethods = {

  disconnect: () => void

}

type iframeResizerObjectPrivate = iframeResizerObject &

  iframeResizerObjectPrivateMethods

export interface iframeResizerElement extends HTMLIFrameElement {

  iFrameResizer: iframeResizerObject

}

export type iframeResizerOptions = {

  bodyBackground?: string | null

  bodyMargin?: string | number | null

  bodyPadding?: string | number | null

  checkOrigin?: boolean | string[]

  direction?: "vertical" | "horizontal" | "none"

  inPageLinks?: boolean

  license: string

  log?: boolean | "collapsed" | "expanded"

  offsetSize?: number

  scrolling?: boolean | "omit"

  tolerance?: number

  warningTimeout?: number

  onClose?(iframeId: string): void

  onClosed?(iframeId: string): void

}

@Directive({

  selector: "[iframe-resizer]",

  standalone: true,

})

export class IframeResizerDirective {

  private resizer?: iframeResizerObjectPrivate

  @Output() onReady = new EventEmitter<iframeResizerElement>()

  @Output() onClose = new EventEmitter<iframeResizerElement>()

  @Output() onMessage = new EventEmitter<{

    iframe: iframeResizerElement

    message: string

  }>()

  @Output() onMouseEnter = new EventEmitter<{

    iframe: iframeResizerElement

    height: number

    width: number

    type: string

  }>()

  @Output() onMouseLeave = new EventEmitter<{

    iframe: iframeResizerElement

    height: number

    width: number

    type: string

  }>()

  @Output() onResized = new EventEmitter<{

    iframe: iframeResizerElement

    height: number

    width: number

    type: string

  }>()

  @Output() onScroll = new EventEmitter<{

    iframe: iframeResizerElement

    top: number

    left: number

  }>()

  get iframeResizer(): iframeResizerObject | undefined {

    return this.resizer

  }

  @Input() options: iframeResizerOptions = {

    license: "",

  }

  constructor(private elementRef: ElementRef) {}

  ngOnInit() {}

  ngAfterViewInit(): void {

    this.resizer = connectResizer({

      ...this.options,

      waitForLoad: true,

      onClose: (iframeID: any) => {

        console.warn(

          `[iframe-resizer/angular][${this.elementRef.nativeElement?.id}] Close event ignored, to remove the iframe update your Angular component.`

        )

        return false

      },

      onMessage: (event: { iframe: iframeResizerElement message: string }) =>

        this.onMessage.next(event),

      onMouseEnter: (event: {

        iframe: iframeResizerElement

        height: number

        width: number

        type: string

      }) => this.onMouseEnter.next(event),

      onMouseLeave: (event: {

        iframe: iframeResizerElement

        height: number

        width: number

        type: string

      }) => this.onMouseLeave.next(event),

      onReady: (iframe: iframeResizerElement) => this.onReady.next(iframe),

      onResized: (event: {

        iframe: iframeResizerElement

        height: number

        width: number

        type: string

      }) => this.onResized.next(event),

      onScroll: (event: {

        iframe: iframeResizerElement

        top: number

        left: number

      }) => this.onScroll.next(event),

    })(this.elementRef.nativeElement)

  }

  ngOnDestroy() {

    this.resizer?.disconnect()

  }

  // parent methods

  public resize() {

    this.resizer?.resize()

  }

  public moveToAnchor(anchor: string) {

    this.resizer?.moveToAnchor(anchor)

  }

  public sendMessage(message: string, targetOrigin?: string) {

    this.resizer?.sendMessage(message, targetOrigin)

  }

}

Setup on Parent Page

You can then include it on your parent page as follows, using the options andevents as detailed in the Parent Page API.


 <iframe

  id="myIframe"

  iframe-resizer

  [src]="src"

  [options]="{ license: 'xxxx' }"

  (onReady)="onReady($event)"

  (onMessage)="onMessage($event)"

  (onMouseEnter)="onMouseEnter($event)"

  (onMouseLeave)="onMouseLeave($event)"

  (onResized)="onResized($event)"

  (onScroll)="onScroll($event)"

  ></iframe>

<style>

iframe {

  width: 100%;

  height: 100vh;

}

</style>

Setting the initial height of the iframe to 100vh makes the loading in of the iframe appear smoother to the user, as they will only see the content below the iframe once it has completed loading and undergone it’s initial sizing.

Child page

You will then need to install the @iframe-resizer/childpackage on every page in the iframe.

Once everything is setup, keep an eye on the browser console, as iframe-resizer will warn about any potential issues it detects and provide advice on how to fix them. For more details on using iframe-resizer see theAdvanced Setup and Trouble Shooting sections of this guide.