【4】Vite+Vue3左右容器中相同属性的元素内容自动对齐

news2024/12/1 10:42:15

在当今前端开发的领域里,快速、高效的项目构建工具以及使用最新技术栈是非常关键的。Vite+Vue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。

作为下一代前端构建工具,Vite 在开发中的启动速度和热重载方面具有突出的优势。而Vue3,则以更加简化的API和更高效的响应式系统为开发者带来了更加流畅的开发体验。结合使用Vite和Vue3,你将能够快速搭建稳定、高效的前端项目。

在这个专栏里,我们将通过100+个实战示例,详细介绍Vite+Vue3的各个方面。从项目的创建和配置开始,我们会一步一步地引导你使用Vite搭建项目的基本框架,并深入讲解Vue3的语法和特性。随后,我们将演示如何构建常见的前端组件、路由管理和状态管理,以及与后端API的交互等实际项目开发中常见的场景。

无论你是从零开始学习Vite+Vue3,还是希望进一步提升你的前端开发能力,本专栏都能为你提供实用的知识和实战经验。通过这100+个实战示例的学习,你将能够掌握Vite+Vue3的核心概念和技术,并能够在实际项目中灵活应用。

赶快加入我们吧,开始你的Vite+Vue3项目实战之旅!

一、介绍 ✨ ✨ ✨

这个需求的话相对比较冷门,一般会出现在图文排版,在文章或者网页中,将图片和文字按照某种规则进行对齐,提高排版效果和可读性.其次是做到页面一致性,一致的对齐方式可以使整个界面
看起来更加的统一和协调,从而引导用户的注意力。这个功能的话其实开发永远用得最多,比如我们在git提交代码的时候,会有代码对比功能,很清晰的就能知道我们修改了些什么内容。
如果你有word或者文章进行比对的话,就可以应用次功能,进行段落或者标题的对其,直接提供用户体验。

二、实现思路 ✨ ✨ ✨

我采用的是原生的JavaScript方式去实现,通过最外层的class获取到所有的dom元素,然后进行遍历,获取到特定属性的元素。以内容最多的容器高度为最小高度。也就是说,左右两个div,拥有
同样name或者href属性的(这里根据自己的需求去调整),获取两个容器的高度,取最大的高度设置成两个容器的最小高度(minHeight),这样两个容器的高度就一致了,从而实现左右对齐。
原生的JavaScript方式的好处在于Vue可以兼容,同时还能运用到react项目中以及其他的HTML项目中。当然还有其他的实现方式,比如Vue和React可以应用ref属性进行实现等等。

那为什么不直接设置div的高度呢,如果你有很多div,然后内容都是不可控制的,可能会很短,有可能会很多,这个时候你就没有一个准确的高度设置,就算你设置了一个最小高度,当两边内容都比较少的时候
就会出现很大一片空白,导致页面开起来很凌乱。所以当这类需求我们能够使用脚本去实现的时候尽量不要去写死。

三、完整代码示例 ✨ ✨ ✨

<template>
    <el-button @click="changeTab">切换</el-button>
    <div class="form-item" >
        <div v-if="show" style="display: flex;justify-content: space-around">
            <div style="width: 45%">
                <div name="#div1">
                    我是第一段
                    <br>
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                </div>
                <div name="#div2" style="margin: 50px 0">
                    我是第二段
                    <br>
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    <br>
                    <br>
                    <div name="#div2-1">
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                    </div>
                </div>
                <div name="#div3">
                    我是第三段
                    <br>
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                </div>
            </div>

            <div style="width: 45%">
                <div name="#div1">
                    我是第一段
                    <br>
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                </div>
                <div name="#div2" style="margin: 50px 0">
                    我是第二段
                    <br>
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    <br>
                    <br>
                    <div name="#div2-1">
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                    </div>
                </div>
                <div name="#div3">
                    我是第三段
                    <br>
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                </div>
            </div>
        </div>
        <div v-else style="display: flex;justify-content: space-around">
            <div style="width: 45%">
                <div name="#div1">
                    我是第一段
                    <br>
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                </div>
                <div name="#div2" style="margin: 50px 0">
                    我是第二段
                    <br>
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    <br>
                    <br>
                    <div name="#div2-1">
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                    </div>
                </div>
                <div name="#div3">
                    我是第三段
                    <br>
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                </div>
            </div>

            <div style="width: 45%">
                <div name="#div1">
                    我是第一段
                    <br>
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐测试一下是否对齐
                </div>
                <div name="#div2" style="margin: 50px 0">
                    我是第二段
                    <br>
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    测试一下是否对齐测试一下是否对齐
                    <br>
                    <br>
                    <div name="#div2-1">
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                        这里是子节点的一个位置
                    </div>
                </div>
                <div name="#div3">
                    我是第三段
                    <br>
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                    测试一下是否对齐
                </div>
            </div>
        </div>
    </div>
</template>

<script lang="ts">
import {defineComponent, nextTick, onMounted, ref} from "vue";

