【问题标题】:jquery Mobile: can't set button's left and width?jquery Mobile:无法设置按钮的左侧和宽度?
【发布时间】:2011-03-18 20:00:22
【问题描述】:

Web app in progress is here(更正后的网址)

我正在尝试使用 jQuery Mobile 为我的女儿们开发一个音乐阅读问答游戏。

我遇到问题的部分是键盘。 使用“普通”html 按钮,您可以使用 jQuery 的 .css() 方法设置左侧/顶部/宽度/高度 css 属性。但是对于 jQuery Mobile,这似乎不起作用。有谁知道如何在 jQuery Mobile 中移动按钮?

这是键盘按钮的初始 HTML 的摘录:

<div id="kbdC2E" class="keyboard">
    <button class="pianoKey whiteKey" id="wk1" />
        <button class="pianoKey blackKey" id="bk1" />
    <button class="pianoKey whiteKey" id="wk2" />
        <button class="pianoKey blackKey" id="bk2" /> <!-- etc. -->

这是将它们移动到适当位置的 javascript 代码:

for (i = 0; i < numWhiteKeys; i++) {
    var keyLeft = whiteKeyWidth * i;
    var $key = $('button#wk' + i, $div).parent();
    $key.addClass('pianoKey whiteKey')
    .css({
        // position: 'absolute', // from pianoKey class
        left: keyLeft,
        top: gap,
        width: whiteKeyWidth,
        height: whiteKeyHeight,
    });

请注意,我们使用button#wk1 键的parent,因为jQuery Mobile 已将&lt;button&gt; HTML 修饰为:

<div data-theme="c" class="ui-btn ui-btn-corner-all ui-shadow ui-btn-up-c">
  <span class="ui-btn-inner ui-btn-corner-all">...</span>
  <button class="pianoKey whiteKey ui-btn-hidden" id="wk1"></button>
</div>

(您可以通过转到the web page 并使用 DOM/CSS 检查器来验证详细信息。)

当我运行它时,结果是父 div 接收到添加的类,通过它它变成 position=relative;它还接收我设置的顶部和高度属性:

<div data-theme="c" class="ui-btn ui-btn-up-c ui-btn-corner-all ui-shadow pianoKey whiteKey"
     style="top: 72px; height: 90px; ">
  <span class="ui-btn-inner ui-btn-corner-all">...</span>
  <button class="pianoKey whiteKey ui-btn-hidden" id="wk1"></button>
</div>

但是它没有收到我设置的“left”和“width”属性。 结果,所有键最终都位于祖先 div 的左侧,并且它们的宽度错误。谁能告诉我如何有效地设置 left 和 width 属性?

谢谢...

附注更新:有关我希望结果的说明,请参阅here。这不是我想要使用的机制,因为通过在运行时添加按钮,它显然完全绕过了 JQM,从而失去了我试图从 JQM 获得的触摸友好和跨平台优势。但它显示了我想要的布局。

【问题讨论】:

  • 糟糕!一开始我的网址有误。现在是对的。

标签: javascript jquery html css jquery-mobile


【解决方案1】:

您是否尝试将“px”添加到宽度数?差不多就是这样:

.css({
    // position: 'absolute', // from pianoKey class
    left: keyLeft + 'px',
    top: gap,
    width: whiteKeyWidth +'px',
    height: whiteKeyHeight +'px',
});

我假设 whiteKeyHeight 和 whiteKeyWidth 声明得很好,并且您使用 alert() 确保了这一点。另外,在另一个注意事项(哦,这里真是个有趣的笑话),您不应该使用绝对位置,这可能会在不同的浏览器/分辨率等中导致一些问题。您可以使用相对位置来设置“左”属性。此外,float left 似乎是最好的答案,因为它为您完成了这一切,而无需添加任何代码,但使用“float:left;”的类除外。属性。

【讨论】:

  • @Bene,感谢您的建议。是的,我检查了 whiteKeyWidth 的值。但我又检查了一遍,结果……是 NaN !!当我修复它时,设置leftwidth 有效!谢谢!!!
  • 只是为了回答你的其他 cmets... Re: 添加 'px',它没有帮助,这并不奇怪,因为设置 top/height 在没有 'px' 的情况下已经有效.回复:位置=绝对导致问题:你能提供更多信息的链接吗?我认为absolute-inside-relative 是实现这一目标的 方式。
  • Re: '使用相对位置来设置“左”属性':这将使每个按钮相对于它“将”落在正常流程中的位置,对吗?这是在哪里,就在前一个之后?回复:向左浮动:那会做什么?我不明白这如何为黑键提供适当的间距。
  • 感谢您告诉我有关“px”问题的信息,我实际上认为我对这个问题是正确的。 float: left 属性是在同一行上对齐多个块的最佳方法,但由于您实际上并未“对齐”这些注释,因此这不适用。最后,我看到您使用 position: absolute 属性做得很好。关键是 position: relative 几乎与 absolute 相同,但使用父容器的位置而不是浏览器的视口。如果你想“移动”这些笔记,你可以移动容器
    ,例如,让它更容易。
  • @Bene,我已经阅读了您引用的网页,并没有说相对意味着相对于父级;它说这意味着相对于元素在正常流动中的位置。我认为您所想的是绝对内部相对(about.com 页面未提及);请参阅css-tricks.com/absolute-positioning-inside-relative-positioning 无论如何,再次感谢您的宝贵帮助。
【解决方案2】:

这不是问题的直接答案,因为我相信您的值只是由于脚本运行的顺序而被重写,但是

我建议使用div 元素而不是按钮。向这些 div 添加一些类将使它们看起来像你想要的 jquerymobile-ish,并且它们根本不需要是按钮......除非你希望应用程序也可以在没有 javascript 的情况下工作(我无法验证目前)

[编辑]

第二件事有点模棱两可......我会详细说明。

我希望 JQM 阻止或覆盖您设置的内容。这可以通过减少处理按钮的 JQM 代码的数量来避免。

检查按钮并复制它们的大部分类(这会给你外观)并将这些类赋予一些 div 而不是按钮元素。添加您的样式。绑定 tapclick(我目前在您的代码中没有看到任何绑定)以使它们工作 - 就像您对按钮所做的那样。

这不是一个不太像 jqm 的方法,你想使用相对位置和覆盖其他按钮的按钮 - 这是相当不寻常的,所以它需要不寻常的处理。

另一个想法:

你看到了吗:http://jquerymobile.com/demos/1.0a3/#docs/buttons/buttons-grouped.html 或者这个:http://jquerymobile.com/demos/1.0a3/#docs/toolbars/docs-navbar.html ?

也许您根本不需要使用 position:relative 来定位按钮(它总是有点混乱),只需将它们放在两行中,或者将它们作为一列粘在一起,然后在它们的包装器上设置 float:left。看看什么适合你

【讨论】:

  • 您能否详细说明“脚本的运行顺序”?显然,在 jquery mobile 重组 DOM 之后,我移动父 div 的 js 代码正在运行;我们知道这一点是因为每个按钮元素的添加父级正在接收我们给它的类和顶部/高度属性。您认为之后运行的是什么脚本?
  • Re: 你的第二段,你基本上是建议不要使用jQuery mobile 吗?我想在 jQuery Mobile 上获得跨平台触摸友好的好处,但如果它使 DHTML 变得太难,也许会牺牲这一点。
  • 1.我不确定,但可能会删除/覆盖那些缺失的属性,仅此而已。只是一个猜测 2。我不是在建议 - 你应该像现在一样使用 jqm 引入的类并实现点击/点击,但是在简单的 div 元素上,而不是按钮上。我敢打赌,如果没有 javascript,您的按钮将无法工作,因此将它们更改为 div 对 javascript 没有任何影响。
  • @naugtur,感谢您的回复...到目前为止,您是唯一一个尝试过的人。 Re: 2、用div代替按钮有什么好处?如果它们是 div,您是否希望 jqm 不会“装饰”它们或在它们上运行脚本?在我看来,如果我绕过 jqm 的两个大部分工作原理,我不妨不使用 jqm。
  • @2 你还是不明白。 ;) 我只是建议您使用不同的 html 对象。您必须为他们提供 jqm 特定的类并使用单击/点击事件来编写支持。它和以前一样需要 jqm,但是如果您不希望 jqm 控制按钮的对齐方式,则必须使它们不是按钮。该是我编辑帖子的时候了;)
【解决方案3】:

好吧,它不起作用,但这是您希望按键布局做的事情:http://jsfiddle.net/rg4wj/13/

【讨论】:

  • 当我转到那个链接时,我看不到任何 javascript,并且按钮都并排排列。那是你的意图吗?不,这不是我想要按键布局做的...我希望白键(id="wk1" 等)更低,黑键更高,如huttar.net/lars-kathy/school/musicQuiz/musicQuiz.html,但我希望它们传播像钢琴键一样水平伸出,其中黑键按钮部分重叠(并在前面)白键。我有一个工作的非 jqm 原型要展示,但它现在不工作......
  • 如果您查看页面的左侧,您应该会看到“管理资源”,其中包含所有 JS 和 CSS。该页面仅显示用于分组的 JQM 原生布局
  • 好的,我现在看到js了,这只是我的js的链接。当你说“这就是你想让按键布局做的事情”时,我不知道“这个”指的是什么。除了一堆按钮的 JQM 默认布局,这不是我想要的。
猜你喜欢
相关资源
最近更新 更多
热门标签