【Vue项目实战】Vue3中动态修改样式和级联样式优先顺序详解

news2024/11/18 23:49:58

Vue实战笔记目录

  • 前言
  • 一、ref修改样式
    • 1、通过 Vue 的 ref 组件获取 DOM 元素节点
      • 注:这边比较一下,和 DOM操作 document.getElementById('id') 这个方法有什么区别
    • 2、通过 ref 修改 DOM 元素节点样式
  • 二、通过v-bind对Html元素的样式(style)进行动态绑定
  • 三、v-bind:style动态绑定和ref修改style样式的区别
  • 四、【级联样式优先级顺序】复习
  • 五、总结

前言

本编记录了Vue3中动态修改CSS样式的方法,在项目中,经常会遇到CSS样式要变更的地方。

文章后面有对【级联样式优先级顺序】的复习

提示:以下是本篇文章正文内容,下面案例可供参考


一、ref修改样式

1、通过 Vue 的 ref 组件获取 DOM 元素节点

通过ref对元素实现动态绑定,可以获取到对应的DOM元素节点,代码如下:

提示:以下代码语法采用Vue3比较精简的setup语法糖展示

<template>
  <div class="squareClass" ref="squareRef">
  </div>
</template>
<script setup>
import {onMounted, ref} from 'vue'
//声明squareRef对应ref对象为一个常量
const squareRef = ref()

onMounted(() => {
  //setup语法用.value获取ref对象的值
  console.log('获取到的DOM对象: ' + squareRef.value)
  console.log(squareRef.value)
})
</script>

浏览器控制台打印结果如下:

在这里插入图片描述

注:这边比较一下,和 DOM操作 document.getElementById(‘id’) 这个方法有什么区别

Vue中,在生命周期create阶段ref组件就会对DOM节点进行动态绑定

如果在Vue3中要使用 document.getElementById(‘id’) 这个方法的话

要在onMounted组件中获取节点,代码如下:

<template>
  <div id="squareId">
  </div>
</template>
<script setup>
import {onMounted} from 'vue'

let squareId

onMounted(() => {
  squareId = document.getElementById('squareId')
  //这边和ref的调用区别少了个.value
  console.log(squareId)
})
</script>

浏览器控制台打印结果如下:

在这里插入图片描述

2、通过 ref 修改 DOM 元素节点样式

以下代码展示的是通过 ref 来修改样式,代码如下:

<template>
  <div ref="squareRef">
  </div>
</template>
<script setup>
import {onMounted, ref} from 'vue'

const squareRef = ref()

onMounted(() => {
  //ref修改DOM节点样式,DOM操作document.getElementById('id')的写法一样,只不过去掉了.value,所以原理上是一样的
  squareRef.value.style.width = '200px'
  squareRef.value.style.height = '200px'
  //这边样式名称有点小小的区别,在CSS中背景颜色的属性名称为:background-color,在style对象中的"-"符号不能用来引用属性值
  //所以这边一律使用驼峰命名方式来调取CSS属性或赋值,background-color对应backgroundColor
  squareRef.value.style.backgroundColor = 'greenyellow'
  squareRef.value.style.border = '5px dashed green'
})
</script>

效果展示:

在这里插入图片描述


二、通过v-bind对Html元素的样式(style)进行动态绑定

在Vue中,正常的v-bind写法如下:

<div v-bind:style="squareStyle">

在项目使用中,我们普遍会省略掉前面的v-bind,简写的方式如下:

<div :style="squareStyle">

这时候我们只要声明一个变量或常量,初始化该变量或常量的ref的值为css对象

就可以实现样式的动态绑定,代码如下:

提示:以下style样式的动态绑定采用简写:style实现

<template>
  <div :style="squareStyle">
  </div>
</template>
<script setup>
import {ref} from 'vue'

