10.4 Excel方式二维变色提示的表格


在10.3节中,整行变色提求鼠标指针经过的效果已经完成了,接下来继续改进它。实现类似于Excel的行列的二维提示,效果如图1所示,当鼠标指针经过某一个单元格时。相应的列头和行头单元格会同时变色。

实例文件位于网页学习网CSS教程资源的“第10章\02\pretty-3.htm”。


图1 表格的行列二维变色提示

注意:本案例需要不少JavaScript编程的配合,如果读者缺乏相应基础,学起来可能会有一点困难。

一、改造CSS代码

首先改造CSS设置,这个效果单纯使用CSS是无法实现的,必须要使用javaScript来实现,因此“tr:hover”选择器就可以删除了。

还应该将“tr.hover”改成“td.hover”,因为我们的目标是使鼠标指针经过的单元格,以及该单元格所在的行和列的第1个单元格的背景变色,而不是整行变色。把变色的对象设置为单元格,将下面的代码:lodidance.com

折叠展开CSS 代码复制内容到剪贴板

  1. tr:hover,
  2. tr.hover{
  3. background-color: #595;
  4. color:#fff;
  5. }

改为:

折叠展开CSS 代码复制内容到剪贴板

  1. td.hover{
  2. background-color: #595;
  3. color:#fff;
  4. }

二、改造JavaScript代码

接下来改造JavaScript代码。首先将下面这行代码中的“tr”修改为“td”,也就是从DOM树中提取出所有的td节点。

折叠展开JavaScript 代码复制内容到剪贴板

  1. var rows = document.getElementsByTagName(‘td‘);

这时效果可以想象出来,就是当鼠标指针经过某个单元格时,该单元格变色。

注意:为了养成良好的习惯,变量名称应该符合它的实际含义,因此将原来的rows变量改名为cells,row的中文意思是行,cell的中文意思是单元格。

如何使所在行和列的第1个单元格也变色呢?如果能够知道当前鼠标指针经过的行和列的编号(或者叫“坐标”).就可以计算出相应两个单元格的编号。在cells数组中存放着所有的单元格,因此可以尝试如下的代码:

折叠展开JavaScript 代码复制内容到剪贴板

  1. var cells = document.getElementsByTagName(‘td‘);
  2. for (var i=0;i<cells.length;i++){
  3. cells[i].onmouseover = function(){      //鼠标指针在行上面的时候
  4. cells[i].className = ‘hover‘;
  5. }
  6. cells[i].onmouseout = function(){       //鼠标指针离开时
  7. this.className = ‘‘;
  8. }
  9. }

在这段代码中,我们仅把第4行中的“this”换成了“cells[i]”。前面说过,“this”就代表该节点本身,这里直接用效组元素来表示,那么由该元素的编号就可以推算出其他元素的编号了。经过试验会发现,这样替换以后,鼠标指针经过时就不会有变色的效果了。

分析:这个问题出在哪里了呢?这需要对这段程序深入地理解。请读者思考,这段程序是在什么时候运行的?是在鼠标指针经过时,还是在页面装载时?

正确答案是后者,而且这段代码只执行一次。这样就拽到原因了,当鼠标指针最过莱单元格时,所运行的仅是修改className这一个操作,而此时代码中的循环早已结束,因此i变量的值应该等于所有单元格的总数,例如这里一共25个单元格,i应该等于25,而JavaScript中数组的元素编号从0开始,最后一个单元格的编号是24,cell[25]根本就不在,因此没有单元格变色就不奇怪了。

为了验证上面的分析,现在把第4行代码:

折叠展开JavaScript 代码复制内容到剪贴板

  1. cells[i].className = ‘hover‘;

改为:

折叠展开JavaScript 代码复制内容到剪贴板

  1. cells[i-1].className = ‘hover‘;

请读者猜一猜运行的结果是什么?答案是,无论鼠标指针进入哪个单元格,表格最右下角的一个单元格都会变色,这就证明了i-1恰好等于24。

有了上面的基础.我们就找到r解决的方法。修改完成后的JavaScript代码如下。

折叠展开JavaScript 代码复制内容到剪贴板

  1. var cells = document.getElementsByTagName(‘td‘);
  2. for (var i=0;i<cells.length;i++){
  3. cells[i].onmouseover = function(){      //鼠标指针在行上面的时候
  4. this.className = ‘hover‘;
  5. for (var j=0;j<cells.length;j++)
  6. if(cells[j]==this){
  7. cells[j%5].className =‘hover‘;
  8. cells[j-j%5].className =‘hover‘;
  9. }
  10. }
  11. cells[i].onmouseout = function(){       //鼠标指针离开时
  12. this.className = ‘‘;
  13. for (var j=0;j<cells.length;j++)
  14. if(cells[j]==this){
  15. cells[j%5].className =‘‘;
  16. cells[j-j%5].className =‘‘;
  17. }
  18. }
  19. }

代码中,在鼠标指针进入部分增加了5行代码(第6—1O行)。其运行过程是首先要获得当前单元格的编号,方法是在cells数组中,从O号元素开始查找。如果某个元素等于“this”,它就是当前鼠标指针经过的单元格,此时循环变量记录的就是它的编号。“j % 5”的含义是取得对j除以5后的余数,也就是该列的第一个单元格编号,同理“j - j % 5”就是该行第一个单元格的编号。接下来就都是前面介绍过的内容了。

