parent
4118fd4be3
commit
8f7eb3e67f
@ -0,0 +1,7 @@
|
||||
.block-item {
|
||||
position: absolute;
|
||||
z-index: 0;
|
||||
overflow: hidden;
|
||||
border-radius: 8px;
|
||||
border: 1px solid rgb(235 236 240);
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
import { IRowElement } from '../../../../interface/Row'
|
||||
import { Draw } from '../../Draw'
|
||||
import { BaseBlock } from './modules/BaseBlock'
|
||||
|
||||
export class BlockParticle {
|
||||
|
||||
private draw: Draw
|
||||
private container: HTMLDivElement
|
||||
private blockContainer: HTMLDivElement
|
||||
private blockMap: Map<string, BaseBlock>
|
||||
|
||||
constructor(draw: Draw) {
|
||||
this.draw = draw
|
||||
this.container = draw.getContainer()
|
||||
this.blockMap = new Map()
|
||||
this.blockContainer = this._createBlockContainer()
|
||||
this.container.append(this.blockContainer)
|
||||
}
|
||||
|
||||
private _createBlockContainer(): HTMLDivElement {
|
||||
const blockContainer = document.createElement('div')
|
||||
blockContainer.classList.add('block-container')
|
||||
return blockContainer
|
||||
}
|
||||
|
||||
public getDraw(): Draw {
|
||||
return this.draw
|
||||
}
|
||||
|
||||
public getBlockContainer(): HTMLDivElement {
|
||||
return this.blockContainer
|
||||
}
|
||||
|
||||
public render(pageNo: number, element: IRowElement, x: number, y: number) {
|
||||
const id = element.id!
|
||||
const cacheBlock = this.blockMap.get(id)
|
||||
if (cacheBlock) {
|
||||
cacheBlock.setClientRects(pageNo, x, y)
|
||||
} else {
|
||||
const newBlock = new BaseBlock(this, element)
|
||||
newBlock.render()
|
||||
newBlock.setClientRects(pageNo, x, y)
|
||||
this.blockMap.set(id, newBlock)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,51 @@
|
||||
import { BlockType } from '../../../../../dataset/enum/Block'
|
||||
import { IRowElement } from '../../../../../interface/Row'
|
||||
import { Draw } from '../../../Draw'
|
||||
import { BlockParticle } from '../BlockParticle'
|
||||
import { IFrameBlock } from './IFrameBlock'
|
||||
|
||||
export class BaseBlock {
|
||||
|
||||
private draw: Draw
|
||||
private element: IRowElement
|
||||
private block: IFrameBlock | null
|
||||
private blockContainer: HTMLDivElement
|
||||
private blockItem: HTMLDivElement
|
||||
|
||||
constructor(blockParticle: BlockParticle, element: IRowElement) {
|
||||
this.draw = blockParticle.getDraw()
|
||||
this.blockContainer = blockParticle.getBlockContainer()
|
||||
this.element = element
|
||||
this.block = null
|
||||
this.blockItem = this._createBlockItem()
|
||||
this.blockContainer.append(this.blockItem)
|
||||
}
|
||||
|
||||
private _createBlockItem(): HTMLDivElement {
|
||||
const blockItem = document.createElement('div')
|
||||
blockItem.classList.add('block-item')
|
||||
return blockItem
|
||||
}
|
||||
|
||||
public render() {
|
||||
const block = this.element.block!
|
||||
if (block.type === BlockType.IFRAME) {
|
||||
this.block = new IFrameBlock(this.element)
|
||||
this.block.render(this.blockItem)
|
||||
}
|
||||
}
|
||||
|
||||
public setClientRects(pageNo: number, x: number, y: number) {
|
||||
const scale = this.draw.getOptions().scale
|
||||
const height = this.draw.getHeight()
|
||||
const pageGap = this.draw.getPageGap()
|
||||
const preY = pageNo * (height + pageGap)
|
||||
// 尺寸
|
||||
this.blockItem.style.width = `${this.element.width! * scale}px`
|
||||
this.blockItem.style.height = `${this.element.height! * scale}px`
|
||||
// 位置
|
||||
this.blockItem.style.left = `${x}px`
|
||||
this.blockItem.style.top = `${preY + y}px`
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
import { IRowElement } from '../../../../../interface/Row'
|
||||
|
||||
export class IFrameBlock {
|
||||
|
||||
private static readonly sandbox = [
|
||||
'allow-forms',
|
||||
'allow-scripts',
|
||||
'allow-same-origin',
|
||||
'allow-popups'
|
||||
]
|
||||
private element: IRowElement
|
||||
|
||||
constructor(element: IRowElement) {
|
||||
this.element = element
|
||||
}
|
||||
|
||||
public render(blockItemContainer: HTMLDivElement) {
|
||||
const block = this.element.block!
|
||||
const iframe = document.createElement('iframe')
|
||||
iframe.sandbox.add(...IFrameBlock.sandbox)
|
||||
iframe.style.border = 'none'
|
||||
iframe.style.width = '100%'
|
||||
iframe.style.height = '100%'
|
||||
iframe.src = block.iframeBlock?.src || ''
|
||||
blockItemContainer.append(iframe)
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,3 @@
|
||||
export enum BlockType {
|
||||
IFRAME = 'iframe'
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
import { BlockType } from '../dataset/enum/Block'
|
||||
|
||||
export interface IIFrameBlock {
|
||||
src: string;
|
||||
}
|
||||
|
||||
export interface IBlock {
|
||||
type: BlockType;
|
||||
iframeBlock?: IIFrameBlock;
|
||||
}
|
||||
Loading…
Reference in new issue