//声明一个常量或变量即可实现样式动态绑定
const squareStyle = ref({
  width: '200px',
  height: '200px',
  backgroundColor: 'skyblue',
  border: '5px dotted blue',
  borderRadius: '110px'
})
</script>

效果展示:

在这里插入图片描述


三、v-bind:style动态绑定和ref修改style样式的区别

在Vue中,通过ref组件对style进行动态绑定之后,这个style的对象除了用ref组件重新赋值之外

通过ref.value.style是不能对动态绑定的对象进行修改的。

<template>
  <div ref="squareRef" :style="squareStyle">
  </div>
</template>
<script setup>
import {onMounted, ref} from 'vue'

const squareRef = ref(),
    squareStyle = ref()

onMounted(()=>{
  //v-bind:style动态绑定
  squareStyle.value = {
    width: '200px',
    height: '200px',
    backgroundColor: 'skyblue',
    border: '5px dotted blue',
    borderRadius: '110px'
  }
  //通过ref组件进行style样式修改
  squareRef.value.style.width = '300px'
  squareRef.value.style.height = '300px'
  squareRef.value.style.backgroundColor = 'greenyellow'
  squareRef.value.style.border = '5px dashed green'
  squareRef.value.style.borderRadius = ''
})
</script>

结果展示:
在这里插入图片描述

我明明已经修改了样式,怎么不生效呢?

因为该样式对象已被动态绑定,就算修改了值,也会马上变回去

这时候只有通过修改动态绑定的style对象,才能对其进行修改

代码如下:

<template>
  <div :style="squareStyle">
  </div>
</template>
<script setup>
import {onMounted, ref} from 'vue'

const squareStyle = ref()

onMounted(() => {
  //第一个样式是天空蓝圆形
  squareStyle.value = {
    width: '200px',
    height: '200px',
    backgroundColor: 'skyblue',
    border: '5px dotted blue',
    borderRadius: '110px'
  }
  //第二个样式是黄绿方块
  squareStyle.value = {
    width: '300px',
    height: '300px',
    backgroundColor: 'greenyellow',
    border: '5px dashed green'
  }
})
</script>

结果展示:
在这里插入图片描述
修改的样式会把前一次的样式整个覆盖掉(上面的borderRadius属性不见了),这是需要注意的地方


四、【级联样式优先级顺序】复习

这边我们复习一下关于CSS样式赋值的【级联样式优先级顺序

下面代码展示三种级联样式的类型:外联式样式内联式样式内嵌式样式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>级联样式测试</title>
    <!-- 在head标签里用link标签引入的样式文件为【外联式样式】 -->
    <link rel="stylesheet" href="CSS.css" type="text/css">
    <!-- 在head标签里的style标签为【内联式样式】 -->
    <style>
        .circle {
            /* 这边我们用background-color(背景颜色)来做级联优先级测试  */
            /* 加上【 !important 】最高优先级关键字来进行标注和比较  */
            background-color: greenyellow !important; /* 内联式样式的背景颜色为【黄绿色】 */
        }
    </style>
</head>
<body>
<!-- 在元素标签中,style属性代表级联样式类型中的【内嵌式样式】 -->
<div class="circle"
     style="width: 200px;
            background-color: skyblue !important; /* 内嵌式样式的背景颜色为【天空蓝】 */
            height: 200px;border: 5px blue dashed;
            border-radius: 110px">
</div>
<script>
</script>
</body>
</html>

注:IE6浏览器不支持【 !important 关键字 】

外联式样式】的 CSS.css 文件内容如下:

/* 外联式样式中,背景颜色为【深粉色】 */
.circle {
    background-color: deeppink !important;
}

页面效果展示:

在这里插入图片描述

我们来标记一下三个样式级别在页面中圆形的CSS背景颜色:

  • 内嵌式样式: 天空蓝
  • 内联式样式: 黄绿色
  • 外联式样式: 深粉色

所以这边展示后得到的结果说明最高级别的样式为: 【 内嵌式样式

级联样式优先级顺序】测试结果如下图所示:

