九宮格ドラッグ

6693 ワード

効果の例


Gridレイアウト(グリッドレイアウト)の簡単な理解


メッシュレイアウトとは


CSSメッシュレイアウト(メッシュとも呼ばれる)は、2 Dメッシュレイアウトシステムです.CSSはウェブページのレイアウトを処理する上でずっとよくしていません.最初はtable(テーブル)レイアウトを使用し、float(フローティング)、position(位置決め)、inline-block(行内ブロック)レイアウトを使用しましたが、これらの方法は本質的にhackであり、垂直中心などの多くの機能を失いました.その後flexbox(ボックスレイアウト)が出て、多くのレイアウト問題を解決しましたが、複雑な2次元レイアウトではなく、1次元レイアウトにすぎず、実際にはそれら(flexboxとgrid)がうまく組み合わせて使用できます.Gridレイアウトはレイアウトの問題を解決するために作成された最初のCSSモジュールである.

メッシュレイアウトのプロパティについて簡単に説明します

  • display:
  • grid:ブロックレベルメッシュ
  • を生成する.
  • inline-grid:行内グリッド
  • を生成する
  • subgrid:メッシュコンテナ自体がメッシュアイテム(ネストメッシュコンテナ)の場合、このプロパティは親メッシュコンテナの列、行のサイズを継承するために使用されます.

  • grid-template-columns
  • メッシュ列サイズ
  • を設定する.
  • grid-template-rows
  • メッシュ行サイズ
  • を設定する.
  • grid-template-areas
  • メッシュ領域
  • を設定する.
  • grid-column-gap
  • メッシュ列間隔
  • を設定する.
  • grid-row-gap
  • メッシュ行間隔
  • を設定する.
  • grid-gap
  • 略grid-gap:
  • justify-items
  • 水平方向の整列方式(ここでは単に説明する)
  • start:左揃え
  • end:右揃え
  • center:中央揃え
  • stretch:埋め込み(デフォルト)
  • align-items
  • 垂直方向整列方式
  • start:上部揃え
  • end:下揃え
  • center:中央揃え
  • stretch:埋め込み(デフォルト)

  • もちろん、読めなくても大丈夫ですが、ここには個人的に大好きなグリッドレイアウトの文章があります.詳しく紹介されています.グリッドレイアウトの内容を深く学ぶことができます.
    トランスポートゲート:GridレイアウトガイドGridレイアウトガイド

    Vueは九宮格ドラッグを実現


    Demoアドレス:Demoおよび完全コード

    九宮格のレイアウトを実現

    /*css*/
    
      .container{
        position: relative;   /*    ,          */
        display: grid;        /*      */
        width: 300px;
        height: 300px;
        grid-template-columns: 100px 100px 100px;     /*     ,    */
        grid-template-rows: 100px 100px 100px;
        grid-template-areas: "head1 head2 head3"      /*        ,    */
                              "main1 main2 main3"
                              "footer1 footer2 footer3";
        border: 1px solid #000;
        margin: 0 auto;
      }
      .block{
        position: absolute;     /*   container  */
        width: 100px;
        height: 100px;
        display: flex;        /*flex  ,       */
        justify-content: center;
        justify-items: center;
        align-items: center;
        align-content: center;
        user-select: none;      /*        */
        background: olivedrab;
        border: 1px solid #000
      }
    
    
    //app.vue
    
    
    {{positionX}} {{positionY}}

    ドラッグ&ドロップを実現するJSコード部分


    ここでは、いくつかのコアコードを選択して説明します.コードは省略されています.コードは少し長いので、紙面を占めすぎて意味がありません.すべてのコードを閲覧する必要がある場合は、上のDemo接続をクリックすることができます.
    
    //  animate.css     css  ,    animate.css         
    import animate from 'animate.css';
    
    export default {
      name: 'app',
      data () {
        return {
          positionX:0,      //         
          positionY:0,
        }
      },
      methods:{
        move(e){
          let oDiv = e.target;      //         
          let gDiv = e.path[1];     //           
    
          /*          ,        
          **           ,                    ,            
          **                      ,       top:0 left:0
          */
    
          //                           ,   0
          let disX = e.clientX - 0;     
          let disY = e.clientY - 0;
          document.onmousemove = (e)=>{
    
            //    ,           top left 
            let left = e.clientX - disX;
            let top = e.clientY - disY;
            switch (oDiv.style.gridArea){
              case "head1 / head1 / head1 / head1":this.rangeOfHead1(left,top,oDiv);break;    //  head1     
              case "head2 / head2 / head2 / head2":this.rangeOfHead2(left,top,oDiv);break;    //  head2     
              case "head3 / head3 / head3 / head3":this.rangeOfHead3(left,top,oDiv);break;    //  head3     
              case "main1 / main1 / main1 / main1":this.rangeOfMain1(left,top,oDiv);break;    //  main1     
              ...
            }
          };
          document.onmouseup = (e)=>{
            //      ,      
            //                       
            if(e.clientY-gDiv.offsetTop<100&&e.clientX-gDiv.offsetLeft<100){
    
              //          
              this.changeBlock("head1",oDiv); 
    
            }else if(e.clientY-gDiv.offsetTop>100&&e.clientX-gDiv.offsetLeft<100&&e.clientY-gDiv.offsetTop<200){
              this.changeBlock("main1",oDiv);
            }else if(e.clientY-gDiv.offsetTop>200&&e.clientX-gDiv.offsetLeft<100){
              this.changeBlock("footer1",oDiv);
            }else if(e.clientY-gDiv.offsetTop<100&&e.clientX-gDiv.offsetLeft>100&&e.clientX-gDiv.offsetLeft<200){
              this.changeBlock("head2",oDiv);
            }else if(e.clientY-gDiv.offsetTop<100&&e.clientX-gDiv.offsetLeft>200){
              this.changeBlock("head3",oDiv);
            }else if(e.clientY-gDiv.offsetTop>100&&e.clientX-gDiv.offsetLeft>200&&e.clientY-gDiv.offsetTop<200){
              this.changeBlock("main3",oDiv);
            }else if(e.clientY-gDiv.offsetTop>200&&e.clientX-gDiv.offsetLeft>200){
              this.changeBlock("footer3",oDiv);
            }else if(e.clientY-gDiv.offsetTop>200&&e.clientX-gDiv.offsetLeft>100&&e.clientX-gDiv.offsetLeft<200){
              this.changeBlock("footer2",oDiv);
            }else {
              this.changeBlock("main2",oDiv);
            }
            document.onmousemove=null;      //         
            document.onmousedown = null;    //         
    
            //  ,         hhh
            oDiv.className = "block animated wobble";
            let removeClass = setTimeout(()=>{
              oDiv.className = "block animated";
            },500);
    
          };
        },
        rangeOfHead1(x,y,oDiv){     //  head1          
          if(x>=200){
            x=200;
          }else if(x<=0){
            x=0;
          }
          if(y>=200){
            y=200;
          }else if(y<=0){
            y=0;
          }
          oDiv.style.left = x + 'px';
          oDiv.style.top = y + 'px';
          this.positionX = x;
          this.positionY = y;
    
        },
        rangeOfHead2(x,y,oDiv){     //  head2          
          if(x>=100){
            x=100;
          }else if(x<=-100){
            x=-100;
          }
          if(y>=200){
            y=200;
          }else if(y<=0){
            y=0;
          }
          oDiv.style.left = x + 'px';
          oDiv.style.top = y + 'px';
    
          this.positionX = x;
          this.positionY = y;
    
        },
        ...
        changeBlock(blockName,oDiv){    //            
          this.positionX = 0;
          this.positionY = 0;
          oDiv.style.gridArea=blockName;
        }
      },
    }