百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

总结:js中4类修改样式的方法

yund56 2025-04-22 08:31 8 浏览

#前言

最近在写一个扩展右键菜单的插件,既然是插件,想着一步到位,把相关的style样式设置都丢进js文件中,直接加载一个js文件便可以使用该插件,所以今天就研究了下js批量的插入样式的方法,即addSheet,顺便总结下Javascript中修改样式的4类方法

#正文

1、通过js动态的创建style对象

直接贴代码更为方便,这是addCssRule方法,可以一条一条规则的添加到样式表中

var addCssRule = (function  {

    //该方法因为引用了闭包,无论如何都会创建style对象,所以不能做插件使用,需要自己手动修改,目前未进行修改
    var createSheet = function  {
        var style = document.createElement("style");
        document.head.appendChild(style);
        //后面写法是为了兼容ie8以下
        return style.sheet||style.styleSheet;
    };

    var sheet = createSheet;

    return function(selector,rules,index){
        var index=index||0;
        if(sheet.insertRules){
 sheet.insertRules(selector+"{"+rules+"}",index);
        }else{
 sheet.addRule(selector,rules,index);
        }
    }

});

该方法的思路就是,通过创建style,并把style添加到head上,然后返回style的sheet对象,利用sheet对象的insertRule(主流),或者addRule(ie8以下)方法,把样式添加到新建的样式表中。当然,此方法也可以改写成添加到已有的样式表中,而无须另行的创建新的样式表。

上面的方法是手动的每条规则添加一次,而我目前的需求是批量的添加样式,所以需要另寻它法。

下面的这个是addSheet方法

var addSheet=function(styleStr){

    var styleElements=document.getElementsByTagName("style");
    if(styleElements.length==0){
        if(document.createStyleSheet){
 //说明是ie8,注意,ie8的style通过js创建的话必须使用该方法创建
 //如果不使用该方法创建,那么通过createElement("style")方法创建的style对象在ie8下,没有对应的cssText方法
 document.createStyleSheet;
 //通过该方法创建,会自动添加到head中
        }else{
 //现代浏览器直接使用createElement
 var styleE=document.createElement("style");
 document.head.appendChild(styleE);
        }
    }

    //styleElements是类数组,会自动更新
    var styleElement=styleElements[0];

    if(styleElement.styleSheet){
        //说明ie8
        styleElement.styleSheet.cssText+=styleStr;
    }else{
        var textNode = document.createTextNode(styleStr);
        styleElement.appendChild(textNode);
    }

};

使用实例

addSheet('.dialog{\
        width:600px;\
        margin:30px auto;\
        background-color: #fff;\
        box-shadow: 0 3px 9px rgba(0,0,0,0.5);\
        font-family: Arial, sans-serif;\
        font-size: 13px;\
        line-height: 1.4;\
}')

addSheet方法可以批量的插入大量的样式,但是目前的缺点是,由于换行造成了不足,需要手动的在后面加上\解决,所以在实际开发中如果想使用该方法,可以通过网上的工具,把样式进行空格压缩之后作为参数传进来。目前打算是自己写一个node程序撸掉它。

2、使用行内样式

这个方法应该是我们最为熟悉的了,介绍不多

oDiv.style.color="#fff";
oDiv.style.fontSize="14px";

3、使用cssText(注意)

oDiv.style.cssText="color:#fff;font-size:14px;";

在使用该方法时,注意两点,cssText属性会覆盖原来的行内样式,即

<div style="width:100px;"></div>

在使用了

oDiv.style.cssText="color:#fff;font-size:14px;";

之后,原本的样式会被覆盖,变成

<div style="color:#fff;font-size:14px;"></div>

所以,一般我们为了避免行内样式被覆盖,都会这样使用

oDiv.style.cssText+="color:#fff;font-size:14px;";

这样原本的行内样式就不会被覆盖

<div style="width:100px;color:#fff;font-size:14px;"></div>

但是,在ie8之下,却存在一个奇葩的问题

<div style="width:100px;"></div>
console.log(oDiv.style.cssText);

输出结果是这样的width:100px,如果足够细心你会发现,此处的;被剔除了,所以一旦在ie8以下这样使用cssText则会由于分号的原因出现问题

oDiv.style.cssText+="color:#fff;font-size:14px;";

所以为了在ie8以下正常使用需要写个方法加上分号,具体方法这里不写了,后面的参考博客会给出

4、修改class

总共有4类方法修改样式,其他小的不计在这里,最后的一个方法就是通过修改元素的className来实现,这里也给出几个与class相关的参考方法

getClass方法

var getClass=function(ele){
        //使用trim方法格式化一次,防止 red blue yellow 这样的情况
        //这里的trim方法不可以去除
        ele.className=ele.className.trim;
        return ele.className.replace(/\s+/g," ").split(" ");
};

hasClass方法

var hasClass=function(ele,cls){
        //下面的这行代码是错误的,由于使用的正则匹配中,需要传参匹配,所以无法使用字面量的正则表达式,因为字面量的正则无法传参,只能用于常量,所以此处需要使用构造函数创建正则
        //var reg=/\b+cls+\b/g;
        //注意此处的\b变成了\\b,因为要进行双重转义,所以原本的元字符\b都要变成\\b这样的形式
        //这里的trim方法可以去除
        var cls=cls.trim;
        var reg=new RegExp("\\b"+cls+"\\b");
        return reg.test(ele.className);
};

