更改 GWT 子菜单弹出位置

Posted

技术标签:

【中文标题】更改 GWT 子菜单弹出位置【英文标题】:Change GWT SubMenu Popup Location 【发布时间】:2012-03-28 12:04:42 【问题描述】:

在菜单栏中,通常子菜单显示在右侧。我想换到左侧。谁能告诉我,我该怎么做?

【问题讨论】:

【参考方案1】:

子菜单的弹出位置由 CSS 元素在渲染时根据菜单项的位置定义。

在主菜单上通过 Firebug 查看它产生的:

element.style 
    clip: rect(auto, auto, auto, auto);
    left: 337px; // Change this to left:35px;
    overflow: visible;
    position: absolute;
    top: 319px;
    visibility: visible;


// This is main CSS for popup
.gwt-MenuBarPopup

所以,试试使用代码中的setStyleName("css goes here")

【讨论】:

嘿哈迪克,感谢您的及时回复。我也做了同样的事情并做到了。 您确实可以在弹出窗口内的菜单组上执行 addStyleName,但不能在实际上是“.gwt-MenuBarPopup”的菜单组上执行。由于在需要响应用户操作(悬停、单击)之前不会创建菜单栏弹出窗口,因此您甚至无法通过其索引设置弹出窗口的样式。也不是它的父级,因为它的 DOM 容器实际上根本没有父级。我还没有找到一种方法来使一个弹出位置本身与另一个不同(例如,右侧的最后一个需要弹出到原始项目的左侧)。 MenuBar 类没有对齐能力似乎是一个重大疏忽。【参考方案2】:

我再次建议您覆盖默认样式 GWT:) 当我不得不更改 GWT 元素的一些标准视图时,我在我的项目中使用了这种方法。

【讨论】:

我知道只有这样才能做到。但是你能告诉我我需要覆盖哪些样式吗? 我在 firebug 中打开了一个示例菜单栏,发现 MenuBar 的所有项目都有 CSS 样式类“gwt-MenuItem”。此外,每个项目都有其标识符,例如“gwt-uid-1”、“gwt-uid-2”等。如果您想覆盖元素的默认样式,请连接到主机页面、您的 CSS 文件并为需求类和 ID 编写新属性。我建议你在连接GWT脚本后将CSS文件连接到主机页面的节头末尾,否则更改无法覆盖默认样式。如果你愿意,我可以像我那样描述要点)【参考方案3】:

我也能够通过更改 css 来实施解决方案。也许这不是最优雅的方式,但它确实有效。使用 GwtQuery 的最接近()方法的一点帮助,这里是一个简短的例子。

        menuBar.addAttachHandler(new AttachEvent.Handler()             
        @Override
        public void onAttachOrDetach(AttachEvent event) 
            if(event.isAttached())
                Scheduler.get().scheduleDeferred(new ScheduledCommand()                        
                    @Override
                    public void execute() 
                        Element e = $(menuBar).closest(".gwt-MenuBarPopup").get(0);
                        e.getStyle().setLeft(parentMenuBar.getAbsoluteLeft()-menuBar.getOffsetWidth() , Unit.PX);
                    
                );                 
            
        
    );

因此,当附加子菜单时,您想要更改 css。我使用延迟命令,以便在 GWT 的默认 MenuBar 实现设置它之后更改 css。 这一行,"$(menuBar).closest(".gwt-MenuBarPopup").get(0);"将向上搜索 DOM 树,直到找到具有 .gwt-MenuBarPopup 类的元素,这是您要更改的元素。

【讨论】:

【参考方案4】:

我的解决方案与目前在此处发布的解决方案有些混合,但我认为它比其中任何一个都更干净/更简单。

    每个垂直子菜单本身都是一个MenuBar,作为项目添加到顶层 MenuBar。对于您想要放置到左侧而不是右侧的任何子菜单,请在该 MenuBar 小部件上使用 .addStyleName("myLeftDropDownStyleName") 为其添加样式类名称。

    像这样为该样式定义选择器规则(这些是我获得左下角所需的最低属性):

    .myLeftDropDownStyleName position: absolute; right: 0px;

Absolute 相对于第一个非静态位置的父元素的位置;至少就我而言,该父位置似乎是水平位置,否则下拉菜单的左边缘没有此解决方案。如果Relative 职位在其他人的情况下可能会更好,我不会感到惊讶。

0px 的右偏移量告诉绝对位置的正确位置在我上面提到的那个水平位置。当然,像素大小可以是 > 0 以进一步向左推那么多,甚至可以是

这对我来说非常有效,简单干净,并且不会强制 所有 您的 MenuBars 具有这种样式(我认为如果您覆盖其中一种 GWT MenuBar 样式就会出现这种情况自己)。

【讨论】:

以上是关于更改 GWT 子菜单弹出位置的主要内容,如果未能解决你的问题,请参考以下文章

如何自动隐藏 GWT MenuBar 子菜单?

更改默认弹出菜单子菜单箭头

根据窗口边界打开 gwt 子菜单方向

如何禁用 GWT MenuBar 中子菜单后面的阴影?

子菜单弹出背景透明

javascript 在弹出菜单中启用子菜单