JavaScript脚本操作CSS
脚本化CSS就是使用JavaScript脚本操作CSS,配合HTML5、Ajax、jQuery等技术,可以设计出细腻、逼真的页面特效和交互行为,提升用户体验,如网页对象的显示/隐藏、定位、变形、运动等动态样式。
1、CSS脚本化基础
CSS样式有两种形式:样式属性和样式表。DOM 2级规范提供了一套API,其中包括CSS样式表访问接口。在DOM 2级规范之前,允许使用标签对象的style属性访问行内样式属性。
1.1、访问行内样式
任何支持style特性的HTML标签,在JavaScript中都有一个对应的style脚本属性。style是一个可读可写的对象,包含了一组CSS样式。
使用style的cssText属性可以返回行内样式的字符串表示。同时style对象还包含一组与CSS样式属性一一映射的脚本属性。这些脚本属性的名称与CSS样式属性的名称对应。在JavaScript中,由于连字符是减号运算符,含有连字符的样式属性(如font-family),其脚本属性会以驼峰命名法重新命名(如fontFamily)。
【示例】border-right-color属性在脚本中应该使用borderRightColor:
<div id="box" >盒子</div><script>var box = document.getElementById("box");box.style.borderRightColor = "red";box.style.borderRightStyle = "solid";</script>
提示:使用CSS脚本属性时,需要注意几个问题:
- float是JavaScript保留字,因此使用cssFloat表示与之对应的脚本属性的名称。
- 在JavaScript中,所有CSS属性值都是字符串,必须加上引号。
elementNode.style.fontFamily = "Arial, Helvetica, sans-serif"; elementNode.style.cssFloat = "left"; elementNode.style.color = "#ff0000";
- CSS样式声明结尾的分号不能够作为脚本属性值的一部分。
- 属性值和单位必须完整地传递给CSS脚本属性,省略单位则所设置的脚本样式无效。
1.2、使用style对象
DOM 2级样式规范为style对象定义了一些属性,简单说明如下:
- cssText:返回style的CSS样式字符串。
- length:返回style的声明CSS样式的数量。
- parentRule:返回style所属的CSSRule对象。
- getPropertyCSSValue():返回包含指定属性的CSSValue对象。
- getPropertyPriority():返回包含指定属性是否附加了!important命令。
- item():返回指定下标位置的CSS属性的名称。
- getPropertyValue():返回指定属性的字符串值。
- removeProperty():从样式中删除给定属性。
- setProperty():为指定属性设置值,也可以附加优先权标志。
1.3、使用styleSheets对象
在DOM 2级样式规范中,使用styleSheets对象可以访问页面中所有样式表,包括用<style>
标签定义的内部样式表,以及用<link>
标签或@import命令导入的外部样式表。
cssRules对象包含指定样式表中所有的规则(样式)。
提示:IE支持rules对象表示样式表中的规则,可以使用下面代码兼容不同浏览器:
var cssRules = document.styleSheets[0].cssRules || document.styleSheets[0].rules;
在上面代码中,先判断浏览器是否支持cssRules对象,如果支持则使用cssRules(非IE浏览器),否则使用rules(IE浏览器)。
【示例】通过
<style type="text/css">#box {width: 400px;height: 200px;background-color:#BFFB8F;border: solid 1px blue;}</style><script>window.onload = function(){var box = document.getElementById("box");var cssRules = document.styleSheets[0].cssRules || document.styleSheets[0].rules;//判断浏览器类型box.innerHTML = "<h3>盒子样式</h3>"box.innerHTML += "<br>边框:" + cssRules[0].style.border; //cssRules的border属性box.innerHTML += "<br>背景:" + cssRules[0].style.backgroundColor;box.innerHTML += "<br>高度:" + cssRules[0].style.height;box.innerHTML += "<br>宽度:" + cssRules[0].style.width;}</script><div id="box"></div>
提示:cssRules(或rules)的style对象在访问CSS属性时,使用的是CSS脚本属性名,因此所有属性名称中不能使用连字符。例如:
cssRules[0].style.backgroundColor;
1.4、使用selectorText对象
使用selectorText对象可以获取样式的选择器字符串表示。
【示例】使用selectorText属性获取第1个样式表(styleSheets[0])中的第3个样式(cssRules[2])的选择器名称,输出显示为“.blue”:
<style type="text/css">#box { color:green; }.red { color:red; }.blue { color:blue; }</style><link href="style1.css" rel="stylesheet" type="text/css" media="all" /><script>window.onload = function(){var cssRules = document.styleSheets[0].cssRules || document.styleSheets[0].rules;var box = document.getElementById("box");box.innerHTML = "第一个样式表中第三个样式选择符 = " + cssRules[2].selectorText;}</script><div id="box"></div>
1.5、编辑样式
cssRules的style不仅可以读取,还可以写入属性值。
【示例】下面示例样式表中包含3个样式,其中蓝色样式类(.blue)定义字体显示为蓝色。用脚本修改该样式类(.blue规则)字体颜色为浅灰色(#999):
<style type="text/css">#box { color:green; }.red { color:red; }.blue { color:blue; }</style><script>window.onload = function(){var cssRules = document.styleSheets[0].cssRules || document.styleSheets[0].rules;cssRules[2].style.color="#999"; //修改样式表中指定属性的值}</script><p class="blue">原为蓝色字体,现在显示为浅灰色。</p>
提示:上述方法修改样式表中的类样式,会影响其他对象或其他文档对当前样式表的引用,因此在使用时请务必谨慎。
1.6、添加样式
使用addRule()方法可以为样式表增加一个样式,具体用法如下:
styleSheet.addRule(selector,style ,[index])
styleSheet表示样式表引用,参数说明如下:
- selector:表示样式选择符,以字符串的形式传递。
- style:表示具体的声明,以字符串的形式传递。
- index:表示一个索引号,即添加样式在样式表中的索引位置,默认为-1,表示位于样式表的末尾,该参数可以不设置。Firefox支持使用insertRule()方法添加样式,用法如下:
styleSheet.insertRule(rule ,[index])
参数说明如下:
- rule:表示一个完整的样式字符串
- index:与addRule()方法中的index参数作用相同,但默认为0,放置在样式表的末尾。
【示例】先在文档中定义一个内部样式表,然后使用styleSheets集合获取当前样式表,利用数组默认属性length获取样式表中包含的样式个数。最后在脚本中使用addRule()(或insertRule())方法增加一个新样式,样式选择符为p,样式声明背景色为红色,字体颜色为白色,段落内部补白为1个字体大小:
<style type="text/css">#box { color:green; }.red { color:red; }.blue { color:blue; }</style><script>window.onload = function(){var styleSheets = document.styleSheets[0]; //获取样式表引用var index = styleSheets.length; //获取样式表中包含样式的个数if(styleSheets.insertRule){ //判断浏览器是否支持insertRule()方法//在内部样式表中增加p标签选择符的样式,插入样式表的末尾styleSheets.insertRule("p{background-color:red;color:#fff;padding:1em;}", index);}else{ //如果浏览器不支持insertRule()方法styleSheets.addRule("P", "background-color:red;color:#fff;padding:1em;", index);}}</script><p>在样式表中增加样式操作</p>
1.7、读取渲染样式
CSS样式具有重叠特性,因此定义的样式与最终显示的样式并非完全相同。DOM定义了一个方法帮助用户快速检测当前对象的显示样式,不过IE和标准DOM之间实现的方法不同。
1.IE浏览器
IE使用currentStyle对象读取元素的最终显示样式,该对象为一个只读对象,包含元素的style属性,以及浏览器预定义的默认style属性。
2.非IE浏览器
DOM使用getComputedStyle()方法获取目标对象的显示样式,但是它属于document.defaultView对象。getComputedStyle()方法包含了两个参数:第一个参数表示元素,用来获取样式的对象;第二个参数表示伪类字符串,定义显示位置,一般可以省略,或者设置为null。
【示例】使用if语句判断当前浏览器是否支持document.defaultView,如果支持则进一步判断是否支持document.defaultView.getComputedStyle,如果支持则使用getComputedStyle()方法读取最终显示样式;否则,判断当前浏览器是否支持currentStyle,如果支持则使用它读取最终显示样式:
<style type="text/css">#box { color:green; }.red { color:red; }.blue {color:blue; background-color:#FFFFFF;}</style><script>window.onload = function(){var styleSheets = document.styleSheets[0]; //获取样式表引用指针var index = styleSheets.length; //获取样式表中包含样式的个数if(styleSheets.insertRule){ //判断浏览器是否支持styleSheets.insertRule("p{background-color:red;color:#fff;padding:1em;}", index);}else{styleSheets.addRule("P", "background-color:red;color:#fff;padding:1em;", index);}var p = document.getElementsByTagName("p")[0];if( document.defaultView && document.defaultView.getComputedStyle)p.innerHTML = "背景色:"+document.defaultView.getComputedStyle(p,null).backgroundColor+"<br>字体颜色:"+document.
defaultView.getComputedStyle(p,null).color;else if( p.currentStyle)p.innerHTML = "背景色:"+p.currentStyle.backgroundColor+"<br>字体颜色:"+p.currentStyle.color;else p.innerHTML = "当前浏览器无法获取最终显示样式";}</script><p class="blue">在样式表中增加样式操作</p>
1.8、读取媒体查询
使用window.matchMedia()方法可以访问CSS的Media Query语句。window.matchMedia()方法接收一个mediaQuery语句的字符串作为参数,返回一个MediaQueryList对象。该对象有以下两个属性:
- media:返回所查询的mediaQuery语句字符串。
- matches:返回一个布尔值,表示当前环境是否匹配查询语句。
var result = window.matchMedia('(min-width: 600px)');result.media //(min-width: 600px)result.matches //true
【示例1】根据mediaQuery是否匹配当前环境,执行不同的JavaScript代码:
var result = window.matchMedia('(max-width: 700px)');if (result.matches) {console.log('页面宽度小于等于700px');} else {console.log('页面宽度大于700px');}
【示例2】根据mediaQuery是否匹配当前环境,加载相应的CSS样式表:
var result = window.matchMedia("(max-width: 700px)");if (result.matches){var linkElm = document.createElement('link');linkElm.setAttribute('rel', 'stylesheet');linkElm.setAttribute('type', 'text/css');linkElm.setAttribute('href', 'small.css');document.head.appendChild(linkElm);}
注意:如果window.matchMedia无法解析mediaQuery参数,应该返回false,而不是报错。例如:
window.matchMedia('bad string').matches //false
window.matchMedia方法返回的MediaQueryList对象有两个方法,用来监听事件:addListener方法和removeListener方法。如果mediaQuery查询结果发生变化,就调用指定回调函数。例如:
var mql = window.matchMedia("(max-width: 700px)");//指定回调函数mql.addListener(mqCallback);//撤销回调函数mql.removeListener(mqCallback);function mqCallback(mql) {if (mql.matches) {//宽度小于等于700px} else {//宽度大于700px}}
上面代码中,回调函数的参数是MediaQueryList对象。回调函数的调用可能存在两种情况:一种是显示宽度从700px以上变为以下,另一种是从700px以下变为以上,所以在回调函数内部要判断一下当前的屏幕宽度。
2、实战
2.1、获取元素尺寸
使用offsetWidth和offsetHeight属性可以获取元素的尺寸,其中offsetWidth表示元素在页面中所占据的总宽度,offsetHeight表示元素在页面中所占据的总高度。
【示例】使用offsetWidth和offsetHeight属性获取元素大小。
<div style="height:200px;width:200px;"><div style="height:50%;width:50%;"><div style="height:50%;width:50%;"><div style="height:50%;width:50%;"><div id="div" style="height:50%;width:50%;border-style:solid;"></div></div></div></div></div><script>var div = document.getElementById("div");var w = div.offsetWidth; //返回元素的总宽度var h = div.offsetHeight; //返回元素的总高度</script>
提示:上面示例在怪异模式下和标准模式的浏览器中解析结果差异很大,其中怪异模式解析返回宽度为21px,高度为21px,而在标准模式的浏览器中返回高度和宽度都为19px。
注意,offsetWidth和offsetHeight是获取元素尺寸的最好方法,但是当元素隐藏显示时,即设置样式属性display的值为none时,则offsetWidth和offsetHeight属性返回值都为0。
相关文章:

JavaScript脚本操作CSS
脚本化CSS就是使用JavaScript脚本操作CSS,配合HTML5、Ajax、jQuery等技术,可以设计出细腻、逼真的页面特效和交互行为,提升用户体验,如网页对象的显示/隐藏、定位、变形、运动等动态样式。 1、CSS脚本化基础 CSS样式有两种形式&…...
Rust4.1 Managing Growing Projects with Packages, Crates, and Modules
Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 7: Managing Growing Projects with Packages, Crates, and Modules src/main.rs // s…...
RPA在财务预测和分析中的应用
在现代企业管理中,财务数据分析是决策制定和战略规划的关键环节。大数据的兴起带来财务数据的复杂性和数量不断增加,企业为此消耗了大量人力和物力。随着当今数字化、智能化时代的到来,越来越多企业引进RPA技术来提高工作效率,实现…...

无人机航拍技术基础入门,无人机拍摄的方法与技巧
一、教程描述 买了无人机,可是我不敢飞怎么办?禁飞区越来越多,到底哪儿才能飞?我的无人机跟你一样,为什么我拍不出大片?厂家的说明书看不进去,有没有一套无人机的课程,可以快速上手…...
PTA 哈密尔回路(建图搜索)
题目 著名的“汉密尔顿(Hamilton)回路问题”是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1 次)。本题就要求你判断任一给定的回路是否汉密尔顿回路。 输入格式: 首先第一行给出两个正整数:…...