在这里插入图片描述


五、总结

实际上,动态绑定style的优先级是大于对style样式进行修改的

这边项目上有时候代码多了,可能忘了某个样式动态绑定过就给它通过style修改了样式

发现不生效,这时候排查问题就会发现它已经有动态绑定的值了

所以才写了这篇来加深记忆和帮助一下遇到同样问题的朋友

衷心感谢能够有耐心看完本篇的朋友,祝您早日成为高级架构师!

嘻嘻^-^

在这里插入图片描述

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

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

相关文章

端午假期整理了仿天猫H5 APP项目vue.js+express+mongo

效果 源码 源码太多&#xff0c;放github上了点击 遇到的问题 连接mongodb数据库多个集合&#xff08;model文件&#xff09; mongodb与mysql数据库连接不同&#xff0c;sql在定义查询语句时可以连接不同的表mongodb需要在开始定义好连接要用到的表 module.exports {dbPr…

echarts-wordcloud 血泪总结使用说明 (配置项及其不足点优化)

基本使用方法 echarts-wordcloud是基于echarts的一个词云库&#xff0c;是我常用的一个组件&#xff0c;业务上用的多一点&#xff0c;但是这个库在echarts的官网文档里面没有说明&#xff0c;git上的说明也很少&#xff0c;有些配置需要自己摸索&#xff0c;下面都是我的血泪…

css动画效果

动画1&#xff08;沿着椭圆转动&#xff09; 其实是个2D转动&#xff0c;只不过咱们设置椭圆&#xff0c;然后加上scale缩放&#xff08;近大远小&#xff09;&#xff0c;看上去就是3D效果 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head…

使用Node.js手撸一个建静态Web服务器,内部CV指南

文章里有全部代码&#xff0c;也可以积分下载操作步骤如上图文章结束 话说这个键盘真漂亮~~ 文章目录使用Node.js手撸一个建静态Web服务器一、动静态服务器的概念1.1 静态Web服务器概念1.2 静态Web服务器的优点1.3 快速搭建的途径二、 手撸指南2.1 框架搭建2.2 CtrlC/V2.3 启动…

Vue使用ElementUI对table的指定列进行合算

前言 最近有一个想法&#xff0c;就是记录自己花销的时候&#xff0c;table中有一项内容是花销的金额。然后想在table的底部有一项内容是该金额的总计。 然后我就顺着elementui的table组件寻找相关的demo&#xff0c;还真发现了一个这样的demo。 对于这个demo&#xff0c;官方…

css实现轮播图

轮播图&#xff1a;就是多张图片按照一定的时间和顺序依次从某个窗口来向用户展示图片 轮播图的实现代码&#xff1a; 1&#xff09;创建一个容器来进行轮播图的展示 这里的容器就是最外部的盒子 注意最外部盒子设置宽高时要与我们进行展示的图片的宽高保持一致&#xff0c…

npm i 安装不上依赖怎么办

起因 在github上下载的项目需要使用npm i来安装依赖。但是安装过程需要很久&#xff0c;然后安装完了又发现安装过程报错了。导致项目跑不起来。原因是某些依赖没有成功的安装上去 解决办法&#xff08;依次试&#xff0c;每次试新的命令最好把上次安装node_modules删掉&#…

threejs三维地图大屏项目分享

这是最近公司的一个项目。客户的需求是基于总公司和子公司的数据&#xff0c;开发一个数据展示大屏。 大屏两边都是一些图表展示数据&#xff0c;中间部分是一个三维中国地图&#xff0c;点击中国地图的某个省份&#xff0c;可以下钻到省份地图的展示。 地图上&#xff0c;会做…

(Select)解决:Element-ui 中 Select 选择器下拉框样式及输入框样式的修改问题(背景色透明与悬停背景色变化与下拉框边距变化等操作)

