You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							140 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
	
	
							140 lines
						
					
					
						
							3.2 KiB
						
					
					
				<html>
 | 
						|
<head>
 | 
						|
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
 | 
						|
  <title>Document</title>
 | 
						|
  <script src="konva.min.js"></script>
 | 
						|
</head>
 | 
						|
<body>
 | 
						|
<div id="map"></div>
 | 
						|
<script>
 | 
						|
  //todo 滚动条
 | 
						|
  //todo 可见范围渲染
 | 
						|
  //
 | 
						|
  window.onload=function (){
 | 
						|
    const width=window.innerWidth*0.996;
 | 
						|
    const height=window.innerHeight*.983
 | 
						|
    const stage = new Konva.Stage({
 | 
						|
      container: 'map',   // id of container <div> *包裹舞台的DIV元素的ID
 | 
						|
      width: width,
 | 
						|
      height: height
 | 
						|
    });
 | 
						|
 | 
						|
    const layer = new Konva.Layer();
 | 
						|
 | 
						|
    console.time()
 | 
						|
    const cellWidth=94;
 | 
						|
    const mountGroup=new Konva.Group({
 | 
						|
      x:0,
 | 
						|
      y:0,
 | 
						|
      clip:{
 | 
						|
        x:0,
 | 
						|
        y:0,
 | 
						|
        width:width,
 | 
						|
        height:height
 | 
						|
      }
 | 
						|
    })
 | 
						|
    const totalRow=100
 | 
						|
    for (let row=0;row<totalRow;row++){
 | 
						|
      //不在可视范围内隐藏显示
 | 
						|
      const group = new Konva.Group({
 | 
						|
        // visible:row>height/25?false:true,
 | 
						|
      });
 | 
						|
      group.setAttr('customData',{
 | 
						|
        czbh:'c16-'+row
 | 
						|
      })
 | 
						|
      for (let col=0;col<20;col++){
 | 
						|
        const cell=new Konva.Rect({
 | 
						|
          x:col*cellWidth,
 | 
						|
          y:row*25,
 | 
						|
          width:cellWidth,
 | 
						|
          height:25,
 | 
						|
          stroke:'black',
 | 
						|
          strokeWidth:1,
 | 
						|
        })
 | 
						|
        const text=new Konva.Text({
 | 
						|
          x:col*cellWidth,
 | 
						|
          y:row*25,
 | 
						|
          width:cellWidth,
 | 
						|
          height:25,
 | 
						|
          lineHeight:2.5,
 | 
						|
          stroke:'black',
 | 
						|
          strokeWidth:0.1,
 | 
						|
          text:col*row,
 | 
						|
          align:'center',
 | 
						|
        })
 | 
						|
        group.add(cell)
 | 
						|
        group.add(text)
 | 
						|
      }
 | 
						|
      group.on('click', function(evt) {
 | 
						|
        console.log(evt.target)
 | 
						|
        console.log('room obj', evt.target.parent.getAttr("customData"));
 | 
						|
      });
 | 
						|
      mountGroup.add(group)
 | 
						|
    }
 | 
						|
    console.log(mountGroup)
 | 
						|
    console.timeEnd();
 | 
						|
    // const clip=mountGroup.clip({
 | 
						|
    //   x:0,
 | 
						|
    //   y:height,
 | 
						|
    //   width:width,
 | 
						|
    //   height:height
 | 
						|
    // })
 | 
						|
    mountGroup.setAttr('height',totalRow*25)
 | 
						|
    layer.add(mountGroup);
 | 
						|
 | 
						|
    // //添加滚动条
 | 
						|
    // if (totalRow*25>height){
 | 
						|
    //   const group = new Konva.Group({
 | 
						|
    //     x:width-12,
 | 
						|
    //     y:0,
 | 
						|
    //     stroke:'gray',
 | 
						|
    //     strokeWidth:0.2,
 | 
						|
    //   });
 | 
						|
    //   const scroll=new Konva.Rect({
 | 
						|
    //     width:10,
 | 
						|
    //     height:height/(totalRow*25)*10,
 | 
						|
    //     fill:'gray'
 | 
						|
    //   })
 | 
						|
    //   group.add(scroll)
 | 
						|
    //   layer.add(group)
 | 
						|
    // }
 | 
						|
    //
 | 
						|
    layer.on('wheel',(evt)=>{
 | 
						|
      const ey=-evt.evt.deltaY
 | 
						|
      const my=ey>0?10:-10
 | 
						|
      for (let i=0;i<Math.abs(100);i+=10){
 | 
						|
        const {x,y}=mountGroup.getAbsolutePosition()
 | 
						|
        if (y>=0&&ey>0){
 | 
						|
          break
 | 
						|
        }
 | 
						|
        mountGroup.move({
 | 
						|
          y:my
 | 
						|
        })
 | 
						|
      }
 | 
						|
 | 
						|
    })
 | 
						|
    // // create our shape *创建我们的形状
 | 
						|
    // const circle = new Konva.Circle({
 | 
						|
    //   x: stage.getWidth() / 2,
 | 
						|
    //   y: stage.getHeight() / 2,
 | 
						|
    //   radius: 70,
 | 
						|
    //   fill: 'red',
 | 
						|
    //   stroke: 'black',
 | 
						|
    //   strokeWidth: 4
 | 
						|
    // });
 | 
						|
    //
 | 
						|
    // // add the shape to the layer *将形状添加到图层上
 | 
						|
    // layer.add(circle);
 | 
						|
 | 
						|
    // add the layer to the stage *将图层添加到舞台上
 | 
						|
    stage.add(layer);
 | 
						|
 | 
						|
    setTimeout(()=>{
 | 
						|
      // layer.remove()
 | 
						|
    },2000)
 | 
						|
 | 
						|
  }
 | 
						|
</script>
 | 
						|
</body>
 | 
						|
</html>
 |