- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过端口将 Elm 应用程序与 Masonry.js 集成,但我在尝试弄清楚如何获取 Signal Html 来触发告诉 Masonry.js 重绘 View 的端口时遇到了麻烦。
我正在使用 StartApp,但不确定如何从更新调用中获取 View 已完成重新呈现的信号。
可能会更好地与 Elm 一起工作的替代库或完全 Elm 解决方案也将受到赞赏。
关于我试图解决的整体问题的更多细节:我有一系列图像,我想以砖石格式 ( http://masonry.desandro.com/ ) 平铺。它们由 Elm 中的对象列表表示,这些对象在 View 中转换为 div 列表(适当设置了背景图像),但图像大小不同,因此希望很好地平铺它们。我正在使用 StartApp ( http://package.elm-lang.org/packages/evancz/start-app/2.0.2/ ) 来抽象 html 的实际呈现。
最佳答案
您可以使用 ports在 Elm 中与 javascript 通信,以便双向发布和订阅事件。让我们构建一个示例,其中图像列表显示为砖石布局,单击图像将删除它并触发砖石以布局其余图像。
由于 Elm 应用程序将向 javascript 发送多种类型的事件,我们可以创建一个端口来发送字符串,然后 javascript 可以对其进行操作。这些字符串将是我们可以在 javascript 中解释的命令,以便告诉 masonry 做某些事情,比如 "initialize"
和 "imageRemoved"
。此端口还需要一个邮箱,我们可以从 Elm 内部向其发送消息。
masonryMailbox : Signal.Mailbox String
masonryMailbox =
Signal.mailbox ""
port masonryCommands : Signal String
port masonryCommands =
masonryMailbox.signal
由于您使用的是 StartApp
,您可以在 update
函数中返回 Effects
,所以让我们创建一个函数,将消息发送到此邮箱来自 StartApp
初始化器和 update
函数。
sendMasonryCommand : String -> Effects.Effects Action
sendMasonryCommand cmd =
let
task =
Signal.send masonryMailbox.address cmd
`Task.andThen` \_ -> Task.succeed NoOp
in
Effects.task task
您可以在 StartApp
init 函数中发送 "initialize"
命令,如下所示:
init =
(initialModel, sendMasonryCommand "initialize")
在 update
函数中,如果我们有一个 RemoveImage String
操作,我们可以向 javascript 发送一个 "imageRemove"
命令:
update action model =
case action of
NoOp ->
(model, Effects.none)
RemoveImage url ->
let model' =
{ model
| images = List.filter ((/=) url) model.images
, message = "Removing image " ++ url
}
in (model', sendMasonryCommand "imageRemoved")
现在我们需要连接 javascript 端来监听这些事件。如果 javascript 得到命令 "initialize"
,那么我们就可以连接 masonry 了。如果我们得到 "imageRemoved"
命令,我们可以告诉 masonry 再次触发布局命令。
var app = Elm.fullscreen(Elm.Main);
app.ports.masonryCommands.subscribe(function(cmd) {
var $grid = $('.grid')
if (cmd === "initialize") {
$grid.masonry({
itemSelector: '.grid-item',
percentPosition: true,
columnWidth: '.grid-sizer'
});
$grid.imagesLoaded().progress( function() {
$grid.masonry();
});
} else if (cmd === "imageRemoved") {
$grid.masonry();
}
});
我们还可以连接端口以将事件发送回 Elm。让我们在每次 masonry 完成渲染时向 Elm 发送一条消息来添加示例。首先,我们将创建一个名为 setMessage
的端口。
port setMessage : Signal String
因为这是 javascript 将发布到的端口,我们只在 Elm 中定义函数签名,而不是函数本身。相反,当我们调用 Elm.fullscreen()
时,我们必须从 javascript 端给信号一个初始值。 javascript 更改为:
var app = Elm.fullscreen(Elm.Main, { setMessage: "" });
现在,在处理 “initialize”
命令的 javascript block 中,您可以连接 masonry 的 layoutComplete
函数以将消息发送到这个新端口。
$grid.on("layoutComplete", function() {
app.ports.setMessage.send("Masonry layout complete!");
});
为了在 Elm 中使用来自 setMessage
端口的这些消息,您需要一个 SetMessage String
操作,并且您需要将信号映射到 StartApp
inputs
列表。您的 StartApp
初始化代码将如下所示:
app =
StartApp.start
{ init = init
, view = view
, update = update
, inputs = [ Signal.map SetMessage setMessage ]
}
我在几个要点中提供了所有这些的完整工作示例。这是一个 gist containing the Elm code这是一个gist containing the html and javascript .
关于masonry - 榆树 + Masonry.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35738808/
我正在尝试通过端口将 Elm 应用程序与 Masonry.js 集成,但我在尝试弄清楚如何获取 Signal Html 来触发告诉 Masonry.js 重绘 View 的端口时遇到了麻烦。 我正在使
我的网站设计了媒体查询,以覆盖不同大小的布局。我有砌体组织一堆全尺寸宽度的浮标,没问题。在移动宽度下,所有浮子都会浮起并堆叠在一起。所以我只需要在网站大小调整为平板电脑布局且 768px // */
我遇到了典型的砖石溢出问题。我正在尝试加载推特卡片,但在加载时,它们仍然相互重叠。一旦调整屏幕大小,它们就会工作。仅供引用,我肯定有 imageLoad 和 masonry 。我在 Rails 中这样
如何证明 masonry 网格元素居中? 似乎 Masonry 将我所有的网格项都 float 到左侧或将内容对齐到左侧: 1 2 3 4 5
我想在下拉菜单中使用 jquery masonry,在复杂的下拉菜单中组织动态菜单项 block (图像和文本)。 我有几个问题。 首先,如果我从 display:none 开始,那么 masonry
我在使用passy masonry时遇到了这个错误。知道这是什么意思吗?因为现在基本上 masonry 对我根本不起作用。 提前致谢 最佳答案 我不确定您的问题的原因是什么,但我只是在处理同样的事情,
我是编程新手(javascript),但为了使我的 tumblr 主题正常工作,过去几天我做了很多研究。我知道我的问题很常见,但似乎我没有足够的知识来正确集成许多类似示例中给出的代码部分。 My th
我正在使用 masonry和 typekit .因此,我希望布局为 not have overlapping由于图像加载,同时 render the typekit fonts without hav
我在一个项目中成功地使用了 Passy 的 angular-masonry。 https://github.com/passy/angular-masonry 访问 Masonry 对象的事件函数的最
我在将砌体与 Foundation 网格布局集成时遇到问题。本质上,对于不同高度的相同宽度的图像,砌体按预期工作,但在某些断点处,网格只有两列布局,而不是通常的四列布局。 但是,如果您继续最小化浏览器
我正在使用 Handlebars http://handlebarsjs.com/和砖石https://masonry.desandro.com/获取一些 JSON 数据并使用 Jquery prep
我正在尝试在以下页面上获取每个内容: http://snowbird.camorada.com/test.php 以砖石格式查看,如下所示: http://masonry.desandro.com/d
我对最新版本的砌体有一个奇怪的问题。之前让它工作,但对于一个新项目,我下载了最新版本的 jQuery 和 Masonry,一切正常。由于插件中的错误,IE7 不会加载 Masonry 库。 我在 IE
如何每次执行我的函数 Masonry脚本重新组织元素,例如当窗口调整大小时? 在这个例子中,它只在第一次工作。 $(document).ready(function() { $('#conta
我一直在尝试 Masonry,但无法完全按照我的意愿工作。我使用的元素的宽度和高度各不相同,但都适合一个网格(4 种不同的尺寸,所有最小+边距的倍数)。我还计算了可以精确拟合的元素分布(最小的 7 个
我正在创建一个带阴影的砖石布局。但不幸的是,阴影被剪裁为以下片段。我知道放一些底部填充可以解决这个问题,但是这张卡片的内容可以不时改变,然后高度会根据内容改变。所以这里的问题需要一个纯 CSS 方法来
我在 WordPress 中使用砌体布局,因此我本地站点的砌体布局与循环放在一起。我创建了一个 fiddle 来解释我的问题。 如何控制一个项目在砌体布局中的位置? 我希望 div 始终位于砖石容器的
我让它工作,但由于某种原因它停止工作,我不知道我做了什么。盒子 div 向左浮动,我只是不知道我在哪里'出了问题。 Jquery var $container = $('.work');
我怎样才能让砖石更多地尊重这里的原始元素顺序?我希望顺序是海豚、鱼、无脊椎动物、鳍足类: var $container = jQuery('.tax-product_cat #content'); $
在目录站点上使用 Masonry。默认情况下,显示的项目按日期排序,然后按部件号排序。我的图像高度不同。问题是,如果我错了,请纠正我,Masonry 将第 2 行第 1 项设置在第 1 行中最短的项下
我是一名优秀的程序员,十分优秀!