原生js实现网页淘宝产品展示效果,鼠标移入小图展示对应大图(事件委托、事件传播、冒泡机制)【含完整代码】

这篇具有很好参考价值的文章主要介绍了原生js实现网页淘宝产品展示效果,鼠标移入小图展示对应大图(事件委托、事件传播、冒泡机制)【含完整代码】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原生js实现淘宝网页的产品展示框效果

淘宝网页产品展示模块如下:
当鼠标移入小图,在上方会相应地展示大图
js图片点击小图显示大图,Javascript实现网站常见动画,javascript,计算机外设,前端

实现效果

当鼠标移入小图,在上方会相应地展示大图;且当鼠标移出,图片停留在移入时显示的图片,不会改变。
本文实现效果如下(鼠标移入即改变,不用点击):
js图片点击小图显示大图,Javascript实现网站常见动画,javascript,计算机外设,前端

实现思路

定义图片列表,为列表添加鼠标移入事件onmouseover(注意:此处不能使用onmouseenter,因为此方法不支持冒泡机制),当鼠标移入列表,判断移入的是具体哪张图,把这张图渲染到大图上。
此例子利用了事件委托,即批量添加事件监听。

如果给每一张小图都添加一个鼠标移入事件,会造成代码的重复冗余,因为每一张图片的鼠标移入事件都是一样的,还会造成内存浪费。因此,我们给这些图片的父元素添加一个鼠标移入事件,通过e.target获取具体触发事件的元素

批量添加事件监听(事件委托原理)

当需要给每个子元素添加事件监听时,可以委托给父元素添加事件监听,然后通过e.target( )获取具体被点击的子元素。

原理:事件传播(冒泡)机制

什么是事件传播

当嵌套元素的最内元素被点击,实际上嵌套元素的最外层也被点击了

事件的传播是:先从外到内(捕获阶段),然后再从内到外(冒泡阶段)
举例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #big{width: 300px;height: 300px;background-color: cornflowerblue;}
        #small{width: 200px;height: 200px;background-color: coral;}
    </style>
</head>
<body>
    <div id="big">
        <div id="small">这是小方块</div>
        这是大方块
    </div>
</body>
<script>
    var small = document.getElementById("small");
    var big = document.getElementById("big");
    // 子元素点击事件
    small.onclick = function(){
        console.log("您点击了小方块");
    }
    // 父元素点击事件
    big.onclick=function(){
        console.log("您点击了大方块");
    }
</script>
</html>

我们分别定义了大小方块自己的点击事件,然后点击了小方块,却同时触发了大方块的点击事件,这就是事件传播,也叫冒泡(由内到外触发)。
js图片点击小图显示大图,Javascript实现网站常见动画,javascript,计算机外设,前端

e.target 事件源元素

e.target:最早触发事件的元素,具体触发的事件的元素

    <ul>
        <li>列表项一</li>
        <li>列表项二</li>
    </ul>
    
    <script>
        var ul = document.querySelector('ul');
        //给父元素添加点击事件
        ul.onclick = function(e){
            // 输出被点击的源元素,即如果点击的是li,则会输出li
            console.log(e.target); 
        }
    </script>
e.currentTarget 事件委托元素

e.currentTarget:添加了事件的父元素

    <ul>
        <li>列表项一</li>
        <li>列表项二</li>
    </ul>
    
    <script>
        var ul = document.querySelector('ul');
        //给ul添加点击事件,则e.currentTarget == ul
        ul.onclick = function(e){
            // 若点击的源元素不是ul
            if(e.target !== e.currentTarget){
                console.log(e.target); // 输出被点击的li列表项
            }    
        }
    </script>

使用事件委的注意事项
1、不能委托不冒泡的事件给父元素
因为事件委托利用了冒泡机制,不冒泡的事件不能用事件委托。
如:onmouseenter不冒泡,onmouseover冒泡。
2、只能有一层嵌套关系文章来源地址https://www.toymoban.com/news/detail-725095.html

 <!--下面的两层嵌套,当给ul添加点击事件,若点击的是span,则e.target只能获取span,无法对li做处理-->
     <ul>
         <li><span>1</span></li>
         <li><span>2</span></li>
     </ul>

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>淘宝商品展示图</title>
    <style type="text/css">
        * {
            padding: 0;
            margin: 0;
        }
        body {
            text-align: center;
        }
        body > img:nth-child(1) {
            border-radius: 15px;
            padding: 5px;
            border: 5px solid orange;
        }
        #bigImg{
            width: 500px;
        }
        .smallImg{
            width: 100px;
        }
        ul {
            list-style: none;
            display: inline-block;
        }
        ul li {
            float: left;
            width: 100px;
            height: 100px;
            margin: 5px;
            border: 1px solid rgb(121, 120, 120);
            border-radius: 5px;
        }
        ul li.active {
            border: 2px solid orange;
            border-radius: 5px;
        }
    </style>
</head>

<body>
    <!-- 大图,默认展示第一张 -->
    <img src="徽章/1.webp" id="bigImg" />
		<br />
		<br />
        <!-- 小图列表 -->
		<ul>
			<li class="active">
				<a href="">
					<img src="徽章/1.webp" width="50" class="smallImg" />
				</a>
			</li>
			<li >
				<a href="">
					<img src="徽章/2.webp" width="50" class="smallImg" />
				</a>
			</li>
			<li>
				<a href="">
					<img src="徽章/3.webp" width="50" class="smallImg" />
				</a>
			</li>
			<li>
				<a href="">
					<img src="徽章/4.webp" width="50" class="smallImg" />
				</a>
			</li>
			<li>
				<a href="">
					<img src="徽章/5.webp" width="50" class="smallImg" />
				</a>
			</li>
		</ul>
