一个有意思的图片鼠标切换

news2024/11/15 17:02:48

做淘宝活动页面的时候,用到最多的就是锚点,一个图片标签,然后不断地在上面画热区。不过我想问的是有多少人研究过,用矩形画热点,四个坐标值各自表示的含义,还有它和background-position有什么相同或相似的地方吗?

我们都知道 map 的代码大概是这样的:

 <area shape="rect" coords="17,66,243,355" href="#" />

这四个坐标值,前两个值分别表示左上角的点相对图片的坐标点,简单可以理解成background-position,后两个值分别表示右下角的点相对图片的坐标点。小张画了一个简单的图,大家可以理解下。

在这里插入图片描述

画的比较丑,请大家见谅。图中的黑框区域是一张图片,红框表示画的热区。coords 的数值从左往右分别表示 A1,B1,A2,B2 的长度。根据这四个值,我们可以求出这个热区的长度是 A2-A1,高度是 B2-B1。OK,那让我来分析这样一个效果,照理先贴代码:

<!DOCTYPE
 HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
    <meta http-equiv="Content-Type" 
content="text/html;charset=UTF-8">
    <title>图片切换</title>
    <style type="text/css">
        
html,body,div,h1,h2,h3,h4,h5,h6,ul,ol,dl,li,dt,dd,p,blockquote,pre,form,fieldset,table,th,td{margin:0;padding:0;}

        .wq_page{ width:100%; font:normal 12px/1.5 Arial, Helvetica, 
sans-serif; overflow:hidden; zoom:1; background:#000}
        .wq_page img{ vertical-align:top;border: none;}
        .wq_tab{ width:990px; margin:0px auto; overflow:hidden; 
display:block;}
        .tab_left{ width:370px; height:860px; float:left;}
        .tab3 .tab_left{ 
background:url(http://img03.taobaocdn.com/tps/i3/T17kWGXcdvXXXXXXXX-370-860.jpg)
 no-repeat;}
        .tab_right{ width:620px; height:860px; float:left; 
overflow:hidden;}
        .tab_right{ position:relative;}
        .tab_right .tab_on{ display:none; position:absolute; 
overflow:hidden; background:#191919;}
        .tab_on span{ display:block; position:absolute; width:100%; 
height:100%;}
        .tab3 .tab_on span{ 
background-image:url(http://img04.taobaocdn.com/tps/i4/T1wMWIXkVcXXXXXXXX-620-860.jpg);
 background-repeat:no-repeat;}
        .tab_on em{ display:block; width:100%; height:100%; 
margin-left:100%;}
        .tab3 .tab_on em{ 
background-image:url(http://img01.taobaocdn.com/tps/i1/T1sgGIXX8dXXXXXXXX-620-860.jpg);
 background-repeat:no-repeat;}
    </style>
</head>
<body>
<div class="wq_page" id="wq_page">
    <div class="wq_tab tab3" id="tab1">
        <div class="tab_left"></div>
        <div class="tab_right"><img 
src="http://img01.taobaocdn.com/tps/i1/T1sgGIXX8dXXXXXXXX-620-860.jpg" 
alt=""
                                    usemap="#Maptab3"/>
            <map name="Maptab3" id="Maptab3">
                <area shape="rect" coords="408,651,613,860"
                      
href="http://www.taobao.com/go/act/new/binfenshengdan10.php"/>
                <area shape="rect" coords="408,446,613,651"
                      
href="http://www.taobao.com/go/act/new/binfenshengdan2.php"/>
                <area shape="rect" coords="408,223,613,446"
                      
href="http://www.taobao.com/go/act/new/binfenshengdan5.php"/>
                <area shape="rect" coords="408,8,613,224" 
href="http://www.taobao.com/go/act/new/binfenshengdan6.php"/>
                <area shape="rect" coords="204,8,409,276" 
href="http://lelo2.xin.taobao.com/"/>
                <area shape="rect" coords="204,276,409,437" 
href="http://mayday.xin.taobao.com/"/>
                <area shape="rect" coords="204,437,409,704"
                      
href="http://www.taobao.com/go/act/new/binfenshengdan4.php"/>
                <area shape="rect" coords="204,704,409,860" 
href="http://adidas.xin.taobao.com/"/>
                <area shape="rect" coords="0,734,205,860" 
href="http://www.taobao.com/go/act/new/binfenshengdan7.php"/>
                <area shape="rect" coords="0,486,205,733" 
href="http://www.taobao.com/go/act/new/binfenshengdan1.php"/>
                <area shape="rect" coords="0,176,205,486" 
href="http://www.taobao.com/go/act/new/binfenshengdan9.php"/>
                <area shape="rect" coords="0,6,205,175" 
href="http://vivian.xin.taobao.com/"/>
            </map>
        </div>
    </div>
</div>
<script type="text/javascript">
    function getTag(id, tag) {
        if (tag) {
            return 
document.getElementById(id).getElementsByTagName(tag);
        }
        else {
            return document.getElementById(id);
        }
    }
    //校验根据area取到的元素的父节点的name是否匹配正则
    function getChild(tags, re) {
        var tag = [];
        for (var i = 0,j = 0; i < tags.length; i++) {
            if (tags[i].parentNode.name.match(re)) {
                tag[j] = tags[i];
                j++;
            }
        }
        return tag;
    }
    (function() {
        var subarea = getChild(getTag("wq_page", "area"), /( 
|^)(Maptab)(\d)( |$)/);
        var coords;
        function autoMove(tag, flag) {
            tag.style.marginLeft = (parseInt(tag.style.marginLeft) + 
flag) + '%';
            var time = setTimeout(function() {
                autoMove(tag, flag)
            }, 20)
            if (parseInt(tag.style.marginLeft) * flag >= 0) {
                clearTimeout(time);
                autoborder(tag, -1);
            }
        }
        function autoborder(tag, flag) {
            tag.style.top = (parseInt(tag.style.top) + flag) + 'px';
            tag.style.left = (parseInt(tag.style.left) + flag) + 'px';
            var t1 = setTimeout(function() {
                autoborder(tag, flag)
            }, 20)
            if (parseInt(tag.style.top) * flag >= 0) 
clearTimeout(t1);
        }
        function stopCount() {
            if (t)clearTimeout(t)
        }
        for (var i = 0; i < subarea.length; i++) {
            (function(i) {
                subarea[i].onmouseover = function() {
                    var tab_on = document.getElementById("tab_on");
                    if (tab_on) {
                        tab_on.parentNode.removeChild(tab_on);
                    }
                    var _div = document.createElement("div");
                    _div.className = 'tab_on';
                    _div.id = 'tab_on';
                    _div.innerHTML = '<a href="#" 
target="_blank"><span><em></em></span></a>';

                    subarea[i].parentNode.parentNode.appendChild(_div);
                    var _span = _div.getElementsByTagName("span")[0],
                            _em = _span.getElementsByTagName("em")[0],
                            _a = _div.getElementsByTagName("a")[0];
                    coords = 
subarea[i].getAttribute('coords').split(",");
                    var _h = coords[3] - coords[1];//高度
                    var _w = coords[2] - coords[0];//宽度
                    _a.setAttribute('href', 
subarea[i].getAttribute('href'));
                    _div.style.display = "block";
                    _div.style.left = coords[0] + "px";
                    _div.style.top = coords[1] + "px";
                    _div.style.width = _w + "px";
                    _div.style.height = _h + "px";
                    _span.style.top = "8px";
                    _span.style.left = "8px";
                    _span.style.marginLeft = "-100%";
                    _span.style.backgroundPosition = "-" + coords[0] + 
"px -" + coords[1] + "px";
                    _em.style.backgroundPosition = "-" + coords[0] + "px
 -" + coords[1] + "px";
                    autoMove(_span, 10)
                }
            })(i);
        }
    })();
</script>
</div>
</body>
</html>

还是简单说一下代码:先去取 area 元素,通过ID把所有的 area 元素取到,再通过正则表达式,把符合条件的给筛选出来(这里是判断它的父级元素即 map 标签的 name,因为考虑到一个页面中也许会有多个 map)。遍历 area 元素,给它加上鼠标移入事件。

图片切换,必然是新建一个层,覆盖掉原先的图片层,所以在移入事件中,如果层存在,即删除掉,创建一个层出来(这一步个人觉得处理的不是太好,如果 层存在,也可以不用删除层,当然也不需要再创建层出来,即可对当前层做修改即可,这个大家可以对代码做优化,小张就不做处理了),宽度和高度是热区的宽度 和高度。这里的创建的层的innerHTML还是有必要讲一下的:

<a href="#" target="_blank"><span><em></em></span></a>

span 值是用新图片的 background 来做定位,他一开始的位置出现在相对父级 -100% 的位置,因为要做运动,em 标签是用来存放老图片的 background 来做定位。假如去掉 em,即开始做运动时,那一块底是黑色背景的,css 代码在这里:

.tab_right .tab_on{ 
	display:none; position:absolute; overflow:hidden; background:#191919;
}

整个运动还有上下的运动,所以一开始可以给topleft设定一个值,然后在运动中慢慢地让他们的值回归到0。

再来分析下autoMove,它先将 span 的 margin-left 值慢慢地拉回 0,因为一开始的值为 -100%,每次 +10,是加10个百分 点,当值变成0时,停止运动,开启一个新的运动(如果不开启,那么此时的spanlefttop值为8),就是将left值和top值重新回归到0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb:RequestResponse的概述

1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。 这两个对象在我们使用Servlet的时候有看到&#xff1a; 此时&#xff0c;我们就需要思考一个问题request和response这两个参数的作用是什么&#xff1f; request&#xff1a;获取请…

RapidUp: Multi-Domain Permutation Protocol for Lookup Tables学习笔记

1. 引言 前序博客有&#xff1a; PLOOKUPPLOOKUP代码解析Efficient polynomial commitment schemes for multiple points and polynomials学习笔记PLONK PLOOKUPPlonKup: Reconciling PlonK with plookupPLONK: permutations over lagrange-bases for oecumenical nonintera…

2022年就要过去了,我的这份成绩单请您查收……

喜迎元旦岁月不居&#xff0c;时节如流年关交迭在即在2022行将尾声的此时想静静地坐下片刻和关注了云和恩墨这么久的老朋友们细数一遍这光阴里的纷纷呈呈这一年&#xff0c;充满了挑战与艰辛但所有努力和守望终有结果收成这一年&#xff0c;我们全心投入产品研发收获了更多的荣…

【隔离器使用说明】光隔、磁隔、容隔三兄弟介绍

文章目录前言一、三种常用隔离技术1. 光隔离2. 变压器隔离/磁隔3. 电容隔离二、隔离器重要指标1. 隔离电压值2. 爬电距离3. 共模瞬变抗扰度CMTI三、隔离器性能对比总结前言 本文简单介绍常用隔离器的类型和特点&#xff0c;是根据网络知识整理出来的 有错误的话请一定评论留言…

谈谈SpringBoot

1. Spring Boot 简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 2. HelloWorld 功能&#xff1a;浏览器发送hello请求&#xff0c;服务器接受请求并处理&#xff0c;响应Hello World字符串&a…

UE5笔记【十五】漂流者游戏制作【二】雕刻一个峡谷+增加水体

雕刻峡谷 我们希望角色从一个峡谷中开始。 用上一节中&#xff0c;我们配置的Auto图层&#xff0c;雕刻两条山脉&#xff0c;从而雕刻出一条峡谷。然后切换到选择模式下。我们找到PlayStart&#xff0c;然后将其移动到峡谷中&#xff0c; 然后按F切换到角色位置&#xff0c;调…

【C++基础】09:STL(一)

STL&#xff08;一&#xff09; OVERVIEWSTL&#xff08;一&#xff09;一、STL初识1.STL六大组件&#xff1a;2.容器&迭代器&#xff1a;二、STLGroup11.string容器&#xff1a;&#xff08;1&#xff09;基本概念&#xff1a;&#xff08;2&#xff09;string构造函数&am…

前端性能优化(三):代码优化

目录 一&#xff1a;JS开销以及如何缩短解析时间 二&#xff1a;配合V8有效优化代码 2.1.抽象语法树 2.2.V8优化机制 三&#xff1a;函数优化 四&#xff1a;对象优化 4.1.以相同顺序初始化对象成员&#xff0c;避免隐藏类的调整 4.2.实例化后避免添加新属性 4.3.尽量…

数学建模经验分享

今天给大家分享一期关于数学建模比赛的经验分享&#xff0c;我将从以下三个方面展开说明&#xff1a; &#xff08;1&#xff09;如何准备数学建模比赛&#xff1f; &#xff08;2&#xff09;如何选择合适的赛题进行建模&#xff1f; &#xff08;3&#xff09;如何提高获奖…

辉哥带你学hive第三讲

文章目录 1.函数1.1系统内置函数1.2 单行函数1.2.1 算术运算函数1.2.2字符串函数1.2.3 日期函数1.2.4 流程控制函数1.2.5集合函数1.3高级聚合函数1.函数 1.1系统内置函数 1)查看系统自带的函数 hive> show functions; 2)显示自带的函数的用法 hive> desc function up…

机器学习HW10对抗性攻击

机器学习HW10对抗性攻击一、任务描述二、算法1、FGSM2、I-FGSM3、MI-FGSM4、多种输入&#xff08;DIM&#xff09;评估指标三、实验1、Simple Baseline2、Medium Baseline3、Strong Baseline4、Boss Baseline一、任务描述 我们使用pytorchcv来获得CIFAR-10预训练模型&#xff…

STP基础

名词&#xff1a; STP&#xff08;Spanning Tree Protocol&#xff09;生成树协议&#xff1a;运行STP协议的设备通过彼此交互信息发现网络中的环路&#xff0c;并有选择地对某个接口进行阻塞&#xff0c;最终将有环路的网络结构修剪成无环路的树形结构&#xff0c;从而防止报…

ENVI_IDL:对于书写和创建GEOTIFF结构体?

大家在使用WRITE_TIFF函数和READ_TIFF函数的时候&#xff0c;应该遇见过GEOTIFF参数。 但是我对于这个参数却是了解不深&#xff0c;趁着这次学习梳理一下GEOTIFF参数. 在学习之前&#xff0c;我发现IDL教程并没有提供关于GEOTIFF的示例&#xff0c;所以我尝试使用READ_TIFF函…

[Kettle] CSV文件输入

CSV(Comma-Separated Values)文件是以字符(大多数使用逗号,)分隔值&#xff0c;以纯文本形式存储数据的文件 数据源 语文成绩(kettle数据集1).csv https://download.csdn.net/download/Hudas/87356192?spm1001.2014.3001.5501 1.建立【CSV文件输入】转换工程 使用Ctrl N快…

如何将PDF转换为Excel?免费PDF转Excel方法分享

如何免费将PDF转换为Excel 像将文件转换为电子表格这样简单的事情应该不会那么困难。PDF已成为共享文档的标准格式&#xff0c;那么当您需要将PDF作为电子表格时&#xff0c;如何将PDF转换为Excel&#xff1f; 一些网站可以免费将PDF转换为Excel&#xff0c;尽管涉及一些联系…

力扣sql入门篇(五)

力扣sql入门篇(五) 1 组合两个表 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT firstname,lastname,IFNULL(city,null) city,IFNULL(state,null) state FROM Person p LEFT JOIN Address a ON p.personida.personid;1.3 运行截图 2 进店却未…

网络原理3 IP地址

网络原理3 IP地址 文章目录网络原理3 IP地址IP协议的报文格式IP地址的具体规则IP地址的组成子网掩码特殊的IP地址IP地址短缺的解决方法动态分配IP地址NAT机制[主流机制]IPv6路由选择网络层中主要做的事情是在两点之间规划出一个合理的路径&#xff0c;同时也要对主机所处的位置…

CleanMyMac X免费吗?怎么下载2023最新版

CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化Mac系统&#xff01;…

哈希问题详解

什么是哈希表 在引入哈希表之前&#xff0c;先谈一下为什么要了解哈希表。在学习Set集合时&#xff0c;发现Set集合可以实现无序存储&#xff0c;那么Set是如何实现的无序存储&#xff1f; 打开源码会发现Set集合的底层实际上是由一个map集合实现的。那么什么是哈希表呢&…

【人工智能原理自学】一元一次函数感知器:如何描述直觉

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 &#x1f514;本文讲解一元一次函数感知器&#xff1a;如何描述直觉&#xff0c;一起卷起来叭&#xff01; 目录…