export default defineComponent({
    setup() {

        const div1 = ref<HTMLDivElement>()
        const div2 = ref<HTMLDivElement>()

        const contrast = () => {
            nextTick(() => {
                const data = {}
                const result = {}
                const divs = document.querySelector('.form-item')?.querySelectorAll('*');
                divs.forEach((el: HTMLElement) => {
                    const name = el.getAttribute('name')
                    if (name) {
                        if (data[name] && data[name].length > 0) {
                            data[name].push(el.offsetHeight)
                        } else {
                            data[name] = [el.offsetHeight]
                        }
                    }
                })
                Object.keys(data).forEach(key => {
                    const height1 = data[key][0]
                    const height2 = data[key][1]
                    result[key] = Math.max(height1, height2)
                })
                divs.forEach((el: HTMLElement) => {
                    const name = el.getAttribute('name')
                    if (name) {
                        el.style.minHeight = (result[name] || 0) + 'px'
                    }
                })
            })
        }

        onMounted(() => {
            contrast()
        })

        const show = ref<boolean>(false)

        const changeTab = () => {
            show.value = !show.value
            contrast()
        }

        return {
            div1,
            div2,
            changeTab,
            show
        }
    }
})
</script>

四、核心代码解析  ✨ ✨ ✨

1、这里我给需要左右对齐的div设置同样的name属性,这里的name属性要确保只能出现两次,即左右各一次。

2、在vue中nextTick是在页面加载完成以后的回调。页面加载完成以后遍历form-item下的所有节点。获取name相同的div进行高度取值,取出最大值后,再设置相同div的minHeight。

const contrast = () => {
    nextTick(() => {
        const data = {}
        const result = {}
        const divs = document.querySelector('.form-item')?.querySelectorAll('*');
        divs.forEach((el: HTMLElement) => {
            const name = el.getAttribute('name')
            if (name) {
                if (data[name] && data[name].length > 0) {
                    data[name].push(el.offsetHeight)
                } else {
                    data[name] = [el.offsetHeight]
                }
            }
        })
        Object.keys(data).forEach(key => {
            const height1 = data[key][0]
            const height2 = data[key][1]
            result[key] = Math.max(height1, height2)
        })
        divs.forEach((el: HTMLElement) => {
            const name = el.getAttribute('name')
            if (name) {
                el.style.minHeight = (result[name] || 0) + 'px'
            }
        })
    })
}

这里我们只是简单的实现了左右容器段落自动对齐的功能,后面我们还会实现,左右内容进行对比,差异高亮的功能。

我是Etc.End。每一次进步都值得庆祝,每一次努力都值得赞赏。不要忽视自己的成长,每一步都是向前迈进的力量。如果我的文章对你有所帮助的话,希望能留下你的点赞和收藏。😍。

👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/768342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【运维小知识】(四)——linux常用命令

运维专栏&#xff1a;运维小知识 目录 1.&#x1f341;&#x1f341;用mv命令修改文件名 2.&#x1f343;&#x1f343;创建及删除文件夹即文件夹下所有文件 3.&#x1f342;&#x1f342;移动文件夹并重命名 4.&#x1f33f;&#x1f33f;复制文件 5.&#x1f344;&#x…

Redis相关配置(3)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis相关配置1、units2、Include3、loadmodule 加载模块4、NET…

MySQL-多表设计-一对多

多表的设计-概述 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a; 一…

【PostgreSQL内核学习(二)—— 查询分析】

查询分析 查询处理查询分析查询处理与查询分析的关系查询分析执行流程Lex和YaccLex&#xff1a;Yacc&#xff1a;词法分析工具Lex语法分析工具Yacc使用Lex和Yacc的案例 词法和语法分析以SELECT语句为例讲解 PostgreSQL中查询语句如何被解析并生成分析树。 语义分析 声明&#x…

【Vue面试题系列】四

VNode有哪些属性&#xff1f; Vue内部定义的Vnode对象包含了以下属性&#xff1a; __v_isVNode: true&#xff0c;内部属性&#xff0c;有该属性表示为Vnode __v_skip: true&#xff0c;内部属性&#xff0c;表示跳过响应式转换&#xff0c;reactive转换时会根据此属性进行判断…

黑马B站视频JAVA部分的知识范围、学习步骤详解

文章目录 学习资源选择最后选择 JAVA的知识范围JDBCswing与JAVAFX JAVA的学习步骤1.右侧的部分:2 JAVA的高级但是必须要学的3 有一些要学&#xff08;部分&#xff09;4力扣 总结作业配套资源 学习资源选择 我从画面&#xff08;一定要看清代码&#xff09;声音&#xff08;清…

金融中的数学:概率分布(上)

概率分布是描述随机变量可能取值的概率的函数。它可以用来描述离散变量和连续变量的概率分布。对于离散变量的概率分布&#xff0c;我们称其为离散概率分布。对于连续变量的概率分布&#xff0c;我们称其为连续概率分布。本文主要介绍离散型概率分布。 &#xff11;.离散型均匀…

华为ospf路由协议在局域网中的高级应用案例