如何利用产品帮助中心提升用户体验
在当今竞争激烈的市场中,提供优秀的用户体验是吸引和保留客户的关键。而一个高效和易于使用的产品帮助中心,正成为越来越多企业用以提升用户体验的重要工具。产品帮助中心是一个集中的信息库,为用户提供关于产品功能、故障排除、常见问题解答…...

【Python大数据笔记_day05_Hive基础操作】
一.SQL,Hive和MapReduce的关系 用户在hive上编写sql语句,hive把sql语句转化为MapReduce程序去执行 二.Hive架构映射流程 用户接口: 包括CLI、JDBC/ODBC、WebGUI,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端…...

css呼吸效果实现
实现一个图片有规律的大小变化,呈现呼吸效果,怎么用CSS实现这个呼吸效果呢 一.实现 CSS实现动态效果可以使用动画( animation)来属性实现,放大缩小效果可以用transform: scale来实现,在这基础上有了动画,就可以设置一个…...

机器视觉opencv答题卡识别系统 计算机竞赛
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 答题卡识别系统 - opencv python 图像识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分…...
2024年的后端和Web开发趋势
目录 1 2 3 4 5 1 不断变化的数字创新格局可能让人感觉像是一场无情的竞赛。作为开发人员,你的痛苦是真实的——交付尖端产品、保持竞争力、跟上不断变化的用户期望,综合起来你的压力可能是压倒性的。 但是,如果我们告诉你有一个指南针…...

