<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      基于elementPlus的ElRow仿寫ElSpace組件

      先來代碼

      <script lang="ts">
        import { Fragment, Comment, defineComponent, h, isVNode, renderSlot, PropType } from 'vue';
        import { ElRow, ElCol } from 'element-plus';
      
        export default defineComponent({
          name: 'LayoutForm',
          props: {
            form: {
              type: Boolean,
              default: () => false,
            },
            table: {
              type: Boolean,
              default: () => false,
            },
            autoWidth: {
              type: Boolean,
              default: () => false,
            },
            grid: {
              type: [Number, String],
              default: () => '',
            },
            gutters: {
              type: [Number, String, Array] as PropType<number | string | (number | string)[]>,
              default: () => '',
            },
            rowClass: {
              type: String,
              default: () => '',
            },
          },
          setup(props, { slots }) {
            return () => {
              const extractChildren = (children: any, extractedChildren: any = []) => {
                children.forEach((child: any) => {
                  if (child.type === Fragment) {
                    if (Array.isArray(child.children)) {
                      extractChildren(child.children, extractedChildren);
                    }
                  } else {
                    if (!isVNode(child)) return;
                    if (child.type === Comment) return;
                    if (child.type === Fragment) return;
                    const {
                      span,
                      offset,
                      push,
                      pull,
                      xs,
                      sm,
                      md,
                      lg,
                      xl,
                      tag,
                      colBind = {},
                      colMinWidth = '',
                      'col-min-width': _colMinWidth = '',
                      colClass = '',
                      colStyle = '',
                      'col-class': _colClass = '',
                      'col-style': _colStyle = '',
                      ...childProps
                    } = child.props || {};
                    let minWidthStyle = '';
                    if (colMinWidth || _colMinWidth) {
                      let [colminwidth, minProportion] = (colMinWidth || _colMinWidth).toString().split(',');
                      minWidthStyle = `flex:${colminwidth};`;
                      if (parseFloat(colminwidth).toString() === colminwidth) {
                        colminwidth += 'px';
                      }
                      minProportion = minProportion || colminwidth;
                      minWidthStyle += `min-width:min(max(${colminwidth},${minProportion}),99%);`;
                    }
                    extractedChildren.push(
                      h(
                        ElCol,
                        {
                          span,
                          offset,
                          push,
                          pull,
                          xs,
                          sm,
                          md,
                          lg,
                          xl,
                          tag,
                          key: child.props?.key || child.props?.prop,
                          ...colBind,
                          class: colClass || _colClass || colBind.class,
                          style: `${minWidthStyle};${colStyle || _colStyle || colBind.style}`,
                        },
                        { default: () => ({ ...child, props: childProps }) }
                      )
                    );
                  }
                });
                return extractedChildren;
              };
              const children = renderSlot(slots, 'default', { key: 0 }, () => []);
              if (Array.isArray(children.children)) {
                const extractedChildren = extractChildren(children.children);
                return h(
                  'div',
                  {
                    class: `el_row_gutter
                            ${props.form ? 'form' : ''}
                            ${props.table ? 'table' : ''}
                            ${props.autoWidth ? 'autoWidth' : ''}
                            ${props.grid ? 'grid' : ''}
                            ${props.gutters ? 'gutters' : ''}`,
                  },
                  h(
                    ElRow,
                    {
                      class: `w_100 ${props.rowClass}`,
                    },
                    { default: () => extractedChildren }
                  )
                );
              }
              return children.children;
            };
          },
          computed: {
            gridMinWidth() {
              let minWidth: any = this.grid;
              if (parseFloat(minWidth).toString() === minWidth.toString()) {
                minWidth = `${minWidth}px`;
              }
              return minWidth;
            },
            getters_x() {
              let gutter: any = this.gutters;
              if (typeof gutter === 'string') {
                gutter = gutter.split(',').map((v) => v.trim());
              }
              if (Array.isArray(gutter)) {
                gutter = gutter[1] === undefined ? gutter[0] : gutter[1];
              }
              if (!gutter && gutter !== 0) {
                gutter = 'calc(var(--const-interval) / 2)';
              }
              if (parseFloat(gutter).toString() === gutter.toString()) {
                gutter = `${gutter}px`;
              }
              return gutter;
            },
            getters_y() {
              let gutter: any = this.gutters;
              if (typeof gutter === 'string') {
                gutter = gutter.split(',').map((v) => v.trim());
              }
              if (Array.isArray(gutter)) {
                gutter = gutter[0];
              }
              if (!gutter && gutter !== 0) {
                gutter = 'calc(var(--const-interval) / 2)';
              }
              if (parseFloat(gutter).toString() === gutter.toString()) {
                gutter = `${gutter}px`;
              }
              return gutter;
            },
          },
        });
      </script>
      
      <style scoped>
        /* 基礎屬性樣式 */
        .el_row_gutter {
          margin-left: calc(-1 * var(--el_row_gutter_x));
          margin-right: calc(-1 * var(--el_row_gutter_x));
          margin-top: calc(-1 * var(--el_row_gutter_y));
          margin-bottom: calc(-1 * var(--el_row_gutter_y));
        }
        .el_row_gutter > .el-row > .el-col {
          padding-left: var(--el_row_gutter_x);
          padding-right: var(--el_row_gutter_x);
          padding-top: var(--el_row_gutter_y);
          padding-bottom: var(--el_row_gutter_y);
        }
        .el_row_gutter > .el-row > .el-col > :deep(.el-form-item) {
          margin-bottom: unset;
        }
      
        .el_row_gutter > .el-row > .el-col > :deep(.el-form-item > .el-form-item__label) {
          height: unset;
          line-height: unset;
          align-items: center;
        }
      
        .el_row_gutter > .el-row > .el-col > :deep(.el-form-item > .el-form-item__content) {
          line-height: unset;
          overflow-wrap: anywhere;
        }
      
        .el_row_gutter > .el-row > .el-col > :deep(.el-form-item > .el-form-item__content > *:not(.el_row_gutter)) {
          width: 100%;
        }
      
        /* form屬性樣式 */
        .el_row_gutter.form {
          --el_row_gutter_x: 10px;
          --el_row_gutter_y: 10px;
        }
      
        .el_row_gutter.form > .el-row > .el-col > :deep(.el-form-item > .el-form-item__label),
        .el_row_gutter.form > .el-row > .el-col > :deep(.el-form-item > .el-form-item__label-wrap > .el-form-item__label) {
          align-items: center;
          padding-right: 25px;
        }
      
        /* table屬性樣式 */
        .el_row_gutter.table {
          --el_row_gutter_x: 0;
          --el_row_gutter_y: 0;
          position: relative;
        }
      
        .el_row_gutter.table::before {
          content: '';
          border-right: 1px solid var(--el-border-color);
          position: absolute;
          height: 100%;
          right: -1px;
        }
      
        .el_row_gutter.table::after {
          content: '';
          border-bottom: 1px solid var(--el-border-color);
          position: absolute;
          width: 100%;
          bottom: -1px;
        }
      
        .el_row_gutter.table > .el-row > .el-col > :deep(.el-form-item) {
          border-top: 1px solid var(--el-border-color);
          border-left: 1px solid var(--el-border-color);
          position: relative;
          min-height: 40px;
          height: 100%;
        }
      
        /* .el_row_gutter.table > .el-row > .el-col > :deep(.el-form-item)::before {
          content: '';
          height: 100%;
          right: -1px;
          position: absolute;
          border-right: 1px solid var(--el-border-color);
        } */
      
        .el_row_gutter.table > .el-row > .el-col > :deep(.el-form-item)::after {
          content: '';
          width: 100%;
          bottom: -1px;
          position: absolute;
          border-bottom: 1px solid var(--el-border-color);
        }
      
        .el_row_gutter.table > .el-row > .el-col > :deep(.el-form-item > .el-form-item__label) {
          align-items: center;
          padding-right: unset;
          justify-content: center;
          background-color: #f2f3f5;
          position: relative;
        }
      
        .el_row_gutter.table > .el-row > .el-col > :deep(.el-form-item > .el-form-item__label)::after {
          content: '';
          height: 100%;
          right: 0;
          position: absolute;
          border-right: 1px solid var(--el-border-color);
        }
      
        .el_row_gutter.table > .el-row > .el-col > :deep(.el-form-item > .el-form-item__content) {
          padding: 5px 5px;
          border-left: none;
        }
      
        /* autoWidth屬性樣式 */
        .el_row_gutter.autoWidth {
          --el_row_gutter_x: 3px;
          --el_row_gutter_y: 3px;
        }
      
        .el_row_gutter.autoWidth > .el-row > .el-col.el-col-24 {
          flex: unset;
        }
      
        /* grid屬性樣式 */
        .el_row_gutter.grid > .el-row {
          display: grid;
          grid-template-columns: repeat(auto-fill, minmax(min(v-bind(gridMinWidth), 100%), 1fr));
        }
      
        /* gutters屬性樣式 */
        .el_row_gutter.gutters {
          --el_row_gutter_x: v-bind(getters_x);
          --el_row_gutter_y: v-bind(getters_y);
        }
      </style>
      

      初衷

      ElSpace組件簡單的包裹后添加margin屬性,在一些響應式布局中會在右側(cè)留有白邊影響整體

      解決思路

      使用css margin負數(shù)的特性讓中間盒子大出一圈供子盒子放置多出來的邊邊,使用ElRow包裹后內(nèi)容一方面要有一個中間盒子包裹,又要在每個子元素上包裹正好合適,還同時具備了柵格布局的功能

      場景1




      對比ElSpace該組件可以使內(nèi)容左右與父盒子都無間隙,布局更加自然(要加autoWidth屬性哦)

      場景2





      使用col-min-width屬性可以設置布局容器的最小寬度,在頁面縮小時先將外層進行擠壓,保證頁面寬度大于該值時頁面中的元素不會被過度壓縮,也可用于元素分組布局等場景

      場景3





      僅僅是寬度同值怎么能顯示出組件的厲害呢,col-min-width可傳遞兩個參數(shù),第一是在父盒子中的占比,第二個是最小寬度,第二個值為空則取第一個值(見場景2),實現(xiàn)右側(cè)盒子固定寬度,在頁面縮小至一定值后再混入所有盒子中

      場景4




      grid布局當然也得有啊,grid參數(shù)接收一個值用來設置子元素最小寬度,剩下的就交給grid去劃分每行最多放幾個,每個有多大,當然通過colStyle或colClass可隨意調(diào)整(見頁面跨兩列的選項)但是在頁面縮小至不足兩列時會有bug,希望大家?guī)兔μ崽峤ㄗh

      場景5




      既然有柵格布局了,模擬個表格也不過分吧,設置table屬性,將會把ElCol樣式調(diào)整為表格樣式,當然也支持嵌套循環(huán)等操作

      暫時也就開發(fā)出了這么多用法,相信隨著項目開發(fā)需求的變態(tài),組件的未來會有更多功能

      posted @ 2023-09-25 16:54  杜柯楓  閱讀(218)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产乱人伦AV在线麻豆A| 国产二区三区不卡免费| 精品人妻中文字幕av| 国内精品一区二区不卡| 日韩人妻无码精品久久| 91网站在线看| 亚洲欧美日韩国产四季一区二区三区| 亚洲一区二区av高清| 国产内射性高湖| 国产精品制服丝袜第一页| 建瓯市| 日韩精品成人一区二区三| 国产999久久高清免费观看| 国产欧美VA天堂在线观看视频| 日本不卡码一区二区三区| 日本中文字幕在线播放| 亚洲午夜香蕉久久精品| 日产一区日产2区| 亚洲无线码中文字幕在线| 人妻中文字幕亚洲精品| 欧美中文字幕无线码视频| 国产精品国产三级国产an| 久久波多野结衣av| 激情综合网激情五月激情| 亚洲国产天堂久久综合226114| 国产剧情91精品蜜臀一区| 国产中文三级全黄| 91精品国产午夜福利| 中文字幕一区有码视三区| 强d乱码中文字幕熟女1000部 | 激情内射亚洲一区二区三区| 美女黄网站人色视频免费国产| 国产精品视频白浆免费视频| 久久蜜臀av一区三区| 中文字幕精品亚洲二区| 极品无码国模国产在线观看| 中文字幕精品久久久久人妻红杏1| 激情在线网| 国产日产亚洲系列最新| 国产福利深夜在线播放| 亚洲日韩中文字幕在线播放|