欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue前端自適應(yīng)布局實現(xiàn)教程(一步到位所有自適應(yīng))

 更新時間:2024年08月13日 09:47:42   作者:lgx211  
?自適應(yīng)布局是一種根據(jù)不同的設(shè)備屏幕分辨率進行布局的方式,它為不同的屏幕分辨率定義了不同的布局,下面這篇文章主要給大家介紹了關(guān)于vue前端自適應(yīng)布局實現(xiàn)的相關(guān)資料,需要的朋友可以參考下

頁面展示

實現(xiàn)內(nèi)容

1,左右布局

  • 左側(cè)固定寬帶,右側(cè)自適應(yīng)剩余的寬度。
  • 中間一條分割線,可以拖拉,自適應(yīng)調(diào)整左右側(cè)的寬度。
  • 左側(cè)的高度超長自動出現(xiàn)橫向滾動條,左側(cè)寬度超長,自動出現(xiàn)豎向滾動條。

2,上中下布局

  • 最上面的 搜索條件 div 固定占用 100 px 高度,下面的 查詢條件 div 固定占用 30 px 高度,最下面的分頁固定占用高度,頁面剩下的高度自動分配給中間的表格內(nèi)容。
  • 表格內(nèi)容高度超過后自動出現(xiàn)豎向滾動條,寬度超出后自動出現(xiàn)橫向滾動條。
  • 點擊按鈕,可以 隱藏/顯示 搜索條件 div 里面的內(nèi)容。
  • 當隱藏 搜索條件 div 里面的內(nèi)容時,中間表格的高度為:整個頁面的高度—操作按鈕div的高度—分頁div的高度。
  • 當搜索條件 div 里面的內(nèi)容時,中間表格的高度為:整個頁面的高度—搜索條件div的高度—操作按鈕div的高度—分頁div的高度。
    2,分辨率自適應(yīng)
  • 加載即動態(tài)實時計算高度,寬度

實現(xiàn)代碼

vue2 語法實現(xiàn)

<template>
  <div class="app-container">
    <div class="left" :style="{ width: leftWidth + 'px' }">
      <div class="right-center-left">
        左邊的內(nèi)容,可以很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
      </div>
    </div>
    <div class="divider" @mousedown="startDragging"></div>
    <div class="right">
      <div v-if="showDiv1" class="div1">查詢條件</div>
      <div class="div2">
        <button @click="toggleDiv1">操作按鈕 div1</button>
      </div>
      <div class="div3" :style="{ height: div3Height + 'px' }">
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
      </div>
      <div class="div4">分頁</div>
    </div>
  </div>
</template>

<script>
export default {
  name: "AppContainer",
  data() {
    return {
      isDragging: false,
      leftWidth: 200,
      showDiv1: true
    };
  },
  computed: {
    div3Height() {
      const totalHeight = window.innerHeight;
      const div2Height = 30;
      const div4Height = 30;
      const div1Height = this.showDiv1 ? 100 : 0;

      // 計算 div3 的高度
      return totalHeight - div2Height - div4Height - div1Height;
    }
  },
  methods: {
    startDragging(e) {
      this.isDragging = true;
      document.addEventListener("mousemove", this.onDrag);
      document.addEventListener("mouseup", this.stopDragging);
    },
    onDrag(e) {
      if (this.isDragging) {
        const minWidth = 50;
        const maxWidth = window.innerWidth - 50;
        const newLeftWidth = e.clientX;

        if (newLeftWidth > minWidth && newLeftWidth < maxWidth) {
          this.leftWidth = newLeftWidth;
        }
      }
    },
    stopDragging() {
      this.isDragging = false;
      document.removeEventListener("mousemove", this.onDrag);
      document.removeEventListener("mouseup", this.stopDragging);
    },
    toggleDiv1() {
      this.showDiv1 = !this.showDiv1;
    }
  }
};
</script>

<style scoped>
.app-container {
  display: flex;
  height: 100vh;
  overflow: hidden;
}

.left {
  overflow-x: auto;
  overflow-y: auto;
  white-space: nowrap;
  min-width: 90px;
}

