前几天面试,问的第一个问题就是这个,但是我第一次面试过于紧张,也可能是基础不扎实,特在此重新总结一下该问题的解答。

JavaScript

假设HTML相关代码如下:

<style>
div {
width: 100px;
height: 100px;
border: 1px solid black;
}
</style> <div id="a"></div>
<button id="b">点击变色</button>

那么使用JS事件处理有3种写法:

行内事件

在div标签内加入onclick="document.getElementById('a').style.backgroundColor='pink';"

测试效果如下,符合预期。

如果响应函数在js中定义,则在行中调用时切记要加上(),即<button onclick='btnClick()'></button>

onclick绑定

js代码如下:

var div = document.getElementById('a');
var btn = document.getElementById('b');
btn.onclick = function(){
div.style.backgroundColor = 'pink';
} // 也可以采用下面这种写法
function btnClick(){}
btn.onclick = btnClick;

关于选取元素

要特别注意getElementById参数不需要加#,而且同系列函数常用的还有getElementsByClassgetElementsByTag,除了id选取其他都是得到数组,切记使用时要加下标。

还可以使用querySelector方法,使用如下:

var div = document.querySelector('#a');

与之配套的是querySelectorAll方法,返回数组。

关于改变颜色

  1. 改变颜色也有几种方式,首先是通过给style.property赋值的方式修改,但是属性property要采用小驼峰命名法,如同我们上述所写:
div.style.backgroundColor = 'pink';

这种方式如果要添加多个样式则过于繁琐。

  1. 还可以采用给style.cssText赋值的方式修改(属性名和写css时一样),如下:
div.style.cssText = 'background-color: pink';

但是采用这种方式进行修改,前面的cssText会被后面的覆盖,例:

div.style.cssText = 'background-color: pink';
div.style.cssText = 'border-color: red';

在点击后,显示效果变为:

显然覆盖了前一句背景颜色,但是我们写在style标签中的样式并没有覆盖。

  1. 我们还可以通过获取样式表对象,调取insertRuleaddRule方法来改变样式(首先我们要有一个外部CSS文件,哪怕是空的也行),代码如下
var sheet = document.styleSheets[0];
// insertRule
sheet.insertRule('div{background-color:pink;}'); //addRule
sheet.addRule('div', 'background-color:pink;');

两者的参数稍微有些不同,可以点此查阅。使用这种方式,经测试不会覆盖前面样式。

(但是有点奇怪的是我更改border-color这个属性时,insertRule修改不了,而addRule可以)

addEventListener

上述两种方式属于DOM Level0的事件处理模型,但它们没法在同一个事件上绑定多个事件处理程序,接下来我们使用DOM Level2的事件处理模型来解答。

在一般浏览器上使用addEventListener添加事件,使用removeEventListener移除事件;在IE浏览器中使用attachEventListener添加事件,使用detachEventListener移除事件。

function btnClick() {
div.style.backgroundColor = 'pink';
}
//一般浏览器
div.addEventListener('click', btnClick); //IE浏览器
div.attachEventListener('click', btnClick);

在JS一节中的样式改变方式此处同样适用。

推荐使用此种方式,详情见此

其实可以不需要按钮,直接点击div修改颜色,见这篇博客

jQuery

首先要引入jquery文件:

<script src="./jquery-3.6.0.min.js "></script>

获取元素

var $div = $('#a');
var $btn = $('#b');

有jquery封装,获取元素变得简便许多。

绑定事件

同样有类似JS的三种方式,此处直接一并写了(行内一样,不再赘述):

function btnClick(){}
// click
$btn.click(btnClick); //on
$btn.on('click', btnClick);

其中差距如同JS,on绑定多个事件可以直接在第一个参数字符串中间隔一个空格加上,如:

$btn.on('click mouseover', btnClick);

设置样式

css()

//设置单个属性
$div.css('background-color', 'pink'); //设置多个属性
$div.css({'background-color': 'pink', 'border-color': 'red';})

添加class

//在style标签中设置class
.pink{background-color: pink;} //修改样式
$div.addClass('pink');

Vue

最近正好在学习Vue,索性也写一写。

首先引入vue文件:

<style>
#a{
width: 100px;
height: 100px;
border: 1px solid black;
}
</style> //写好模板
<div id='app'>
<div id='a'></div>
<button>按钮</button>
</div> <script src="./vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {},
methods: {}
})
</script>

v-bind动态绑定样式

在vue实例中定义相关变量和方法:

data:{
color: '';
},
methods:{
btnClick(){
this.color = 'pink';
}
}

在元素中绑定属性和事件:

<div id="app">
<div :style='{backgroundColor: color}'></div>
<button @click='btnClick'>按钮</button>
</div>

还可以直接设置绑定style,为了测试是否会覆盖样式我添加了一个按钮及事件:

data: {
style: {},
},
methods: {
btnClick() {
this.style = {
'background-color': 'pink'
};
},
btnClick2() {
this.style = {
'border-color': 'red'
};
}
} //div
<div :style='style'></div>
<button @click='btnClick'>按钮1</button>
<button @click='btnClick2'>按钮2</button>

点击按钮1:

点击按钮2:

解决办法,将赋值改为添加属性:

btnClick() {
Vue.set(this.style, 'background-color', 'pink');
},
btnClick2() {
Vue.set(this.style, 'border-color', 'red');
}

