整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML中实现鼠标移动到table中某个单元格中颜色改变

html中,我们经常会用到table布局;有时候需要实现指定单元格,当鼠标移动到上面的时候,该单元格背景变色,不是该行背景变色,也不是仅仅文字的背景变色;


html的文件结构大家都是知道的了,总体分为head和body部分

我们要实现变色,在head部分实现格式

<style>

.tablex {border-collapse: collapse;}

.tablex tr {}

.tablex tr td {text-align:center; line-height:30px;}

.tablex tr td:hover { background-color:#f00; color:#fff;}

</style>

然后在body部分,使用table时候,注明class="tablex".这样的话,就实现了我们所说的效果了。

附上完整代码:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GBK" />

<title>测试鼠标移到到表格单元格背景颜色改变的</title>

<style>

.table1 {border-collapse: collapse;}

.table1 tr {}

.table1 tr td {text-align:center; line-height:30px;}

.table1 tr td:hover { background-color:#006030; color:#006030;}

</style>

</head>

<body>

<table class="table1" width="70%" border="1">

<tr>

<td>测试</td>

<td>测试</td>

<td>测试</td>

<td>测试</td>

</tr>

<tr>

<td>测试</td>

<td>测试</td>

<td>测试</td>

<td>测试</td>

</tr>

<tr>

<td>测试</td>

<td>测试</td>

<td>测试</td>

<td>测试</td>

</tr>

<tr>

<td>测试</td>

<td>测试</td>

<td>测试</td>

<td>测试</td>

</tr>

<tr>

<td>测试</td>

<td>测试</td>

<td>测试</td>

<td>测试</td>

</tr>

</table>

</body>

</html>

在任何一个浏览器中运行,效果如下




南大盛联20年来一直致力于高端IT培训--打造高级软件人才实战培训专家,学生对我们的认可是我们一直前进的动力;项目团队全球招聘,特聘来自海外的老师进行任教,采用100%商业项目进行实战培训,线上线下同步进行。

课程全部紧随市场需求进行设计,并且动态进行调整;7天免费试听,0首付开始学习,学完后进行100%推荐就业,不满意工作岗位2次推荐。

选定一个平台,认识一群志同道合的朋友,你的未来人生路必定不一样。

目前已经开设下面这些培训项目

Java培训

安卓培训

JavaWeb培训

Linux培训

云服务器布置培训

HTML5培训

SEO培训

视频剪辑培训

UI培训

欢迎您们分享给自己愿意分享的朋友,大家一起来进步;相互转告,咨询,学习。

南大盛联培训理念:我懂,我也能让你懂。

标悬停提示是指当鼠标悬停在某一元素上时浏览器弹出的黄色小文本框,一般开发者大多会结合Javascript创建各式各样的自定义提示,其实通过CSS定位也可以实现,首先我们看一下效果图:

接下来我们详细介绍它的实现方法:

  1. 首先创建一个简单的带链接的HTML(根据自己的需要),在链接显示的文本后面添加需要提示的内容并置于span标签中(加粗部分)

    <p>

    <a href="www.laosiji.com" style="text-decoration:none">www.你懂的.com<span>(未满18周岁请勿点击)</span></a> is a Horror Movies Website.

    </p>

  2. 接下来是关键部分,先将链接的position属性设置为relative,因为<a>是<span>的父级元素,这样接下来才可以让<span>中的提示内容根据<a>中的链接文本进行绝对定位。<span>中的提示内容我们不希望它一开始就显示出来,所以要将它的display属性设置为none.

    a{position:relative;}

    a span{display:none;}

  3. 当鼠标悬停在链接上时我们希望显示出span中的提示内容,这时就需要将span的display属性设置为block,为了让其出现在链接的右下方,需要将span的position属性设置为absolute,并设置一定的距离(顶部1em,左边2em).

    a{position:relative;}

    a span{display:none;}

    a:hover span{display:block;

    position:absolute;top:1em;left:2em;}

  4. 前两步基已经完成了本次案例的主体,剩下的就是给span添加一些样式,让它看起来更像是提示。可以添加一些内边距 边框和背景颜色等。

    <style type="text/css">

    a{position:relative;}

    a span{display:none;}

    a:hover span{display:block;

    position:absolute;top:1em;left:2em;

    width:160px;

    padding:0.2em 0.6em;

    border:1px solid #996633;

    background-color:#FFFF66;

    color:red;}

    </style>

    PS:最后科普一下display:none与visible:hidden的区别

    display:none ---不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就是看不见也摸不到。

    visible:hidden--- 使对象在网页上不可见,但该对象在网页上所占的空间没有改变,通俗来说就是看不见但摸得到。

欢看电影的朋友肯定会注意到一个有趣的细节,就是电影出品方一定会在片头的Logo环节做一个小特效:暗影流动之间光泽一闪而过,这样做不仅可以提高Logo的辨识度,还可以提升质感,一举两得。参照华纳兄弟影业(Warner Bros. Pictures)的例子:

那么,在前端领域,如果使用纯CSS技术,能不能实现类似的特效呢?答案当然是可以的,这次我们以本站的Logo为例子,以一持万、提纲挈领地讲解一下如何使用纯CSS技术实现图片Logo鼠标悬停光泽一闪而过的光影特效。

一般情况下,大多数前端开发会选择 linear-gradient() ,这个方法创建一个表示两种或多种颜色线性渐变的图片。其结果属于<gradient>数据类型,是一种特别的<image>数据类型。

简单用法:

/* 渐变轴为45度,从蓝色渐变到红色 */
linear-gradient(45deg, blue, red);

/* 从右下到左上、从蓝色渐变到红色 */
linear-gradient(to left top, blue, red);

/* 从下到上,从蓝色开始渐变、到高度40%位置是绿色渐变开始、最后以红色结束 */
linear-gradient(0deg, blue, green 40%, red);

那么它怎么和logo图片结合使用呢?首先创建一个对象,因为是logo,所以我使用a标签,也就是超级链接,随后声明伪类mylogo:

<a href="/" class="mylogo" title="刘悦的技术博客"></a>

之后,定义logo的样式:

.mylogo{	
		display:block;
		margin: 0 auto;
    width:255px;
    height:200px;
    background-image:/logo.png;
    background-repeat: no-repeat;
}

接着就是linear-gradient()出场,原理并不复杂,利用linear-gradient绘制一个白色半透明渐变层,利用背景的负坐标隐藏起来,同时配合transition属性,在鼠标悬停(hover)的时候,设置1秒钟的延时动画,逐渐将光斑的坐标进行位移,产生一种光泽掠过的效果:

.mylogo{
            width: 255px;
            height: 200px;
 
            background: -webkit-linear-gradient(left, rgba(255,255,255,0)0, rgba(255,255,255,0.5)50%, rgba(255,255,255,0)100%) no-repeat -270px 0, url(/logo.png) no-repeat;
            transition: 1s ease;
        }

.mylogo:hover {

	background-position: 200px 0, 0 0;
}

这里需要注意的是,默认负坐标一定要超过logo本体的宽度,否则位移就不够充分,效果是下面这样的:

看起来还不错,这里transition的属性设置在logo本体的伪类上面,此时如果logo本体失去鼠标的焦点,光斑位置又会回到原来的负坐标,此时光影又会在回闪一次,也就是一次悬停发生两次位移,闪烁两次,如果只想闪一次,可以将transition加载hover伪类中,这样离开后不会二次位移,因为动画效果只会出现在鼠标悬停上,鼠标离开后,就没有动画回闪了:

.mylogo{
            width: 255px;
            height: 200px;
            /*直接使用background缩放版本*/
            /*每个渐变点的位置不能太小,不然会出现残缺光斑*/
            /*no-repeat -270px 0:将光斑定位隐藏起来*/
            background: -webkit-linear-gradient(left, rgba(255,255,255,0)0, rgba(255,255,255,0.5)50%, rgba(255,255,255,0)100%) no-repeat -270px 0, url(/logo.png) no-repeat;
           /* transition: 1s ease;  */
        }

.mylogo:hover{
	/*鼠标滑过实现光斑滑动,但是在多背景情况下,需要多个background-position属性值,否则会影响其他背景*/
	background-position: 200px 0, 0 0;
	transition: 1s ease;
}

效果是这样的:

但是这就结束了吗?还没有,因为这看起来似乎。。。有点一律千篇?

如果所有人都用linear-gradient,就难免有点无趣了,那么有没有别的不落窠臼的玩儿法呢?

既然晓得了原理,无非就是位移产生的小把戏,那么我们完全脱离linear-gradient,使用一张带光泽质感的背景图片shine.png:

由于使用了背景图,所以我们需要对代码进行修改,为实体的背景图添加一个容器,span标签:

<a href="/" class="mylogo" title="刘悦的技术博客"><span></span></a>

样式和linear-gradient差不多,也是利用负坐标将span标签内的背景图隐藏起来:

.mylogo span {
	display: block;
	background: url("/shine.png") -360px -380px no-repeat;	

	transition-property: all;
	transition-duration: .7s;

	height: 200px;
	width: 255px;
}

接下来要比linear-gradient要简单地多,直接设置悬停属性,让背景图片发生位移:

.mylogo:hover span {
	background-position: 100px 300px;
}

效果是这样的:

如果仔细观察,会发现背景图更加契合光影掠过的效果,因为linear-gradient每个渐变点在不同分辨率的屏幕下并不统一,也就是说在高分辨下会出现残缺光斑。

暗黑模式下的效果是这样的:

看起来似乎更加有质感一点,除此之外,也许你还想利用transition玩一些更加刺激的效果:

.mylogo:hover {
            -webkit-transform: rotate(666turn);
			transform: rotate(666turn);
			transition-delay: 1s;
			transition-property: all;
			transition-duration: 59s;
			transition-timing-function: cubic-bezier(.34, 0, .84, 1)
}

让我们旋转、跳跃、闭着眼:


结语:两套方案都可以很好的实现光影特效,区别在于linear-gradient并不会消耗网站的带宽,但会消耗电脑的CPU和内存,而与背景渐变相比,背景图像效果会更好一点,但是将会更多地使用网络带宽,而webp技术又可以帮助我们对图片进行极致的压缩(参见:https://v3u.cn/a_id_190),所以我们可以理解这是一种权衡,毕竟,书本上写的是道理,但是现实中讲究的是取舍,不是吗?