关键配置&#xff1a; 1、出口为ospf区域0&#xff0c;下联汇聚依次区域1、2…&#xff0c;非骨干全部为完全nssa区域 2、核心&#xff08;abr&#xff09;上对非骨干区域进行路由汇总&#xff0c;用于解决出口两台路由的条目数量 3、ospf静默接口配置在汇聚下联接接入交换机的…

ngAfterViewInit( ) to early /// ngFor和异步网络请求导致无法选中目标元素的问题

今天遇到的最无语的问题&#xff1a; angular 8版本以上&#xff0c;我在ngafterViewInit&#xff08;&#xff09;中选取元素选取不到&#xff0c;加上setTimeOut&#xff08;&#xff09;之后才可以选中 网上的解释&#xff1a; Angular的ngAfterViewInit生命周期钩子是在组…

uniapp | 查看ios打包后的Info.plist文件

最近在用 uni 开发 ios 的时候给项目添加了自定义的 Info.plist 文件&#xff0c;但是打包后发现并没有生效&#xff0c;才有了查看打包后的 Info.plist 文件想法。 HBuilderX3.6.5起&#xff0c;支持直接在应用项目中配置 iOS 平台的 Info.plist 和 资源文件&#xff08;Bundl…

使用 uiautomator2+pytest+allure 进行 Android 的 UI 自动化测试

目录 前言&#xff1a; 介绍 pytest uiautomator2 allure 环境搭建 pytest uiautomator2 allure pytest 插件 实例 初始化 driver fixture 机制 数据共享 测试类 参数化 指定顺序 运行指定级别 重试 hook 函数 断言 运行 运行某个文件夹下的用例 运行某…

unity 2019 内置渲染管线 光照与Lighting面板 参数详解

文章目录 前言一 Unity的光照 与 烘焙光照1 unity完整的光照组成2 光的亮度与颜色3 全局光照直接光间接光5 间接光≠光照贴图 二 色彩空间与自动烘焙1 unity的色彩空间2 自动烘焙光照 三 烘焙1 什么是烘焙&#xff0c;烘焙的是什么2 如何进行烘焙3 烘焙的优点和缺点4 查看光照贴…

Redis : zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误&#xff1a;jemalloc/jemalloc.h&#xff1a;没有那个文件或目录 #include <jemalloc/jemalloc.h> 解决 : 如上图使用命令 make MALLOClibc

2023杭电多校(一)

1002 City Upgrading 类似题及其题解 City Upgrading Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 524288/131072 K (Java/Others) Total Submission(s): 306 Accepted Submission(s): 78 Problem Description The city where crazyzhk resides is stru…

分布式事务几种实现方案

前言 分布式事务&#xff1f; 分布式事务是指涉及多个参与者的事务&#xff0c;这些参与者可能分布在不同的计算机、进程或者网络中。分布式事务需要保证ACID属性&#xff0c;即原子性、一致性、隔离性和持久性 解释 现在我们接触的系统基本上都是分布式系统&#xff0c;并且每…

计算几何(二维),定理及证明(持续更新中..)

注&#xff1a;定理来自这篇博客&#xff0c;本文注重证明 向量基本运算 加法 向量 a ⃗ ( x 1 , y 1 ) , b ⃗ ( x 2 , y 2 ) \vec{a}\left(x_1,y_1\right),\vec{b}\left(x_2,y_2\right) a (x1​,y1​),b (x2​,y2​) 则 a ⃗ b ⃗ ( x 1 x 2 , y 1 y 2 ) \vec{a}\…

P7 第二章 电阻电路的等效变换

1、等效变换应用举例 化简套路&#xff1a; 电压源与其串联的电阻&#xff0c;可以等效为电流源并联电阻&#xff0c;然后电流源就可以拿去合并电路中的&#xff0c;与之并联的电流&#xff0c;电阻则可以拿去合并与之并联的电阻。 公式法&#xff1a; 就是根据端的电压与端的…

第一节 C++ 变量

文章目录 1. Visual Studio Community 安装1.1. Visual Studio 介绍1.2. Visual Studio的安装1.3 Visual Studio创建与使用1.3.1 创建一个工程项目1.3.2 新建一个C文件1.3.3 编写执行文件 2. Dev-C 安装(初学者建议使用)2.1 Dev-C 介绍2.2 Dev-C 安装2.3 Dev-C 快捷键使用 3. 认…

数学建模常用模型(九) :偏最小二乘回归分析

数学建模常用模型&#xff08;九&#xff09; &#xff1a;偏最小二乘回归分析 偏最小二乘回归&#xff08;Partial Least Squares Regression&#xff0c;PLS Regression&#xff09;是一种常用的统计建模方法&#xff0c;用于解决多元线性回归中自变量间高度相关的问题。在偏…

【java】三大容器类(List、Set、Map)的常用实现类的特点

三大容器类&#xff08;List、Set、Map&#xff09;的常用实现类的特点 简介 本文总结三大容器类&#xff08;List、Set、Map&#xff09;的常用实现类&#xff08;ArrayList、Vector、LinkedList、HashSet、HashMap、HashTable&#xff09;的特点 一、List部分 1、ArrayLi…