点击按钮1再点击按钮2后结果为:

如此不会覆盖。

动态绑定class

div元素绑定属性class:

//首先定义样式
<style>
.pink{background-color: pink;}
</style> <div :class='{pink: isPink}'></div>

修改vue实例的data和方法:

data: {
isPink: false,
},
methods: {
btnClick(){
this.isPink = true;
}
}

测试结果:点击后正常显示背景色。

也可以在class属性中动态添加样式class,实现方法有许多,我们就介绍到此。

点击按钮触发div颜色改变的几种写法的更多相关文章

  1. JS---案例:点击按钮设置div背景色渐变

    案例:点击按钮设置div背景色渐变 背景色渐变:设置透明度 <div id="dv"></div> <input type="button& ...

  2. js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言

    js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言 一.总结 一句话总结:实现按下组合键提交留言是通过给input加keydown事件,判断按键的键码来实现的. 1.如 ...

  3. React 点击按钮显示div与隐藏div,并给div传children

    最近做了一个react的点击按钮显示与隐藏div的一个小组件: [筛选]组件FilterButton import React,{Component} from 'react'; import {re ...

  4. js构建函数,点击按钮显示div,再点击按钮或其他区域,隐藏div

    这只是一个例子,先看看效果: html代码: <nav> <span class="nav_logo"></span> <h1>云蚂 ...

  5. 定时器应用-点击按钮,div向右移动

    需求是点击button,div就一直往右移动,给个条件left=800px就停止移动,通过定时器来控制. 代码如下: <!DOCTYPE html> <html> <he ...

  6. div最小高度的2种写法

    1.第一种写法: 原理:在IE6中,使用CSS定义div的高度的时候经常遇到这个问题,就是当div的最小高度小于一定的值以后,就会发现,无论你怎么设置最小高度,div的高度会固定在一个值不再发生变动, ...

  7. Android点击事件(click button)的四种写法

    在学习android开发和测试的时候发现不同的人对于click事件的写法是不一样的,上网查了一下,发现有四种写法,于是想比较一下四种方法的不同 第一种方法:匿名内部类 代码: package com. ...

  8. jq 点击按钮显示div,点击页面其他任何地方隐藏div

    css .bl_rencai_32{ float: left; height: 35px; line-height: 35px; } .bl_rencai_32 >input{ width: 3 ...

  9. [JS] 点击按钮触发后台事件前,弹出确认框

    只需要在button中设置onclick属性触发事件即可 下面以ASP.NET代码为例, ASP.NET中按钮客户端触发js代码的属性是OnClientClick <asp:Button ID= ...

  10. 点击按钮后URL呗改变

    这里留个坑,Button默认类型是submit.没有写类型的,可能会导致触发Url改变.要么写类型,要么在按钮对应的Js方法里return.

随机推荐

  1. koa源代码解析

    koa不愧为小而美,主要代码很少.简单来说,1,koa封装了node的http.createServer((req,res)=>{})的入参req,res到ctx同名属性(一个自定义对象)中,并 ...

  2. C CODE STYLE 每天瞅一两眼

    阅读进度:只读到了swich 转载于:https://users.ece.cmu.edu/~eno/coding/CCodingStandard.html C Coding Standard C Co ...

  3. padding&margin

    margin是盒子的外边距,即盒子与盒子之间的距离,而padding是内边距,是盒子的边与盒子内部元素的距离. 鞋盒里面的鞋到 盒子的距离设置为 padding ,而 鞋盒到鞋架的距离设置为margi ...

  4. Windows 10更新报错 0x8000ffff

    Windows 10更新报错 0x8000ffff - Microsoft Community 那么您可用 "Windows 10 覆盖安装" 来修复,可参考以下步伐,连接里有视频 ...

  5. 区分CommonJs/ES6 Module/AMD/CMD

    模块加载方式 CommonJs ES6 Module AMD CMD UMD Commonjs和ES6 Module的区别 总结 1.CommonJS CommonJS 是一个项目,其目标是为 Jav ...

  6. 【1】java之类与对象

    一.前言 面向对象就是一种组件化的设计思想. 面向对象特性 封装性:保护内部的定义结构安全性: 继承性:在已有的程序结构上继续扩充新的功能: 多态性:在某一个概念范围内的满足. 二.类与对象的定义和使 ...

  7. CF446D 题解

    题意 传送门 给定一张 \(n\) 个点 \(m\) 条边的无向图,每个节点有权值 \(v_i=\) \(0/1\).角色从节点 \(1\) 开始随机游走,走到 \(n\) 停止.求其经过路径上权值和 ...

  8. 2022-4-6内部群每日三题-清辉PMP

    1.产品负责人一直听取一个项目干系人的意见,远远超过其他项目干系人.敏捷管理专业人士应该怎么做? A.允许这名干系人和产品负责人自己解决问题. B.与这名干系人安排一次私人会议,以澄清他们的需求. C ...

  9. curl从入门到精通教程

    直接看英文版 https://catonmat.net/cookbooks/curl

  10. 【Qt】汇总Qt坑若干

    1..pro里添加了类以后调用时还是报错? solution:注意添加或者修改以后要保存保存保存,否则Qt是不会自己更新的! 2.在ui界面修改了类的成员名,保存了以后.cpp里调用,成员名还是不更新 ...