JQuery实现相邻item焦点移动的示例详解

目录
  • 需求
  • 代码设计
  • 实现代码
  • 设计理念
  • 用处
  • 疑问

需求

需求是A1按上下左右按键是选中相应左最近,右最近,上最近,下最近的元素B

代码设计

①所有元素需要给定一个固定i d,例如 A1 为a c_1

②通过元素的左上角、左下角、右上角、右下角位置来计算距离,上下左右对应计算的角不一样

③先算出水平距离,拿到水平水平距离距离相同或者相差10PX的元素

④图片说明:

实现代码

/* 通过计算两点之间的相对距离,使其跳到最近的一个元素
 * @param {*} el 基准元素  ac_1
 * @param {*} elementsArr 与基准元素做比较的元素数组(类数组)
 * 中心点计算法已经弃用
 */
function toClosest(el,elementsArr) {
    var e = event || window.event || arguments.callee.caller.arguments[0];//获取按下按键对象

    /* @param {*} curLi_x_l 基准元素左边横坐标
     * @param {*} curLi_x_r 基准元素右边横坐标
     * @param {*} curLi_y_t 基准元素上边纵坐标
     * @param {*} curLi_y_b 基准元素下边纵坐标
     * @param {*} curLi_x_c 基准元素中心点横坐标
     * @param {*} curLi_x_c 基准元素中心点纵坐标
     */
    var curLi_x_l = $('#' + el).offset().left
    var curLi_x_r = $('#' + el).offset().left + $('#' + el).width()
    var curLi_y_t = $('#' + el).offset().top
    var curLi_y_b = $('#' + el).offset().top + $('#' + el).height()
    // var curLi_x_c = $('#' + el).offset().left + $('#' + el).width()/2
    // var curLi_y_c = $('#' + el).offset().top + $('#' + el).height()/2

    /* @param {*} positionArr 需比较元素的坐标信息数组*/
    var positionArr = []
    $.each(elementsArr, function (index, item) {
        if ($('#' + el).attr('id') != $(item).attr('id')) {

           /*  @param {*} preOrNext_x_l 基准元素左边横坐标
             * @param {*} preOrNext_x_r 基准元素右边横坐标
             * @param {*} preOrNext_y_t 基准元素上边纵坐标
             * @param {*} preOrNext_y_b 基准元素下边纵坐标
             * @param {*} preOrNext_x_c 基准元素中心点横坐标
             * @param {*} preOrNext_x_c 基准元素中心点纵坐标
           */
            var preOrNext_x_l = $(item).offset().left
            var preOrNext_x_r = $(item).offset().left + $(item).width()
            var preOrNext_y_t = $(item).offset().top
            var preOrNext_y_b = $(item).offset().top + $(item).height()
            // var preOrNext_x_c = $(item).offset().left + $(item).width()/2
            // var preOrNext_y_c = $(item).offset().top + $(item).height()/2

            /* @param {*} element 被遍历元素的坐标信息*/
            var element = {};

          /*  此步会筛选需比较的元素
          	 * @param {*} element.ac_in 比较元素标记
             * @param {*} element.distance 基准元素与比较元素的中心点距离
             * @param {*} element.x 比较元素比较点横坐标
             * @param {*} element.y 比较元素比较点纵坐标
             * @param {*} element.abs_x 比较元素比较点纵坐标与基准元素比较点横距离绝对值
             * @param {*} element.abs_y 比较元素比较点纵坐标与基准元素比较点纵距离绝对值
             * @param {*} element.abs_distance 比较元素比较点与基准元素比较点距离
           */
          	// element.distance = parseInt(Math.pow((curLi_x_c - preOrNext_x_c), 2) + Math.pow((curLi_y_c - preOrNext_y_c), 2))
            //按'向上键'去左下角位置坐标,按'向下键'去左上角位置坐标
            if (e && e.keyCode == 39 && preOrNext_x_l > curLi_x_r) {
                element.ac_in = $(item).attr('id')
                element.x = preOrNext_x_l
                element.y = preOrNext_y_t
                element.abs_y = Math.abs(preOrNext_y_t - curLi_y_t)
                //基准元素右上角和比较元素左上角
                if (curLi_y_t <= preOrNext_y_t) {
                    element.abs_distance = parseInt(Math.pow((curLi_x_r - preOrNext_x_l), 2) + Math.pow((curLi_y_t - preOrNext_y_t), 2))
                }
                element.abs_distance = parseInt(Math.pow((curLi_x_r - preOrNext_x_l), 2) + Math.pow((curLi_y_t - preOrNext_y_t), 2))
                positionArr.push(element)
            } else if (e && e.keyCode == 37 && preOrNext_x_r < curLi_x_l) {
                element.ac_in = $(item).attr('id')
                element.x = preOrNext_x_r
                element.y = preOrNext_y_t
                element.abs_y = Math.abs(preOrNext_y_t - curLi_y_t)
                //基准元素左上角和比较元素右上角
                element.abs_distance = parseInt(Math.pow((curLi_x_l - preOrNext_x_r), 2) + Math.pow((curLi_y_t - preOrNext_y_b), 2))
                positionArr.push(element)
            } else if (e && e.keyCode == 38 && preOrNext_y_b < curLi_y_t) {
                element.ac_in = $(item).attr('id')
                element.x = preOrNext_x_l
                element.preOrNext_x_l = preOrNext_x_l
                element.preOrNext_x_r = preOrNext_x_r
                element.y = preOrNext_y_b
                element.abs_x = Math.abs(preOrNext_x_l - curLi_x_l)
                //基准元素左上角和比较元素左下角
                element.abs_distance = parseInt(Math.pow((curLi_x_l - preOrNext_x_l), 2) + Math.pow((curLi_y_t - preOrNext_y_b), 2))
                positionArr.push(element)
            } else if (e && e.keyCode == 40 && preOrNext_y_t > curLi_y_b) {
                element.ac_in = $(item).attr('id')
                element.x = preOrNext_x_l
                element.y = preOrNext_y_t
                element.preOrNext_x_l = preOrNext_x_l
                element.preOrNext_x_r = preOrNext_x_r
                element.abs_x = Math.abs(preOrNext_x_l - curLi_x_l)
                //基准元素左下角和比较元素左上角
                element.abs_distance = parseInt(Math.pow((curLi_x_l - preOrNext_x_l), 2) + Math.pow((curLi_y_b - preOrNext_y_t), 2))
                positionArr.push(element)
            }
        }
    })

    // if(positionArr){
    //     positionArr = positionArr.sort(function (a, b) {
    //         return a.abs_distance - b.abs_distance
    //     })
    //     if(positionArr.length>0){
    //         ac_in = positionArr[0].ac_in
    //     }else{
    //         ac_in = el
    //     }
    // }

   /* @param {*} same_x_positionArr 横坐标最近元素数组*/
   /* @param {*} same_x_positionArr 纵坐标最近元素数组*/

  	/*
  		寻邻规则:
  		①向右,首先判断横距离,再判断纵距离
  		②向左,首先判断横距离,再判断纵距离
  		③向上,首先判断竖距离,再判断横距离
  		④向下,首先判断竖距离,再判断横距离
  	*/

    if (e && (e.keyCode == 39 || e.keyCode == 37)) {
        positionArr = positionArr.sort(function (a, b) {
            return a.x - b.x
        })
        var same_x_positionArr = []
        if(e.keyCode == 39){
          	if (positionArr.length > 0) {
                for (var i = 0; i < positionArr.length; i++) {
                    if (positionArr[i].x > (positionArr[0].x - 10) && positionArr[i].x < (positionArr[0].x + 10)) {
                        same_x_positionArr.push(positionArr[i])
                    }
                }
            }
        }else if(e.keyCode == 37){
            if (positionArr.length > 0) {
                for (var i = 0; i < positionArr.length; i++) {
                    if (positionArr[i].x > (positionArr[positionArr.length - 1].x - 10) && positionArr[i].x < (positionArr[positionArr.length - 1].x + 10)) {
                        same_x_positionArr.push(positionArr[i])
                    }
                }
            }
        }

        same_x_positionArr = same_x_positionArr.sort(function (a, b) {
            return a.abs_y - b.abs_y
        })
        if (same_x_positionArr.length > 0) {
            ac_in = same_x_positionArr[0].ac_in
        } else {
            ac_in = el
        }
    } else if (e && e.keyCode == 38) {
        positionArr = positionArr.sort(function (a, b) {
            return a.y - b.y
        })
        var same_y_positionArr = []
        if (positionArr.length > 0) {
            for (var i = 0; i < positionArr.length; i++) {
                if (positionArr[i].preOrNext_x_l == curLi_x_l || positionArr[i].preOrNext_x_l == curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                } else if (positionArr[i].preOrNext_x_r == curLi_x_l || positionArr[i].preOrNext_x_r == curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                } else if (positionArr[i].preOrNext_x_l > curLi_x_l && positionArr[i].preOrNext_x_l < curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                } else if (positionArr[i].preOrNext_x_r > curLi_x_l && positionArr[i].preOrNext_x_r < curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                } else if (positionArr[i].preOrNext_x_l < curLi_x_l && positionArr[i].preOrNext_x_r > curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                }
            }
        }
        if (same_y_positionArr.length > 0) {
            console.log(same_y_positionArr)
            same_y_positionArr = same_y_positionArr.sort(function (a, b) {
                return b.y - a.y
            })
            ac_in = same_y_positionArr[0].ac_in
            console.log(ac_in)
        } else {
            if (positionArr.length > 0) {
                for (var i = 0; i < positionArr.length; i++) {
                    if (positionArr[i].y > (positionArr[positionArr.length - 1].y - 10) && positionArr[i].y < (positionArr[positionArr.length - 1].y + 10)) {
                        same_y_positionArr.push(positionArr[i])
                    }
                }
            }
            same_y_positionArr = same_y_positionArr.sort(function (a, b) {
                return a.abs_x - b.abs_x
            })
            if (same_y_positionArr.length > 0) {
                ac_in = same_y_positionArr[0].ac_in
            } else {
                ac_in = el
            }
        }
    } else if (e && e.keyCode == 40) {
        positionArr = positionArr.sort(function (a, b) {
            return a.y - b.y
        })
        var same_y_positionArr = []
        if (positionArr.length > 0) {
            for (var i = 0; i < positionArr.length; i++) {
                if (positionArr[i].preOrNext_x_l == curLi_x_l || positionArr[i].preOrNext_x_l == curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                } else if (positionArr[i].preOrNext_x_r == curLi_x_l || positionArr[i].preOrNext_x_r == curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                } else if (positionArr[i].preOrNext_x_l > curLi_x_l && positionArr[i].preOrNext_x_l < curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                } else if (positionArr[i].preOrNext_x_r > curLi_x_l && positionArr[i].preOrNext_x_r < curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                } else if (positionArr[i].preOrNext_x_l < curLi_x_l && positionArr[i].preOrNext_x_r > curLi_x_r) {
                    same_y_positionArr.push(positionArr[i])
                }
            }
        }
        if (same_y_positionArr.length > 0) {
            console.log(same_y_positionArr)
            same_y_positionArr = same_y_positionArr.sort(function (a, b) {
                return a.y - b.y
            })
            ac_in = same_y_positionArr[0].ac_in
        } else {
            if (positionArr.length > 0) {
                for (var i = 0; i < positionArr.length; i++) {
                    if (positionArr[i].y > (positionArr[0].y - 10) && positionArr[i].y < (positionArr[0].y + 10)) {
                        same_y_positionArr.push(positionArr[i])
                    }
                }
            }
            same_y_positionArr = same_y_positionArr.sort(function (a, b) {
                return a.abs_x - b.abs_x
            })
            if (same_y_positionArr.length > 0) {
                ac_in = same_y_positionArr[0].ac_in
            } else {
                ac_in = el
            }
        }
    }
	return ac_in
}

