【问题标题】:How do I lean a xul element to the right side of a variably sized centered element?如何将 xul 元素倾斜到可变大小的居中元素的右侧?
【发布时间】:2015-03-28 20:24:23
【问题描述】:

我决定稍微整理一下这个问题,以便于阅读。

我有一个居中的<menulist>,宽度可变(maxwidth="200"),我想在<hbox> 旁边靠几个<toolbarbuttons>。这些元素是 xul <page> 元素的一部分。

下图显示了我目前的结果和我的实际目标是什么:

垂直的红线只是用来表示窗口的中心。

目前的结果是用下面的css和xul实现的:

css:

page {
  -moz-appearance: none;
  background-color: #fff;
  text-align: center;
}

toolbarbutton {
  list-style-image: url( 'chrome://codifiertest/skin/icons.png' );
}
toolbarbutton .toolbarbutton-icon {
  width: 16px;
  height: 16px;
}

toolbarbutton.add {
  -moz-image-region: rect( 0px, 16px, 16px, 0px );
}

toolbarbutton.edit {
  -moz-image-region: rect( 0px, 32px, 16px, 16px );
}

toolbarbutton.delete {
  -moz-image-region: rect( 0px, 48px, 16px, 32px );
}

toolbarbutton.config {
  -moz-image-region: rect( 0px, 64px, 16px, 48px );
}

xul:

<?xml version="1.0" encoding="utf-8"?>

<?xml-stylesheet type="text/css" href="chrome://global/skin/"?>
<?xml-stylesheet type="text/css" href="chrome://codifiertest/skin/index.css"?>

<!DOCTYPE page>

<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
      xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
      xmlns:html="http://www.w3.org/1999/xhtml">

  <div xmlns="http://www.w3.org/1999/xhtml">

    <h1>Title</h1>

    <vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
          pack="start"
          align="center">

      <stack maxwidth="200">
        <hbox pack="center" align="center">
          <menulist maxwidth="200">
            <menupopup>
              <menuitem label="Item" value=""/>
            </menupopup>
          </menulist>
        </hbox>
        <hbox left="200">
          <toolbarbutton class="add"/>
          <toolbarbutton class="edit"/>
          <toolbarbutton class="delete"/>
        </hbox>
      </stack>

    </vbox>

  </div>

</page>

icons.png:


您也可以将其作为可安装的引导测试示例下载:

http://extensions.codifier.nl/test/downloads/test@extensions.codifier.nl.xpi

请注意,示例 xpi 安装将在安装后立即打开一个带有示例 xul 文件的新选项卡。作为免责声明:该文件可从不安全的位置(我自己的域)下载,因此请确保在安装之前验证您下载的内容(即在安装之前先将 xpi 保存到磁盘)。


因此,目标是始终让&lt;menulist&gt; 水平居中于页面,而&lt;hbox&gt;&lt;toolbarbutton&gt;s 靠在&lt;menulist&gt; 的右侧,无论其宽度如何。

这对 xul 是否可行,也许还有一些额外的 css?

我实际上是通过混合更多 (x)html 来让它工作的:

css:

#container {
  position: relative;
}

#container > span {
  position: absolute;
  left: 100%;
}

更改的 xul/(x)html:

<html:div id="container"> <!-- no more xul:stack -->
  <hbox pack="center" align="center">
    <menulist maxwidth="200">
      <menupopup>
        <menuitem label="Item" value=""/>
      </menupopup>
    </menulist>
  </hbox>
  <html:span> <!-- additional span -->
    <hbox>
      <toolbarbutton class="add"/>
      <toolbarbutton class="edit"/>
      <toolbarbutton class="delete"/>
    </hbox>
  </html:span>
</html:div>

...但我真的更希望看到一个纯 xul 解决方案,如果有人知道的话。

提前感谢您对此进行调查。