.divider {
  width: 5px;
  cursor: ew-resize;
  background-color: #ccc;
}

.right {
  display: flex;
  flex-direction: column;
  height: 100%;
  flex: 1; /* 自動填滿剩余寬度 */
}

.div1 {
  height: 100px;
  background-color: #f0f0f0;
}

.div2 {
  height: 30px;
  background-color: #ddd;
}

.div3 {
  overflow-x: auto; /* 添加橫向滾動條 */
  overflow-y: auto; /* 添加縱向滾動條 */
  background-color: #f5f5f5;
}

.div4 {
  height: 200px;
  background-color: #ccc;
}
</style>

vue3 語法實現(xiàn)

<template>
  <div class="app-container">
    <div class="left" :style="{ width: leftWidth + 'px' }">
      左邊的內(nèi)容,可以很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長<br />
      1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
      1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
      1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
      1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
      1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
      1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
    </div>
    <div class="divider" @mousedown="startDragging"></div>
    <div class="right">
      <div v-if="showQueryDiv" class="right-query">搜索條件</div>
      <div class="right-button">
        <div class="right-button-left">操作按鈕</div>
        <div class="right-button-right">
          <button @click="toggleQueryDiv">隱藏/展示 搜索條件</button>
        </div>
      </div>
      <div class="right-table" :style="{ height: tableHeight + 'px' }">
        表格內(nèi)容<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
        1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />
      </div>
      <div class="right-page">分頁內(nèi)容</div>
    </div>
  </div>
</template>

<script>
import { ref, computed, onMounted, onUnmounted } from 'vue';

export default {
  name: "AppContainer",
  setup() {
    const isDragging = ref(false);
    const leftWidth = ref(200);
    const showQueryDiv = ref(true);

    const tableHeight = computed(() => {
      const totalHeight = window.innerHeight;
      const buttonHeight = 30;
      const pageHeight = 30;
      const queryHeight = showQueryDiv.value ? 100 : 0;
      return totalHeight - buttonHeight - pageHeight - queryHeight;
    });

    const startDragging = (e) => {
      isDragging.value = true;
      document.addEventListener("mousemove", onDrag);
      document.addEventListener("mouseup", stopDragging);
    };

    const onDrag = (e) => {
      if (isDragging.value) {
        const minWidth = 50;
        const maxWidth = window.innerWidth - 50;
        const newLeftWidth = e.clientX;
        if (newLeftWidth > minWidth && newLeftWidth < maxWidth) {
          leftWidth.value = newLeftWidth;
        }
      }
    };

    const stopDragging = () => {
      isDragging.value = false;
      document.removeEventListener("mousemove", onDrag);
      document.removeEventListener("mouseup", stopDragging);
    };

    const toggleQueryDiv = () => {
      showQueryDiv.value = !showQueryDiv.value;
    };

    onMounted(() => {
      window.addEventListener("resize", onDrag);
    });

    onUnmounted(() => {
      window.removeEventListener("resize", onDrag);
    });

    return {
      leftWidth,
      showQueryDiv,
      tableHeight,
      startDragging,
      toggleQueryDiv
    };
  }
};
</script>

<style scoped>
.app-container {
  display: flex;
  height: 100vh;
  overflow: hidden;
}

.left {
  overflow-x: auto;
  overflow-y: auto;
  white-space: nowrap;
  min-width: 90px;
}

.divider {
  width: 5px;
  cursor: ew-resize;
  background-color: #ccc;
}

.right {
  display: flex;
  flex-direction: column;
  height: 100%;
  flex: 1; /* 自動填滿剩余寬度 */
}

.right-query {
  height: 100px;
  background-color: #f0f0f0;
}

.right-button {
  height: 30px;
  display: flex;
  justify-content: space-between; /* 左右對齊內(nèi)容 */
  align-items: center; /* 垂直居中對齊 */
  background-color: #ddd;
}

.right-button-left {
  margin-left: 5px;
  text-align: left;
}

.right-button-right {
  margin-right: 5px;
  text-align: right;
}

