【问题标题】:Dynamically position the triangle of a CSS speech bubble (:before & :after classes) using jQuery使用 jQuery 动态定位 CSS 语音气泡的三角形(:before & :after classes)
【发布时间】:2013-02-21 17:47:01
【问题描述】:

我创建了一个纯 CSS 语音气泡,其中三角形“语音提示”使用“玩零大小 div 的 4 个边框”技巧完成。到目前为止一切顺利。

但我还需要动态调整三角形的位置(相对于包含单词的主要矩形 div)。

图例:

http://www.designwalker.com/img/speech_bubble/speech_bubble10.jpg(忽略色差,第1个和第2个气泡中​​三角形的位置不同)。

问题在于三角形(及其边框)通常使用主气泡的 :before 和 :after 类来完成。而且似乎在 jQuery(或任何 javascript API)中没有(简单的)方法来操作 :before 和 :after 类的 CSS 属性。

有解决办法吗?

我很确定这是可以做到的,因为当用户将鼠标悬停在右侧的代码行上时,Facebook 似乎可以轻松地将三角形动态定位到它想要的任何位置(取决于屏幕折叠和其他因素)。

我在这里搜索并找到了将类动态添加到 div 的解决方案,但这似乎不切实际,因为会有许多独特的类,每个类都有不同的偏移值。 (从0像素到很多像素)

谢谢!

安德鲁

附注:

顺便说一句,我进一步查看了 Facebook,他们可能正在玩一些背景图片精灵技巧。但是我花了很多时间使用“玩零大小 div 的 4 个边框”技巧来“完善”我的气泡,我真的很犹豫重新调查 Facebook 是如何做到的,更不用说我必须交付网站很快..... :-(

【问题讨论】:

  • 你图片中的 4 个位置是你需要的仅有的四个吗?即左中左中右中右?
  • 不幸的是,偏移量需要调整到像素。这是为了适应用户滚动窗口。我展示的图片有水平偏移。在我正在构建的网站中,我需要垂直偏移。我意识到如果只有几种可能性,我可能可以使用“插入类”技巧。
  • 最后,我回避了这个问题。大多数在线示例使用 :before 和 :after 来实现 CSS 三角形。至少在我的情况下,我发现通过将 :before & :after CSS 内容作为
    插入到实际的 html 文件中,我想要的三角形工作得很好。这使得 html 文件更加混乱而不是“优雅”,但它回避了 jQuery(或任何 Javascript 库)无法选择和处理 :before 和 :after 伪类的问题。

标签: jquery css pseudo-element


【解决方案1】:

伪元素不能被 Javascript 操作,因为它们没有暴露在 DOM 中(我们曾经称其为 Shadow DOM,直到该术语指代使用 Javascript 操作隐式 DOM 元素的方法)。

您可以做的是向包含元素添加类,这些类将通过其他规则影响其位置。 something very similar 有一个很好的例子(它使用 <b> 元素而不是 :before:after 来实现 IE6 支持——但原理是一样的,因为 <b> 元素永远不会被操纵并从父母)在StubornellaOOCSS 图书馆。 code 信息量很大,因为它显示了父元素上的一个类,指示子装饰元素应如何定位。

更新:煞费苦心的解释

假设提示本身显示 OK 的方式,编写一个单独的 CSS 规则来为它们定义每个不同的位置。在这里,我使用了left 位置,假设:after 元素正在创建尖端并且已经绝对定位在底部。您可以使用任何您想要的选择器或定位技巧来代替这些。

.bubble_left:after {
    left: 0;
}

.bubble_mid-left:after {
    left: 25%;
}

.bubble_mid-right:after {
    left: 75%;
}

.bubble_right:after {
    left: 100%;
}

那么你需要做的就是改变'bubble'元素的类——从而避免试图影响:after元素的CSS属性的问题。

【讨论】:

  • 我上面描述的解决方案有效。无论您使用的是具有不同背景位置或绝对定位的精灵,您仍然可以通过设置不同的类来更改该位置。看看其中的一些链接:该解决方案不仅开箱即用,而且 Stubbornella 实际上是被 Facebook 雇用来整理他们的前端的!肯定是最好的来源?!
  • 好的,我明天去看看!现在是亚洲凌晨 2 点。 :-) 谢谢晚安(反正对我来说)。
  • @Andrew 我编辑了我的答案,以便在这里更好地解释该技术,而不是仅仅依靠链接来详细说明。这有帮助吗?
  • 是的,它有帮助。但也许我要求太多了? :-) 如果我希望能够将偏移量指定为一个像素呢?这是为了适应用户对窗口的垂直滚动。我展示的图片有水平偏移。在我正在构建的网站中,我需要垂直偏移。气泡或多或少地停留在屏幕中间,三角形必须“瞄准”(跟踪)屏幕上的一些文本。跟踪的文本随着用户垂直滚动而移动。使用这种方法意味着我需要许多类,每个类都有不同的偏移值?
  • 是的。要么你写一个更长的类列表(多长时间?由你决定!)并给出所需位置的近似值......或者如果你想使值精确,你将需要使用真实元素(如<b></b> in我链接的示例 - 类似于用于 facebook 的技术),并使用 Javascript,如您最初建议的那样,将确切位置放在元素本身上。
猜你喜欢
  • 1970-01-01
  • 2015-10-26
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多