</body>
<script>
    // 获取列表元素
    var ul = document.querySelector("ul");
    // 获取列表下的列表项数组
    var liArr = document.querySelectorAll("ul>li");
    // 获取大图的dom元素
    var bigImg = document.getElementById("bigImg");

    // 给列表,即父级元素添加鼠标移入事件,onmouseover支持冒泡
    ul.onmouseover = function(e){
        // 如果鼠标移入的元素不是父元素,而是具体的子元素
        if(e.target != e.currentTarget){
            // 遍历所有li
            for(var i = 0 ; i < liArr.length; i++){
                // 如果e.target 等于 li或li的子节点,设li的class为active,并且更改图片地址
                if(e.target == liArr[i] || e.target == liArr[i].children[0] || e.target == liArr[i].children[0].children[0]){
                    liArr[i].className = "active";
                    // 更改对应的图片地址
                    bigImg.src = liArr[i].children[0].children[0].getAttribute("src");
                }else{
                    // 不是移入的节点,去掉active效果
                    liArr[i].className = "";
                }
            }
        }
    }

</script>
</html>

到了这里,关于原生js实现网页淘宝产品展示效果,鼠标移入小图展示对应大图(事件委托、事件传播、冒泡机制)【含完整代码】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 隧道施工工艺流程vr线上虚拟展示成为产品3D说明书

    行业内都知道,汽车生产的大部分都需要冲压加工来完成,因此汽车冲压工艺是汽车制造过程中的重要环节,传统的展示方式往往局限于二维图纸和实地操作,难以充分展现工艺的细节和流程。然而,随着技术的进步,汽车冲压工艺3D可视化展示正逐渐崭露头角,突破了传统

    2024年02月04日
    浏览(35)
  • Three.js--》实现图片转3D效果展示

    目录 项目搭建 初始化three.js基础代码 加载图片纹理 设置着色器 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借助框架书写three项目,借用vite构建工具搭建vue项目

    2024年02月08日
    浏览(38)
  • Three.js--》实现3D汽车展厅效果展示

    目录 项目搭建 初始化three.js基础代码 加载汽车模型 设置展厅效果 设置GUI面板动态控制车身操作 车门操作与车身视角展示 设置手动点击打开关闭车门 设置图片背景 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起

    2024年02月09日
    浏览(39)
  • 原生js实现拖拽效果

    2024年01月16日
    浏览(29)
  • 【JavaScript】原生js实现省市区联动效果

    😉博主:初映CY的前说(前端领域) ,📒本文核心:用原生js实现省市区联动 【前言】今日在复习省市县三级联动的时候,有点忘了原生的js应该怎么样处理省市县的联动,特此写下来再次复习下 1.获取相对应的DOM对象 2.写省市县接口获取到接口信息 3.写下change事件,有变化时调

    2023年04月24日
    浏览(39)
  • 原生js实现复选框(全选/全不选/反选)效果【含完整代码】

    1、勾选后,可以获取到所勾选的值组成的数组,并展示到页面; 2、全部勾选,以及取消勾选时,要相应地更新全选框的状态及文字显示; 3、点击反选,将所有选项的选择状态置换,并相应改变全选框的状态; 定义一个数组 checkValues ,存放用户所勾选的内容。 再定义一个

    2023年04月13日
    浏览(35)
  • uniapp - 实现手机端H5网页直播功能效果,拿到后端推流地址或播放资源后进行前端的流畅播放和画面展示功能,uniapp实时推流/拉流直播系统详细教程(提供完整示例代码,一键复制开箱即用!)

    在uniapp h5手机端网页开发中,详细实现前端直播推流功能,获取服务端推流地址进行推送及实时画面流畅显示效果,uniapp手机网页H5端平台做一个直播实时播放系统教程,提供详细示例源码及详细步骤(稳定流畅)。 直接按照步骤复制代码,然后稍微改下就能用了。 首先,我

    2024年02月03日
    浏览(44)
  • three.js加载3D模型,在网页上展示3D模型(.glb.gltf.fbx格式)

    Three.js是一款开源的主流3D绘图JS引擎,简单点,可以将它理解为three+js就可以了,three表示3D,js表示JavaScript的意思。 结构  .glb.gltf文件最好放在服务器上 放在本地容易报找不到的错 .fbx格式文件可以在本地用3d看图(win10自带)打开另存为.glb格式 index.html代码 js代码 项目案例

    2024年02月11日
    浏览(37)
  • Vue2 - 延迟加载(requestAnimationFrame实现)+ 效果展示

    当一个页面需要加载较多个组件时,并且组件自身又比较复杂。如果一次性加载,可能等待时间较长,体验不好。 一种解决办法:分批次的来渲染子组件。 通过 requestAnimationFrame(callback) 实现,同时能够控制 按照指定顺序来渲染 。 简单理解为:浏览器会按照一定的频率来重

    2024年01月25日
    浏览(28)
  • JavaScript、Vue实现大数据大屏展示3D旋转动画效果

    最近在写一些数据大屏的时候客户需要做个3D旋转动效的效果,简单整理之后写了一个小demo做下记录,先看一下效果: 当点击next的时候,整个模块旋转切换到下个菜单,点击prev的时候也可以切换到上一个菜单效果。 首先我们先构建一个大体的dom结构,如下: 编写基本的css样

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包