Ⅰ、Element-ui 提供的组件与想要目标情况的对比&#xff1a; 1、Element-ui 提供组件情况&#xff1a; 其一、Element-ui 自提供的代码情况为(示例的代码)&#xff1a; // Element-ui 自提供的代码&#xff1a; <template><el-select v-model"value" pla…

JS对象详解

JS对象详解 js的对象是什么&#xff1f;js的对象类型有哪些&#xff1f;具体实例是什么&#xff1f; 一、ECMA-262对JS对象的定义&#xff1a; 属性的无序集合&#xff0c;每个属性存放一个原始值、对象或函数&#xff1b; 对象是无特定顺序的值的数组&#xff1b; 对象是一…

用 JSP 连接 MySQL 登入注册项目实践(JSP + HTML + CSS + MySQL)

目录 一、写在前面 二、效果图 三、实现思路 四、实现代码 1、login总界面 2、registercheck总代码 3、logoutcheck总代码 4、amendcheck总代码 相关文章 jsp实现简单登入注册界面功能用jsp实现简单登入注册界面功能&#xff08;css美化&#xff09;&#xff08;软件i…

【前端点击穿透】pointer-events属性详解

什么是pointer-events&#xff1f; pointer-events 属性是一个指针属性&#xff0c;是用于控制在什么条件下特定的图形元素可以成为指针事件的目标。 This CSS property,when set to “none” allows elements to not receive hover/click events,instead the event will occur…

使用Three.js实现web端显示点云

需要了解html、js、websocket的基本使用&#xff0c;建议浏览three.js文档中场景、渲染器、光源、相机以点模型、Buffergeometry的相关知识 第一步&#xff0c;创建html文件 <!DOCTYPE html> <html><head><meta charset"utf-8"><title&…

vue3+vite在main.ts或者main.js文件中引入/App.vue报错(/App.vue不是模块)

vscode报错&#xff1a;./APP.vue不是模块场景复现情况一、vue3.0js情况二、vue3.0ts方案一&#xff1a;根目录新建env.d.ts方案二&#xff1a;根目录新建tsconfig.jsonvue3报错提示 找不到模块“/App.vue”或其相应的类型声明 场景复现 在使用 vue3➕vite➕ts 或者 js 搭建前…

微信小程序--》从零实现小程序项目案例

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;微信小程序 &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&…

react-前端excel 文件/PDF文件 导入 --导出,照片上传

需要了解&#xff0c;new FormData() --上传时&#xff0c;将内容转为文件流 new FileReader()--base64压缩&#xff0c;目前不了解 一、excel文件导出 三种导出: 一种是纯粹前端导出&#xff1b;两种后端导出: 分为 后端给地址导出&#xff0c;还有就是文件流的形式导出&…

攻防世界web新手 - very_easy_sql(非常详细的wp)

文章目录攻防世界web新手XCTF - very_easy_sql知识点解题思路ssrf发现ssrf详解什么是ssrfssrf的利用产生SSRF漏洞的函数ssrf漏洞利用gopher协议报错注入查数据库查表查列名查内容分割读取攻防世界web新手XCTF - very_easy_sql 题目知识点确实很多&#xff0c;我想我这个wp大概…

【Vue全家桶】Vuex状态管理

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…

windows10下安装和配置nodejs环境

一、下载安装node.js 官方下载地址:下载最新LTS windows版本: 16.15.0 (includes npm 8.5.5) Node.js ,如下图安装可以更改安装路径(我的是默认地址C:\Program Files\) 其余的都是选择 下一步, 安装 测试是否安装 成功 打开开始菜单中输入cmd&#xff0c;打开cmd命令窗口&a…

微信小程序实现客服功能(客服消息)

纯前端操作&#xff0c;无后端接入的情况下实现此功能 1&#xff0c;需要一个按钮button&#xff0c;加上open-type“contact”属性 <button open-type"contact">咨询</button> 需在真机上测试&#xff0c;点击按钮就可以进入客服页面。 2&#xff0c…