对比了10+网盘资源搜索工具,我最终选择了这款爆赞的阿里云盘、百度网盘、夸克网盘资源一站式搜索工具
盘友圈(https://panyq.com)是一个综合性的网盘搜索站,与其他网盘搜索工具相比,它具有多个独特的优点,使其成为用户们首选的平台。 首先,盘友圈汇集了阿里云盘、百度网盘和夸克网盘等主流网盘资源ÿ…...

GoLong的学习之路(二十)进阶,语法之反射(reflect包)
这个是为了接上之前的语法篇的。按照我的学习计划,这里此时应该有一个小项目来做一个统合。但是吧,突然觉得,似乎也没必要。能学go的大部分肯定都是有其他语言的基础的。 接下来说反射 文章目录 反射介绍reflect包TypeOftype name和type kin…...
关于表单校验,:rules=“loginRules“
在写好validator相关的方法后,rule测试没有生效 <el-form ref"loginForm" :model"loginForm" :rules"loginRules" class"login-form" <el-form-item prop"username"> <el-input ref"usernam…...

统一消息分发中心设计
背景 我们核心业务中订单完成时,需要完成后续的连带业务,扣件库存库存、增加积分、通知商家等。 如下图的架构: 这样设计出来导致我们的核心业务和其他业务耦合,每次新增连带业务或者去掉连带业务都需要修改核心业务。 一方面&…...

前端项目导入vue和element
1.安装nodejs 下载链接https://cdn.npmmirror.com/binaries/node/v18.18.0/node-v18.18.0-x64.msi 进入cmd 命令行模式 管理员身份运行 输入 (node -v)能看到版本号 npm config set prefix "C:\Program Files\nodejs" 默认路径 npm config…...

【11】使用透视投影建立一个3D空间的测试
核心操作: 1.proj view model 这三个矩阵 glm::mat4 mvp m_Proj * m_View * model; m_Shader->Bind(); m_Shader->SetUniformMat4f("u_MVP", mvp);着色器里面就: proj:投影矩阵,可以选择正交投影,或者透视投影…...

【广州华锐互动】VR影视制片虚拟仿真教学系统
随着虚拟现实(VR)技术的不断发展,VR在影视制片教学中的应用场景也变得越来越丰富。本文将介绍VR在影视制片教学中的常见应用场景及其意义,并通过案例分析来更好地展示其应用前景。 在影视制片教学中,VR可以提供一种沉浸式的制作体验。其中&am…...

从研发域到量产域的自动驾驶工具链探索与实践
导读 本文整理自 2023 年 9 月 5 日百度云智大会 - 智能汽车分论坛,百度智能云自动驾驶云研发高级经理徐鹏的主题演讲《从研发域到量产域的自动驾驶工具链探索与实践》。 全文中部段落附有演讲中 2 个产品演示视频的完整版,精彩不容错过。 (视频观看&…...
404. 左叶子之和
原题链接:404. 左叶子之和 思路: 首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。 节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节…...

基于SSM的课程管理系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...

鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...