这时在浏览器中可以看到正确的效果,如图1所示。lodidance.com

本实例巧妙地采用JavaScript读取鼠标指针的状态,从而改变相应的3个单元格的CSS属性,来实现背景颜色的动态变化,

当然,这个例子还很简单。例如本案例为了简化,把所有单元格都用td来定义。如果保留th等标记,本例就需要进行一定的修改了。如果读者有兴趣,可以进一步深入学习JavaScript和DOM编程,这些效果都是可以实现的。利用JavaScript和DOM,可以完全使用编程的方式动态地产生和改变页面中的所有元素,因此任何能用HTML和CSS产生的内容,用编程的方式都能做到。

注意:使用JavaScript以后,或多或少稚会影响网页的效率。当然仅做一些少量的运算不会对访问的效果造成任何影响,但是不要过分依赖JavaScript,凡事都是适度最好。

点击下载第8~17章CSS教程资源 返回《CSS教程布局之道》教程列表

编辑:网页学习网
本文地址:http://www.lodidance.com/css/jc/736.html

10.4 Excel方式二维变色提示的表格

时间: 2024-10-11 16:41:02

10.4 Excel方式二维变色提示的表格的相关文章

如何实现 Excel方式二维变色提示的 m*n 表格

此代码当m≠n 时,有问题.暂时还未解决此问题. 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 &

10.3 鼠标指针经过时整行变色提示的表格

近年来,Web 2.0的概念逐渐被广泛接受,其中很重要的一点是强调改善用户体验,例如上一节的例子中,把表格设置为交替背景色,可以使访问者在浏览表格时有更好的体验. 然而对于长时间审核大量数据和浏览表格的用户来说,即使是隔行变色的表格,长时间阅读这样的表格仍然会感到疲劳.而且对于数据壁很大的表格,特别容易看错行或者列.如果参考微软公司Excel软件的做法,我们就可以发现很多可以改进的地方. 例如,在一个行列都很多的表格中,如果能像在Excel中那样,随时以高亮的方式提示一个单元格对应的行号(或行的

19.把1~100存到二维数组a[10][10]中,并按二维矩阵形式输出

#include<iostream>using namespace std; int main(){    int a[10][10];    for(int i=0;i<10;i++)    {        for(int j=0;j<10;j++)        {            a[i][j]=i*10+j+1;//二维数组逻辑上还是一维数组的存储方式        }    }    for(int j=0;j<10;j++)    {        for

2016/1/10 作业 1, 二维数组遍历输出求和 2,转置运算???? 3,九宫格?? 后两个存在问题

1 public class arr1 { 2 3 4 public static void main(String[] args) { 5 // 创建二维数组arr[][],输出二维数组所有元素的和. 6 7 int arr[][]={{1,3,5,7,9},{21,23,25,27,29}, 8 {12,14,16,18},{32,34,36,38}}; 9 int sum=0; 10 System.out.println("二维数组遍历"); 11 // for循环 遍历 求和

Ionic2学习笔记(10):扫描二维码

作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5575843.html 时间:6/11/2016 ? ? 说明: 在本文发表的时候(2016-06-11),Ionic2是beta版本,所有还是会有一些改动比较大的地方: 点击查看 , 比如beta8版本(2016-06-06),相较于前面的版本就有一个特别大的改动的地方: @App and @Page should be replaced with @Component 基于这种情况,大家还是静静

HTML5 微信二维码提示框

这是一个js的小案例,主要效果是显示一个微信二维码的提示框,非常简单实用. 源码如下: JS部分 <script src="js/jquery-1.8.3.min.js"></script> <style> *{padding: 0; margin: 0} .wb-box{ position: fixed; width: 100%; height: 100%; background: rgba(255,255,255,0.8); display: n

2016年10月13日--二维数组、多维数组、推箱子

数组:相同数据类型的元素按照一定的顺序进行排列的 二维数组 int[,] array = new int[3, 2]; int[,] array = new int[3, 4] { { 1, 2, 3, 4 }, { 1, 2, 3, 4 }, { 1, 2, 3, 4 } }; int[,] array = new int[3, 4] {{ 1, 2, 3, 4 }, { 1, 2, 3, 4 }, { 1, 2, 3, 4 } }; [3, 2]   3表示有三个一维数组 [3, 2]   

C#判断用户是否使用微信浏览器,并据此来显示真实内容或二维码

平时我们看一些网页的时候会发现这样的功能:有的页面只能在微信里访问,如果在电脑上访问就只显示当前地址的二维码.这个用C#怎么实现呢?我们结合代码来看看. 首先,我们需要先判断用户使用的是什么浏览器,这需要用到 Request.UserAgent 属性,通过捕捉微信浏览器和普通浏览器的UserAgent会发现它们的区别,下面是几款常用浏览器的UserAgent: 微信浏览器:Mozilla/5.0(Linux;U;Android 4.4.2;zh-cn;2013022 Build/HM201302

参数 存在二维数组

声明函数如下void function(int** p),意图是想参数传递一个二维数组.于是就定义了一个二维数组,比如 int a[1][1],然后调用函数.结果如何?当然是失败了,编译器提示:cannot convert parameter 1 from 'int [1][1]' to 'int **',参数类型不匹配.上述过程我自己也试了,当然不匹配,类型完全不一样嘛.然后我就想了:如果要将一个二维数组作为形参,那么函数该怎么声明? 简单点 数组名作为形参 void func1(int Ar