【问题标题】:Layout fix with images rendered via dynamic image handler通过动态图像处理程序渲染的图像的布局修复
【发布时间】:2011-04-19 13:21:32
【问题描述】:

我正在使用 httphandler 来动态调整页面上呈现的图像的大小。我有一个所有图像都必须确认的预设宽度 - 图像的高度可能会有所不同(比例限制为原始宽度和高度)。我正在缓存图像 - 但是,当它们最初加载时,会在页面渲染后调用 httphandler - 因此对于较长的图像 - 有时在初始加载时,布局会因较大的图像与下面的内容重叠而中断。这是来自http://www.teakmonkeystudios.ca/photos/photo.aspx?id=10801的示例截图:

这是css:

.gallery
{

    margin-left:0px;
    padding-left:5px;
}


ul.gallery div.top_frame
{
       width:732px
}


ul.gallery div.view_frame
{
    margin-left:5px;
}

ul.gallery div.image_frame
{
    border: 1px solid #dddddd; padding-top: 5px; height:100%; min-height:490px;
    padding-bottom: 5px; text-align: center;
}

ul.gallery div.button_frame
{
    width: 732px; text-align: right; margin: 4px 0px 0px 0px;
}


ul.gallery div.name_frame, ul.gallery div.original_name_frame
{

    margin: 0px 0px 0px 5px;
}

ul.gallery div.name_frame h2
{
    margin: 2px 0px 3px 0px;
    padding: 0px;

}

ul.gallery div.date_frame
{
    margin-left:5px;
    margin-bottom:5px;
}

ul.gallery div.update_frame
{
    width: 732px; margin-bottom: 5px; margin-top: 5px;text-align:right;
}



ul.gallery div.desc_frame
{
    margin-left:5px;
    background-color:#eeeeee;

}

ul.gallery li
{
     width: 732px;

     display: -moz-inline-stack;
     display: inline-block;
     vertical-align:top;
     margin: 5px;
     zoom: 1;
     *display: inline;
     _height:100%;
      color:#000000;
      letter-spacing:0px;
      line-height:normal;

} 

ul.breadcrumbs li
{
    float:left;

    margin:0px;
    padding:0px;
    width:100%;
}

ul.breadcrumbs li a
{
    font-size:12px;
}

由于下面屏幕截图中的图像可能被缓存,您可能看不到损坏的布局。我想知道在表格中渲染图像是否会更好?还是有css修复?我什至尝试过 Jquery 并使用准备好的文档来调整图像容器的高度 - 但图像可能未加载 - 所以我无法在函数中返回图像的高度。有关如何解决此问题的任何建议?

【问题讨论】:

标签: c# asp.net css image-scaling


【解决方案1】:

如果您的图像都将具有相同的宽度,请输出带有宽度属性的 IMG 标记。这可能会有所帮助。

<img src="..." width="720">

在这种类型的应用程序中使用input type="image" 有点奇怪。为什么不直接在图像周围使用 A 标记?

【讨论】:

  • 我会尝试使用宽度属性。我还在考虑将图像包装在超链接中。我为这个实例使用了一个图像按钮,因为我想在点击事件上执行代码。
  • 这具有掩盖问题的不幸副作用,通过发送大图像来增加网站流量,而较小的图像可能就足够了,并允许网络浏览器进行大小调整。这不是解决方案,最多是一种解决方法。
【解决方案2】:

这是解决你问题的关键:

但是,当它们最初被加载时,在页面渲染后会调用 httphandler

IHttpHandler 在响应发送到浏览器之前看到请求,并且可以做任何需要的事情,包括使用调整大小的图像进行响应。我经常这样做,从来没有遇到过问题。由于它对你不起作用,我 100% 认为你的 HttpHandler 中存在错误。

【讨论】:

  • 如果我使用动态图像自定义控件将字符串呈现给浏览器 - 它会调用 httphandler 根据从字符串中提取的信息来处理图像。在将字符串呈现给浏览器之前,不会调用该请求(针对动态图像)。我这里是不是错了?
  • 浏览器如何获取它的标记并不重要。在某些时候,它需要使用 URL 从服务器请求图像。 IHttpHandler 拦截该请求并可以在标准处理完成之前对其进行处理。但我不认为这是你的问题。我点击了指向您网站的链接,此处显示的绿色元素是一个 DIV,不包含任何类型的图像,甚至不包含 CSS 背景图像!您能指出未正确调整大小的图像的名称吗?给我它是ID
  • 重新思考这个问题 - 你提到你经常使用动态图像并且没有看到这个问题。在我的自定义控件中,字符串被呈现为图像 url: src="../controls/cachedimageservice.axd?data=db_10801_h720_w720_t0 - 然后该请求被处理程序拦截并检查缓存(如果找不到则创建图像在缓存中)。如果我首先在自定义控件的 prerender 方法中创建缓存图像 - 我似乎没有遇到这个问题。我假设你在动态创建图像时缓存图像 - 在管道中的位置你在召唤他们吗?
  • IHttpHandler 只提供一个处理请求的地方,别无选择:在 ProcessRequest 中进行。除非您将其他东西称为 HttpHandler。
【解决方案3】:

如果我创建图像并将其加载到自定义图像的预渲染事件中的缓存中 - 它似乎已经解决了这个问题。最初,控件将图像信息呈现给浏览器中的 src 字符串,然后图像被调用缓存管理器的 httphandler 拦截(如果存在 - 返回,如果不存在 - 创建)。由于上述问题似乎仅在最初创建图像时发生 - 我认为在它被“请求”之前重新创建它可能会有所帮助 - 而且它似乎有。如果对此有后果 - 我将编辑我的解决方案。

【讨论】:

  • 在预渲染事件中创建图像改善了这种情况,但不是解决方法——因为在测试中我仍然看到像上面那样的损坏布局。我认为这确实是一个 css 问题,我现在正在将图像渲染到表格中。如果这能解决问题,我会回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 2018-12-26
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多