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

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

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

頁面展示

實(shí)現(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)橫向滾動條。
  • 點(diǎn)擊按鈕,可以 隱藏/顯示 搜索條件 div 里面的內(nèi)容。
  • 當(dāng)隱藏 搜索條件 div 里面的內(nèi)容時,中間表格的高度為:整個頁面的高度—操作按鈕div的高度—分頁div的高度。
  • 當(dāng)搜索條件 div 里面的內(nèi)容時,中間表格的高度為:整個頁面的高度—搜索條件div的高度—操作按鈕div的高度—分頁div的高度。
    2,分辨率自適應(yīng)
  • 加載即動態(tài)實(shí)時計(jì)算高度,寬度

實(shí)現(xiàn)代碼

vue2 語法實(shí)現(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;

      // 計(jì)算 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 語法實(shí)現(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>

實(shí)現(xiàn)感想

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

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

總結(jié)

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

相關(guān)文章

  • vue中component組件的props使用詳解

    vue中component組件的props使用詳解

    本篇文章主要介紹了vue中component組件的props使用詳解,這里整理了詳細(xì)的用法,具有一定的參考價值,有興趣的可以了解一下
    2017-09-09
  • Vue3動態(tài)使用KeepAlive組件的實(shí)現(xiàn)步驟

    Vue3動態(tài)使用KeepAlive組件的實(shí)現(xiàn)步驟

    在 Vue 3 項(xiàng)目中,我們有時需要根據(jù)路由的 meta 信息來動態(tài)決定是否使用 KeepAlive 組件,以控制組件的緩存行為,所以本文給大家介紹了Vue3動態(tài)使用KeepAlive組件的實(shí)現(xiàn)步驟,通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • vue3中不支持.sync語法糖的解決方法

    vue3中不支持.sync語法糖的解決方法

    在 Vue 3 中,.sync 修飾符已經(jīng)被移除,在 Vue 2 中,.sync 修飾符是一個語法糖,用于簡化子組件和父組件之間的雙向數(shù)據(jù)綁定,那么本文將給大家介紹一下vue3中不支持.sync語法糖的解決方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Electron 如何調(diào)用本地模塊的方法

    Electron 如何調(diào)用本地模塊的方法

    這篇文章主要介紹了Electron 如何調(diào)用本地模塊的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Vue前端開發(fā)之實(shí)現(xiàn)交錯過渡動畫效果

    Vue前端開發(fā)之實(shí)現(xiàn)交錯過渡動畫效果

    這篇文章主要為大家詳細(xì)介紹了如何通過Vue實(shí)現(xiàn)交錯過渡動畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • vue移動端寫的拖拽功能示例代碼

    vue移動端寫的拖拽功能示例代碼

    這篇文章主要介紹了vue移動端寫的拖拽功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • vue3+springboot部署到Windows服務(wù)器的詳細(xì)步驟

    vue3+springboot部署到Windows服務(wù)器的詳細(xì)步驟

    這篇文章主要介紹了vue3+springboot部署到Windows服務(wù)器,配置Nginx時,因?yàn)楝F(xiàn)在是把vue前端交給了Nginx代理,所以這里的端口號不一定是我們在vue項(xiàng)目中設(shè)置的端口號,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-10-10
  • Vue實(shí)現(xiàn)商品詳情頁的評價列表功能

    Vue實(shí)現(xiàn)商品詳情頁的評價列表功能

    這篇文章主要介紹了Vue實(shí)現(xiàn)商品詳情頁的評價列表功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • vue實(shí)現(xiàn)表單錄入小案例

    vue實(shí)現(xiàn)表單錄入小案例

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)表單錄入小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • vue里面使用mui的彈出日期選擇插件實(shí)例

    vue里面使用mui的彈出日期選擇插件實(shí)例

    今天小編就為大家分享一篇vue里面使用mui的彈出日期選擇插件實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論