设计理念

主要是根据当前元素的上下左右四个角,与被比较元素的上下左右四个角,以及按键时间,按规则来确定下一个到底是谁。之所以不用元素中心点之间的距离来比较,还是因为需求的问题。

用处

在机顶盒H5页面中使用,当然考虑到语法适配问题,以及性能问题,可以做各自的优化。例如,我这个页面的用法就有所不同,是比较当前元素,与当前栏所有元素或者上一栏或者下一栏元素比较,不会使用所有元素去比较,避免太多的代码执行。

疑问

机顶盒的项目算是小众项目。我刚接手的时候,页面展示是静态的,所以指定下一个选中目标就可以了。但是后面就有了改变,我的页面栏目是动态的,所有栏目运营随意配置顺序。经过一番思考之后,使用了这种方法。其实做个工作的同行应该也有挺多的,我很想知道大家是怎么做的,如何更有效率。

到此这篇关于JQuery实现相邻item焦点移动的示例详解的文章就介绍到这了,更多相关JQuery相邻item焦点移动内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • jquery实现焦点轮播效果

    HTML代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="./css/lunbo.css" rel="external nofollow" >

  • 简单实现jquery焦点图

    本文实例为大家分享了jquery焦点图的实现代码,供大家参考,具体内容如下 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>焦点图</title> <style type="text/css"> img{position: relative;} ul{list-style:

  • Android 使用jQuery实现item点击显示或隐藏的特效的示例

    本文介绍了Android 使用jQuery实现item点击显示或隐藏的特效的示例,分享给大家,具体如下: 效果图 分析 上图中的功能在很多APP上都可能用到过,例如app的帮助界面,告诉用户如何使用APP 一般的实现方式都是通过ListView来实现的,实际上此类需求非常简单,完全可以用WebView加载HTML来实现 抽屉样式的显示隐藏特效可以使用jQuery来实现,一个函数就可以搞定 实现 集成jQuery 网页中需要使用到jQuery,最新版本可以去官网下载 http://jquery.c

  • jQuery实现的自适应焦点图效果完整实例

    本文实例讲述了jQuery实现的自适应焦点图效果.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1,

  • jQuery焦点图左右转换效果

    本文实例为大家分享了jQuery焦点图左右转换的具体代码,供大家参考,具体内容如下 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>焦点图转换</title> <link rel="stylesheet" href="css/reset.css"> &l

  • jQuery实现的左右移动焦点图效果

    本文实例讲述了jQuery实现的左右移动焦点图效果.分享给大家供大家参考,具体如下: jquery 部分: $(function () { var _speed = 1000; var _len = 0; var _size = 150; var _direction = 'left'; function mar(){ if(_direction == 'left'){ if(_len >= 450){ _direction = 'right'; }else{ $(".flow ul&qu

  • jQuery编程动画的基本方法示例详解

    目录 一.动画 .show() .hide() .fadeIn() .fadeOut() .animate() .slideDown() .slideUp() .delay() .clearQueue() .fadeTo() 一.动画 jQuery提供了一些列的动画基本方法,同时也提供了自定动画方案.animate(). .show() 当提供一个 duration(持续时间)参数,.show()成为一个动画方法..show()方法将为匹配元素的宽度,高度,以及不透明度,同时进行动画操作. 持续

  • jQuery.Validate表单验证插件的使用示例详解

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求. 请在这里查看示例 validate示例 示例包含 验证错误时,显示红色错误提示 自定义验证规则 引入中文错误提示 重置表单需要执行2句话 源码示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

  • .NetCore实现上传多文件的示例详解

    本章和大家分享的是.NetCore的MVC框架上传文件的示例,主要讲的内容有:form方式提交上传,ajax上传,ajax提交+上传进度效果,Task并行处理+ajax提交+上传进度,相信当你读完文章内容后能后好的收获,如果可以不妨点个赞:由于昨天电脑没电了,快要写完的内容没有保存,今天早上提前来公司从头开始重新,断电这情况的确让人很头痛啊,不过为了社区的分享环境,这也是值得的,不多说了来进入今天的正篇环节吧: form方式上传一组图片 先来看看咋们html的代码,这里先简单说下要上传文件必须要

  • Vue中的vue-resource示例详解

    vue-resource特点 vue-resource插件具有以下特点: 1. 体积小 vue-resource非常小巧,在压缩以后只有大约12KB,服务端启用gzip压缩后只有4.5KB大小,这远比jQuery的体积要小得多. 2. 支持主流的浏览器 和Vue.js一样,vue-resource除了不支持IE 9以下的浏览器,其他主流的浏览器都支持. 3. 支持Promise API和URI Templates Promise是ES6的特性,Promise的中文含义为"先知",Pro

  • Java实现无向图的示例详解

    目录 基本概念 图的定义 无向图的定义 无向图的 API 无向图的实现方式 邻接矩阵 边的数组 邻接表数组 无向图的遍历 深度优先搜索 广度优先搜索 后记 基本概念 图的定义 一个图是由点集V={vi} 和 VV 中元素的无序对的一个集合E={ek} 所构成的二元组,记为G=(V,E),V中的元素vi叫做顶点,E中的元素 ek叫做边. 对于V中的两个点 u,v,如果边(u,v) 属于E,则称 u,v两点相邻,u,v称为边(u,v)的端点. 我们可以用m(G)=|E| 表示图G中的边数,用n(G)

  • jQuery图片缩放插件smartZoom使用实例详解

    e-smart-zoom-jquery.js插件,下载地址及示例:https://github.com/e-smartdev/smartJQueryZoom 插件描述:通过将鼠标悬停在图片上,滚动鼠标滚轮即可实现图片的放大或者缩小效果. smartZoom使用 举个栗子,上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <tit

  • Python:Scrapy框架中Item Pipeline组件使用详解

    Item Pipeline简介 Item管道的主要责任是负责处理有蜘蛛从网页中抽取的Item,他的主要任务是清晰.验证和存储数据. 当页面被蜘蛛解析后,将被发送到Item管道,并经过几个特定的次序处理数据. 每个Item管道的组件都是有一个简单的方法组成的Python类. 他们获取了Item并执行他们的方法,同时他们还需要确定的是是否需要在Item管道中继续执行下一步或是直接丢弃掉不处理. Item管道通常执行的过程有 清理HTML数据 验证解析到的数据(检查Item是否包含必要的字段) 检查是

  • 对python 生成拼接xml报文的示例详解

    最近临时工作要生成xml报名,通过MQ接口发送.简单小程序. 自增长拼成xml报文 Test_001.py # encoding=utf-8 import time orderId = '' s1= "\n" # for ID in range(1,5): item1 = "<item>" + \ "<orderID>" + str(ID) + "</orderID>" + \ "

  • python中前缀运算符 *和 **的用法示例详解

    这篇主要探讨 ** 和 * 前缀运算符,**在变量之前使用的*and **运算符. 一个星(*):表示接收的参数作为元组来处理 两个星(**):表示接收的参数作为字典来处理 简单示例: >>> numbers = [2, 1, 3, 4, 7] >>> more_numbers = [*numbers, 11, 18] >>> print(*more_numbers, sep=', ') 2, 1, 3, 4, 7, 11, 18 用途: 使用 * 和

  • Python中bisect的用法及示例详解

    bisect是python内置模块,用于有序序列的插入和查找. 查找: bisect(array, item) 插入: insort(array,item) 查找 import bisect a = [1,4,6,8,12,15,20] position = bisect.bisect(a,13) print(position) # 用可变序列内置的insert方法插入 a.insert(position,13) print(a) 输出: 5 [1, 4, 6, 8, 12, 13, 15, 2

随机推荐