【问题讨论】:

  • @WebDev 它确实有效! :-) 不过,如果有人知道的话,我仍然愿意看到一个纯粹的 xul 解决方案。
  • 很高兴听到我能帮上忙。如果有 xul 解决方案,我也很想知道。我会留意的。
  • 我在 XUL Explorer 和在 Firefox 的选项卡中打开的独立 XUL 文件中都尝试了您的原始代码。在这两种情况下,它都没有像您的图像中描绘的那样呈现。如果您可以提供您正在使用的相关 CSS 代码,这将很有帮助,这样我们就可以有一个已知的工作起点,而不必首先修改您提供的代码以使其显示接近您的图像显示当前代码显示。请参阅How to create a Minimal, Complete, and Verifiable example
  • 顺便说一句:如果&lt;menulist&gt; 变得太大,在&lt;stack&gt;&lt;menulist&gt; 上使用maxwidth="200" 应该会导致按钮没有可用空间。但是,&lt;stack&gt; 上的 maxwidth="200" 似乎没有被遵守。如果您真的希望 &lt;stack&gt; 的宽度限制为 200,则需要将 &lt;menulist&gt; 上的 maxwidth 定义为所需的最大宽度减去您为 &lt;toolbarbutton&gt;&lt;hox&gt; 确定的宽度(以及此类和&lt;menulist&gt;之间的任何空格。
  • 基于来自 Ondřej Doněk 的 xpi 的信息:要使原始代码正常工作,您所要做的就是将:&lt;hbox left="200"&gt; 更改为 &lt;hbox right="-66"&gt;。如果他更新他的答案,我将删除此评论,因为信息确实来自他,但不在他的答案中。

标签: css firefox firefox-addon xul


【解决方案1】:

我认为这应该是解决方案:

page.xul

<?xml-stylesheet type="text/css" href="page.css"?>
<!DOCTYPE page>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
      xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
      xmlns:html="http://www.w3.org/1999/xhtml">
    <vbox>
        <hbox>
            <hbox>
                <menulist>
                    <menupopup>
                        <menuitem label="Item" value=""/>
                    </menupopup>
                </menulist>
            </hbox>
            <hbox>
                <button class="add"/>
                <button class="edit"/>
                <button class="delete"/>
            </hbox>
        </hbox>
        <hbox>
            <hbox>
                <menulist>
                    <menupopup>
                        <menuitem label="Item" value=""/>
                    </menupopup>
                </menulist>
            </hbox>
            <hbox>
                <button class="add"/>
                <button class="edit"/>
                <button class="delete"/>
            </hbox>
        </hbox>
    </vbox>
</page>

page.css:

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
page {
    -moz-appearance: none;
    background-color: #fff;
    text-align: center;
    background-image: url( 'dot.png' );
    background-position: top center;
    background-repeat: repeat-y;
}
page > vbox {
    -moz-box-flex: 1;
}
page > vbox {
    padding-left: 90px;
    -moz-box-align: center;
    -moz-box-pack: start;
}
.buttonsgroup {
    -moz-appearance: toolbox;
}
button {
    -moz-appearance: toolbarbutton;
    list-style-image: url( 'icons.png' );
    min-width: 27px !important; 
    width: 27px;
    height: 16px;
    margin: 0px 0px 0px 0px;
}
button.add {
  -moz-image-region: rect( 0px, 16px, 16px, 0px );
}
button.edit {
  -moz-image-region: rect( 0px, 32px, 16px, 16px );
}
button.delete {
  -moz-image-region: rect( 0px, 48px, 16px, 32px );
}
button.config {
  -moz-image-region: rect( 0px, 64px, 16px, 48px );
}

这是它的外观(在 FF 36、Kubuntu 15.04 上):

希望对您有所帮助。

【讨论】:

  • 感谢您的努力,但恐怕您误解了我的要求:&lt;menulist&gt; 必须始终保持居中,而不是 &lt;hbox&gt;&lt;menulist&gt;&lt;button&gt;s。
  • 我更新了 CSS - 仍然不完美 - 需要围绕按钮进行一些 css 工作......但是您需要在第一个内部 &lt;vbox&gt; 上留下填充。看图 - 也更新了 - 红线只是1px的背景图片,看看页面的中心在哪里。
  • 仅供参考:在 win7 FF36.0.4 上,&lt;menulist&gt; 最初仅显示 ...,而不是 Item。如果 label 更改,则显示的文本将被截断。这与原始问题和问题中的 HTML/CSS 解决方案显着不同,除非label 变得比200 像素(如maxwidth="200" 中定义的那样)更长,否则不会截断。将maxwidth="200" 添加到&lt;menulist&gt; 元素并不能解决此问题。
  • 我自定义了您的 XPI(只是对您的原始代码稍作更改)-您可以在这里找到它:jmp.sh/cEZgMO8 --- 但我必须说,您的原始代码在某种程度上是非常混乱的XHTML 和 XUL 混合在一起,我永远不会自己用这种风格写这个:) ...
  • 不,这不是 200 像素的限制(上面的代码中不存在)。随着label 长度的增加,&lt;menulist&gt; 的总宽度继续增加。它只是截断标签文本的显示。例如Item 导致...Item 1 导致It...Item 2 longer 导致Item 2 l...;等
【解决方案2】:

应该有一个答案来说明问题的实际解决方案,而不仅仅是在 cmets 中。此答案基于来自 Ondřej Doněk 的 .xpi 的信息,该信息可在对 the answer that user provided 的评论中下载。

简单的解决方案:
要使原始代码正常工作,您所要做的就是更改:

<hbox left="200">

<hbox right="-66">

MDN 说,对于直接在 XUL &lt;stack&gt; 元素中的元素,属性 right

指定相对元素右边缘的像素位置 到堆栈的右边缘。

基于使用像right="-66"这样的负数有效的事实,我们可以推断它实际上告诉堆栈要做的是:放大使得&lt;stack&gt;的右边缘到66像素将元素的右边缘放在堆栈的右边缘。

如果更新 Ondřej Doněk 的答案以包含有关使用负数作为 right 属性的信息,则可以删除此社区 wiki 答案。

【讨论】:

    【解决方案3】:

    您的 CSS 看起来不错。您可以使用 XUL 的纯属性来解决这个问题。您可以使用:pack, orient, align, flex ...

    尝试使用 xul-periodic-table 示例:

    https://github.com/alijc/xul-periodic-table/blob/master/layout.xul

    【讨论】:

    • 谢谢,但我想我已经用尽了这些选项。我真的很想看到一个明确的工作示例,符合我提出的要求。
    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2021-09-22
    • 2017-03-15
    • 2015-05-14
    • 2013-08-06
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多