`
月舒
  • 浏览: 4585 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论
阅读更多

问题描述

最近做项目的时候,有这么一个问题:用了brix组件dropdown做了一个下拉框,而这个下拉框有一个默认值,想让下拉框展开的时候直接定位到当前所选值,即:

希望原来的

变为

 

其html组织结构为:



 

ul中的各个选项为js手动生成。

 

一、最初的想法

直接在js中给默认的开始值添加选中样式,再用js将下拉框定位到所选中值。具体是:在'.dropdown-hd'上加click事件,当展开dropdown的时候获取被选中项的scrollTop值,然后将ul的scrollTop设置为被选中项的scrollTop值。



 

未果,下拉框的位置还是丝毫不动。

二、求助网络

发现理解scrollTop有误,网上答案为:



 

也就是说组件初始化时内层元素上边界和外层元素上边界重合,没有任何内容超过外层元素的上边界,此时被选中项的scrollTop值为0,无法起作用。

 

再查scrollTop的时候,发现总是把scrollTop和offsetTop联系在一起,故又看了一下offsetTop,发现这个属性挺符合要求的,因为offsetTop获取对象相对于版面或由offsetTop属性指定的父坐标的计算顶端位置。故改为:



 

但是发现还是不行,定位不准确,结果如下所示。



 

三、求助同事

非常感谢我旁边的外号哥GG和牙套姐MM,他们向我伸出了援助之手。牙套姐MM听了我的思路之后,皱起了眉头,觉得我这种做法是不对的,不应该人为的给这个组件默认值添加选中样式,再定位,而应该从组件入手,应用组件默认的选中item方法。所以又开始了探索组件的道路。

(1)组件自身方法select

组件有选中item的方法select,直接运用select方法让组件自动去完成。而我终于也知道了如何从brix中获取一个组件了,Brix.pagelet.getBrick("dropdown-start");其中参数为组件的id,通过这个可以获取一个组件,Brix.pagelet.getBricks("dropdown");其中参数为组件的name,可以获取组件名为参数的一系列组件。真的,非常感谢牙套姐的热心帮助,要不然我真不知道是这样获取已经初始化的组件的。

因为有两个组件名为dropdown的组件,不知道是先初始化哪一个,所以给这两个组件都加上了id,然后:



 

 

发现确实是选中了默认值,但是郁闷的是组件并没有定位到默认值的地方。

(2)监听组件事件selected

(1)无果后,牙套姐MM建议监听组件选中事件selected,使组件选中选项后立马定位到该位置。于是,



 

发现还是不行,定位不准确,结果为:



 

(3)是不是监听错了事件?

牙套姐MM说,可能选中完选项之后,整个下拉框就缩起来不可见了,所以监听selected方法根本无法准确的得到这些数值并设置。

于是,我们又想到应该监听组件刚展开下拉框的事件focus,于是:



 

结果如下:



 

顿时欣喜若狂,尼玛,终于好了,都忍不住向天狂笑啦!!!但是,发现又有了新的问题,我再自己任意选择其他选项时,悲剧发生了,如下:



 

唉,一个问题的解决伴随着其他问题的出现啊……怎么会这样?这定位也太不准了吧?

(4)抛弃kissy的offsetTop方法,使用原生的javascript方法

牙套姐MM就说,可能kissy的scrollTop方法和offsetTop有问题,因为是kissy封装的方法,可能不准确,于是抛弃了kissy的offsetTop方法:



 

发现,终于OK了,没问题了,这个问题终于得到了解决。

(5)探索kissy的offset方法

追根溯源,为什么kissy中的offset不准呢?于是查看Kissy源代码:



 

 

 

 

从源码中可以看出,kissy的offset是这样计算的,当relativeWin没有指定或者是window的时候,element的offsetTop指的是当前对象到page最顶端的距离,当指定的relativeWin不是window的时候,element的offsetTop指的是当前对象到浏览器client顶端的距离。所以不管我们是不是



 中指定了相对父元素,只要这个父元素不是window,那么offset计算的就是当前对象到浏览器client顶端的距离,而非当前元素到这个相对父元素层顶端的距离,与原生的javascript不一致。

  • 大小: 2.2 KB
  • 大小: 2.3 KB
  • 大小: 16.7 KB
  • 大小: 9.5 KB
  • 大小: 14.4 KB
  • 大小: 11.7 KB
  • 大小: 2.3 KB
  • 大小: 2.3 KB
  • 大小: 10.4 KB
  • 大小: 2.5 KB
  • 大小: 10.5 KB
  • 大小: 2.4 KB
  • 大小: 2.3 KB
  • 大小: 13 KB
  • 大小: 26.9 KB
  • 大小: 19.2 KB
  • 大小: 11.6 KB
  • 大小: 2.1 KB
分享到:
评论

相关推荐

    vue+element搭建后台小总结 el-dropdown下拉功能

    通过控制台输出(console.log)可以帮助开发者查看变量的值,以便快速定位问题。本文中的handleCommand方法中就使用了console.log来输出传入的command对象。 通过上述知识点的介绍,我们可以看到在使用Vue.js结合...

    三级dropdown弹出菜单

    本文将详细解析"三级dropdown弹出菜单"这一主题,帮助你理解和创建这种多级导航结构。 首先,我们要理解三级下拉菜单的基本概念。这种菜单通常由一个主菜单项展开,展示第二级子菜单,而这些子菜单项进一步可以展开...

    dropdown(CSS+jquery,not select)

    `来作为相对定位的父级。 2. 创建按钮:在容器内创建一个`<button>`或`<a>`元素,作为下拉菜单的触发器。利用CSS来设置样式,包括背景色、字体、边框等。 3. 选项列表:创建一个`<ul>`或`<ol>`元素,包含多个`<li>...

    dropdown无线横向分级菜单

    3. **CSS选择器**:了解各种CSS选择器,如类选择器、ID选择器、伪类选择器等,可以帮助精准地定位和设置菜单元素的样式。 4. **CSS布局**:掌握如何使用`display`属性(如`block`、`inline-block`、`flex`、`grid`...

    boostrap dropdown01

    Bootstrap 下拉菜单(Dropdown)是前端开发中常用的一个组件,尤其在构建响应式网页时,它为用户提供了一种简洁、高效的交互方式。本教程将深入探讨 Bootstrap 的 Dropdown 功能及其与 jQuery 的结合使用。 Bootstrap...

    借助css定位实现动态关联的一个例子

    这些工具可以帮助我们实时查看和修改元素的CSS属性,快速定位问题并进行调试。 总之,理解和掌握CSS定位是前端开发中不可或缺的部分。通过灵活运用各种定位方式,我们可以创建出丰富的用户界面和动态交互效果,提高...

    dropdownmenu

    在描述中提到的场景,例如美团和某些视频网站的电影票功能,下拉菜单被用作多条件筛选工具,帮助用户快速定位和选择他们感兴趣的选项。 1. **下拉菜单的基本原理**: 下拉菜单的核心是将大量选项以折叠的形式隐藏...

    DropDownMenu筛选器

    综上所述,"DropDownMenu筛选器"是一个强大的工具,能够帮助求职者高效地定位到合适的工作机会。通过双向薪资筛选、城市二级选择、单选工资经验和学历要求等条件,它提供了全面且定制化的职位搜索体验。在实际应用中...

    解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题

    这个错误是由于Bootstrap 4及以上版本依赖于Popper.js库来实现dropdown菜单的定位功能。Popper.js是一个轻量级的JavaScript库,用于创建弹出元素(如dropdown菜单)的位置计算和动态调整。 当您在HTML中看到如下的...

    Bootstrap模块dropdown实现下拉框响应

    1、利用dropdown类作为定位点,然后让子级的列表dropdown-menu绝对定位实现,还需要加一个单击点作为设置data-toggle=”dropdown”才能做关联。 2、 需要js插件的支持 三、源码分析: 1、caret:实现向下的三角形,...

    vant 自定义 van-dropdown-item的用法

    通过设置 `position: relative` 和绝对定位的 `.over`,可以实现关闭按钮相对于整个顶部区域的定位。 2. `.choice_middle`: 这是中间可滚动的部分,通过设置 `overflow-x: hidden` 和 `flex: 1`,确保内容只在垂直...

    react-native-dropdown:这是下拉菜单的简单实现

    介绍React Native Dropdown在React Native中非常简单,可自定义并且易于使用。 适用于Android和IOS。安装npm i react-native-dropdown --save用法在您的Javascript文件中要求它。 还支持使用对象解构的组件。 Select...

    iview通过Dropdown(下拉菜单)实现的右键菜单

    在实现过程中,我们会遇到一个关键问题:Dropdown 组件需要定位自身的位置,通常情况下,组件的位置是通过调用元素的 getBoundingClientRect 方法获得的。但是,如果组件本身不可见(即 style 中的 display 设置为 ...

    dropdown-menu

    通常,`dropdown`容器设为`relative`,`dropdown-content`设为`absolute`,这样可以使其相对于父元素定位。设置适当的`top`, `left`, `right`和`bottom`值来调整位置。 4. **过渡效果**:为了提高用户体验,可以...

    JS使用iView的Dropdown实现一个右键菜单

    通过调试和了解Dropdown组件的工作原理,可以更好地控制组件的定位行为,解决在开发过程中遇到的问题。 此外,文章中也提到了在开发右键菜单时,可能需要对iView有一定的使用经验。因此,建议开发者在着手实现之前...

    iron-dropdown:一个无样式的元素,其功能类似于本机浏览器select

    显示相对于另一个元素定位的固定位置容器内的内容。 请参阅:, 。 用法 安装 npm install --save @polymer/iron-dropdown 在HTML文件中 < html > < head > < script type =" module " > ...

    CSS3制作Dropdown下拉菜单的方法

    :target 是CSS3 中新增的一个伪类,用以匹配当前页面的URI中某个标志符的目标元素(比如说当前页面URL下添加#comment就会定位到id=“comment”的位置,俗称锚)。CSS3 为这个动作赋予了更加多的功能——就如同:hover...

    SplitButton an XP style dropdown split button

    6. **布局与定位**:SplitButton需要考虑在父容器中的位置和大小,以及下拉菜单相对于按钮的位置。 7. **API调用**:可能需要调用Windows API函数来实现特定的视觉效果,例如,使用Visual Styles API来保持XP样式的...

    BootstrapDropdownMenusEnhancement.zip

    Bootstrap Dropdown Menus Enhancement 是增强的 Bootstrap 下拉菜单功能: 子菜单 支持 radio 和 checkboxes 菜单定位 Bullet for menus 在线演示 标签:Bootstrap

Global site tag (gtag.js) - Google Analytics