vue分割面板封裝實(shí)現(xiàn)記錄
本文實(shí)例為大家分享了vue分割面板封裝實(shí)現(xiàn)的具體代碼,供大家參考,具體內(nèi)容如下
記錄一次 分割面板的封裝:
?<template>
? <div class="split-pane-wrapper" ref="outer">
? ? <div class="pane pane-left" :style="{ width: leftOffsetPercent }">
? ? ? <slot name="left"></slot>
? ? </div>
? ? <div
? ? ? class="pane-trigger-con"
? ? ? @mousedown="handleMousedown"
? ? ? :style="{ left: triggerLeft, width: `${triggerWidth}px` }"
? ? >
? ? //中間分割按鈕
? ? ? <div class="pane-trigger-con__button">
? ? ? ? <div v-for="i in 10" :key="i"></div>
? ? ? </div>
? ? </div>
? ? <div class="pane pane-right" :style="{ left: leftOffsetPercent }">
? ? ? <slot name="right"></slot>
? ? </div>
? </div>
</template>
<script>
export default {
? name: "SplitPane",
? props: {
? ? ? //分割值
? ? value: {
? ? ? type: Number,
? ? ? default: 0.5,
? ? },
? ? //按鈕寬度
? ? triggerWidth: {
? ? ? type: Number,
? ? ? default: 8,
? ? },
? ? //最大分割值/最小分割值
? ? min: {
? ? ? type: Number,
? ? ? default: 0.1,
? ? },
? ? max: {
? ? ? type: Number,
? ? ? default: 0.9,
? ? },
? },
? data() {
? ? return {
? ? ? // leftOffset: 0.3,
? ? ? canMove: false,
? ? ? initOffset: 0,
? ? };
? },
? computed: {
? ? ? //計算左邊面板的寬度
? ? leftOffsetPercent() {
? ? ? return `${this.value * 100}%`;
? ? },
? ? //右邊面板的marginleft
? ? triggerLeft() {
? ? ? return `calc(${this.value * 100}% - ${this.triggerWidth / 2}px)`;
? ? },
? },
? methods: {
? ? ? //鼠標(biāo)點(diǎn)擊 ?鼠標(biāo)移動事件 ?計算偏差
? ? handleMousedown(event) {
? ? ? document.addEventListener("mousemove", this.handleMousemove);
? ? ? document.addEventListener("mouseup", this.handleMouseup);
? ? ? this.initOffset =
? ? ? ? event.pageX - event.srcElement.getBoundingClientRect().left;
? ? ? this.canMove = true;
? ? },
? ? //鼠標(biāo)移動事件 計算移動距離
? ? handleMousemove(event) {
? ? ? if (!this.canMove) return;
? ? ? const outerRect = this.$refs.outer.getBoundingClientRect();
? ? ? let offsetPercent =
? ? ? ? (event.pageX -
? ? ? ? ? this.initOffset +
? ? ? ? ? this.triggerWidth / 2 -
? ? ? ? ? outerRect.left) /
? ? ? ? outerRect.width;
? ? ? if (offsetPercent < this.min) offsetPercent = this.min;
? ? ? if (offsetPercent > this.max) offsetPercent = this.max;
? ? ? // this.$emit('input', offsetPercent)
? ? ? this.$emit("update:value", offsetPercent);
? ? },
? ? handleMouseup() {
? ? ? this.canMove = false;
? ? },
? },
};
</script>
<style lang="scss">
.split-pane-wrapper {
? height: 100%;
? width: 100%;
? position: relative;
? .pane {
? ? position: absolute;
? ? top: 0;
? ? height: 100%;
? ? &-left {
? ? ? background: transparent;
? ? ? padding: 10px;
? ? ? box-sizing: border-box;
? ? }
? ? &-right {
? ? ? box-sizing: border-box;
? ? ? right: 0;
? ? ? bottom: 0;
? ? ? background: transparent;
? ? ? padding: 10px;
? ? }
? ? &-trigger-con {
? ? ? height: 100%;
? ? ? background: rgb(240, 240, 240);
? ? ? position: absolute;
? ? ? top: 0;
? ? ? z-index: 10;
? ? ? user-select: none;
? ? ? cursor: col-resize;
? ? ? .pane-trigger-con__button {
? ? ? ? border: 1px solid lightgrey;
? ? ? ? width: calc(100% - 2px);
? ? ? ? height: 20px;
? ? ? ? margin: 0 auto;
? ? ? ? position: relative;
? ? ? ? top: 50%; /*偏移*/
? ? ? ? transform: translateY(-50%);
? ? ? ? border-radius: 2px;
? ? ? ? div {
? ? ? ? ? margin: 1px 0;
? ? ? ? ? width: 100%;
? ? ? ? ? height: 1px;
? ? ? ? ? background-color: lightgrey;
? ? ? ? }
? ? ? }
? ? }
? }
}
</style>頁面使用split-pane:
?<div class="split-pane-con">
? ? ? ? <split-pane :value.sync="offset">
? ? ? ? ? <div slot="left"><el-input></el-input></div>
? ? ? ? ? <div slot="right"><el-input></el-input></div>
? ? ? ? </split-pane>
? </div>
? ? ??
? data() {
? ? return {
? ? ? offset: 0.4,
? ? };
? },效果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue-router路由判斷頁面未登錄跳轉(zhuǎn)到登錄頁面的實(shí)例
下面小編就為大家?guī)硪黄猇ue-router路由判斷頁面未登錄跳轉(zhuǎn)到登錄頁面的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
徹底搞懂并解決vue-cli4中圖片顯示的問題實(shí)現(xiàn)
這篇文章主要介紹了徹底搞懂并解決vue-cli4中圖片顯示的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
vue-cli項(xiàng)目使用mock數(shù)據(jù)的方法(借助express)
現(xiàn)如今前后端分離開發(fā)越來越普遍,前端人員寫好頁面后可以自己模擬一些數(shù)據(jù)進(jìn)行代碼測試,這樣就不必等后端接口,提高了我們開發(fā)效率。今天就來分析下前端常用的mock數(shù)據(jù)的方式是如何實(shí)現(xiàn)的,需要的朋友可以參考下2019-04-04
Vue中video標(biāo)簽如何實(shí)現(xiàn)不靜音自動播放
最近在做大屏展示需要在一開始播放引導(dǎo)視頻,產(chǎn)生自動播放需求,下面這篇文章主要給大家介紹了關(guān)于Vue中video標(biāo)簽如何實(shí)現(xiàn)不靜音自動播放的相關(guān)資料,需要的朋友可以參考下2023-01-01
Vue同一路由強(qiáng)制刷新頁面的實(shí)現(xiàn)過程
這篇文章主要介紹了解決VUE同一路由強(qiáng)制刷新頁面的問題,本文給大家分享實(shí)現(xiàn)過程,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
深入探索VueJS Scoped CSS 實(shí)現(xiàn)原理
這篇文章主要介紹了深入探索VueJS Scoped CSS 實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