.right-table {
  overflow-x: auto; /* 添加橫向滾動條 */
  overflow-y: auto; /* 添加縱向滾動條 */
  background-color: #f5f5f5;
}

.right-page {
  height: 200px;
  background-color: #ccc;
}
</style>

實現(xiàn)感想

這個功能,從畢業(yè)就開始思索,直到八年后的今天成熟完善,真是艱辛也是很不容易。目前市面上沒有見過有人實現(xiàn),很多人都是只言片語的,基本復(fù)制下來,無法達到效果。我這個一鍵復(fù)制到自己的項目,就能實現(xiàn)了,中間的坎坷不平,到了完全實現(xiàn)的這一刻,才覺得激動不已。

無任何坑,也沒有任何額外的引入,一個普普通通,最簡單的vue頁面,布局建好,里面的內(nèi)容就可以自己隨意發(fā)揮了。

總結(jié)

到此這篇關(guān)于vue前端自適應(yīng)布局實現(xiàn)的文章就介紹到這了,更多相關(guān)vue前端自適應(yīng)布局內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue使用國密SM4進行加密、解密的過程

    vue使用國密SM4進行加密、解密的過程

    國密SM4算法是一種對稱加密算法,適用于對稱密鑰加密和解密的場景,這篇文章主要介紹了vue使用國密SM4進行加密、解密,需要的朋友可以參考下
    2023-07-07
  • element-plus/element-ui走馬燈配置圖片及圖片自適應(yīng)的最簡便方法

    element-plus/element-ui走馬燈配置圖片及圖片自適應(yīng)的最簡便方法

    走馬燈功能在展示圖片時經(jīng)常用到,下面這篇文章主要給大家介紹了關(guān)于element-plus/element-ui走馬燈配置圖片及圖片自適應(yīng)的最簡便方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • Vue解決element-ui消息提示$message重疊問題

    Vue解決element-ui消息提示$message重疊問題

    這篇文章主要為大家介紹了Vue解決element-ui消息提示$message重疊問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Vue3項目實現(xiàn)前端導(dǎo)出Excel的示例代碼

    Vue3項目實現(xiàn)前端導(dǎo)出Excel的示例代碼

    這篇文章主要介紹了Vue3項目實現(xiàn)前端導(dǎo)出Excel的示例,在vue3的項目中導(dǎo)出Excel表格的功能,可以借助xlsx庫來實現(xiàn),下面是詳細的操作步驟,需要的朋友可以參考下
    2025-01-01
  • 詳解關(guān)于Vue2.0路由開啟keep-alive時需要注意的地方

    詳解關(guān)于Vue2.0路由開啟keep-alive時需要注意的地方

    這篇文章主要介紹了關(guān)于Vue2.0路由開啟keep-alive時需要注意的地方,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 淺談Vue的響應(yīng)式原理

    淺談Vue的響應(yīng)式原理

    讓我們來回顧下Vue的介紹,可以發(fā)現(xiàn)Vue 最顯著的一個功能是響應(yīng)系統(tǒng)。那么它的實現(xiàn)原理有又是如何呢?下面小編和大家來一起學(xué)習(xí)一下
    2019-05-05
  • 關(guān)于Vue組件庫開發(fā)詳析

    關(guān)于Vue組件庫開發(fā)詳析

    這篇文章主要給大家介紹了關(guān)于Vue組件庫開發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Vue.js仿Metronic高級表格(一)靜態(tài)設(shè)計

    Vue.js仿Metronic高級表格(一)靜態(tài)設(shè)計

    這篇文章主要為大家詳細介紹了Vue.js仿Metronic高級表格的靜態(tài)設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • vue + element-ui的分頁問題實現(xiàn)

    vue + element-ui的分頁問題實現(xiàn)

    這篇文章主要介紹了vue + element-ui的分頁問題實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • vue中給el-radio添加tooltip并實現(xiàn)點擊跳轉(zhuǎn)方式

    vue中給el-radio添加tooltip并實現(xiàn)點擊跳轉(zhuǎn)方式

    這篇文章主要介紹了vue中給el-radio添加tooltip并實現(xiàn)點擊跳轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論