addClass方法

var addClass=function(ele,cls){
        if(!hasClass(ele,cls)) {
 //这里的trim方法可以去除
 var cls=cls.trim;
 ele.className += " " + cls;
        }
};

removeClass方法

var removeClass=function(ele,cls){
        if(hasClass(ele,cls)){
 //这里的trim方法可以去除
 var cls=cls.trim;
 var reg=new RegExp("\\b"+cls+"\\b");
 return ele.className=ele.className.replace(reg,"")
        }
};

剩下的这个replaceClass方法懒得写了

var replaceClass=function(ele,nCls,oCls){

};  

上述的代码片段都是看了其他大牛博主,然后自己偷懒少写了一部分功能实现的,所以如果想要在实际开发中使用上面的方法请看下面的参考链接拿到源码,毕竟我上面的那些都是为了测试而写的,不完整。

参考链接

相关推荐

重生之我在头条学html网页编程,这一世我一定学好,成为编程高手

有人要问了html是什么东西?就是用来设计网页的一种语言会不会很难啊?这是很多朋友担心的,我告诉大家这是最简单最基础也最容易学习的一款入门级语言,当初我也是经常因为学不会C语言而苦恼自从学习了html...

如何在网页3D CAD中创建一个三维管道模型

前言在网页CAD中进行三维建模是一项有趣的任务。本文将介绍如何利用mxcad3d来创建三维管道模型。该工具提供了一系列三维建模功能的API,使得建立复杂的管道结构变得简单直观。安装在此之前,需要先安装...

网页模版如何用

网页模版已成为如今网站建设的核心工具。随着互联网需求的增长,越来越多的企业和组织需要建立自己的网站,以展示他们的品牌和服务。在这个过程中,网页模版为他们提供了一种简单而高效的方式来构建网站。所谓网页模...

AI嵌入式Flowcode编程网页开发人员入门指南

WebDeveloper允许使用FlowcodeIDE环境开发具有交互性的网页。可以在2D面板中添加特殊网页组件,以创建网页的视觉表示,并可以使用流程图添加交互功能。它的引入意味着Flowcod...

用Deepseek制作网页版的汉诺塔游戏保姆级教程

在deepseek中输入:“帮我做一个网页版的汉诺塔演示游戏,游戏包含2层、3层、4层、5层的汉诺塔游戏演示,制作自动求解演示按钮,点击按钮就可以生成出步数,同时自动演示最优解动画。”最后把生成的程序...

TaskBuilder前端页面CSS样式规则设置

在前端页面设计器内,点击底部的“CSS样式”选项卡,可以打开CSS样式设计器,在此查看和设计当前页面的CSS样式规则,如下图所示:3.3.6.1引入外部样式文件如果要在页面中引入外部CSS文件,可以点...

使用 Python、FastHTML 和 Uvicorn 构建简单的博客网站

FastHTML是2024年7月推出的PythonWeb框架,是一个简单但功能强大的框架,允许开发人员使用纯Python构建Web应用程序。(不需要复杂的模板引擎)。Fast...

用AI可以生成HTML网页了,很多初级前端都要失业了

即使你完全不懂html,javascript,css,也能做出漂亮的网页,这在以前是不可想象的,而现在确是可行的,因为有这样一个项目:openUI。openUI不仅仅能生成html页面,还能生成自适应...

python原始套接字socket下载http网页文件到txt

python原始套接字socket下载http网页文件到txtimportsocketdefdownload_webpage(url,output_file):try:...

高效排版:实现DeepSeek生成内容Word格式排版并导...

高效排版:实现DeepSeek生成内容Word格式排版并导出的经典方法,步骤简洁高效:DeepSeek生成内容复制出来容易出现乱码,下面介绍一种比较高效简单的方法!一、核心三步法1.调整模型模式在D...

打工人福音!3分钟教你学会word精美排版

昨天大熊介绍了word一键排版的三种办法,今天我们来详细讲讲第二种办法,用html代码实现一键排版,然后再导出pdf实现精美效果。打工人,打工魂,你是不是也有以下烦恼?下面是我经过多次和Deepsee...

使用 HTML 创建可折叠的交互式组件,一行 JS 代...

如果你想创建一个可折叠的交互式组件,使用<details>元素即可,一行JavaScript也不用写。<details>组件定义了一个可折叠的容器,它的第一个元素必须...

新手小白1分钟学会Word——文档的编辑1.1

天空一声巨响,迷人的我闪亮登场,亲爱的家人们,周末好呀!话不多说,咱们继续开干!昨天说到本节还有个小尾巴,那咱们就把这个小尾巴了结了,然后开始新篇章~四、保存文档我们对文档编辑完之后最重要的一步就...

超强!DeepSeek+HTML制作数据看板,老板看了都点赞

DeepSeek以极强的推理能力,支持生成各种代码,比如Python、SQL、Matlab、JS、HTML等,你可以拿这些代码放到编译器里,就能直接跑出结果,比如机器学习算法、exe应用、可视化图表、...

什么是Tailwind CSS

什么是TailwindCSSTailwindCSS是一个实用优先(Utility-First)的CSS框架,其核心思想是通过直接在HTML中组合预定义的类名来快速构建界面样式,无需编写传...