【问题标题】:Having troubles setting the appearance of a web control无法设置 Web 控件的外观
【发布时间】:2011-01-03 21:22:21
【问题描述】:

我正在尝试设置登录 Web 控件的外观,但我遇到了很多问题。据我所知,我已经正确设置了所有内容,但由于某种原因,控件仍然无法正确显示:


a) 两个 TextBox 控件(ID 为 UserNamePassword )的宽度应等于表格宽度的 70%,但实际上并非如此虽然我已经设置了它们的宽度属性。知道这是为什么吗?


b) 如果包含 lblPasswordlblPassword 控件的表格单元格的 text-align 属性设置为 center,则 lblPassword 和 lblPassword 溢出。这是为什么呢?


    <div id="loginbox">
       <asp:Login ID="Login1" runat="server" Width="100%" FailureAction="RedirectToLoginPage"
                    RememberMeSet="false">
                    <LayoutTemplate>
                        <table>
                            <tr>
                                <td style="padding:6px;text-align:center;">
                                    <asp:Label ID="lblUserName" Width="30%"  runat="server" Text="UserName "></asp:Label>
                                </td>
                                <td>
                                    <asp:TextBox ID="UserName" Width="70%" runat="server"></asp:TextBox>
                                </td>
                            </tr>
                            <tr>
                                <td style="padding:6px;text-align:center;" >
                                    <asp:Label ID="lblPassword" Width="30%" runat="server" Text="Password "></asp:Label>
                                </td>
                                <td>
                                    <asp:TextBox ID="Password" Width="70%" runat="server"></asp:TextBox>
                                </td>
                            </tr>
                        </table>
                    </LayoutTemplate>
                </asp:Login>

  #loginbox
  {
      position: absolute;
      top: 16px;
      right: 30px;
      width: 180px;
      height: 80px;
      padding: 2px 2px 2px 2px;    
      font-size: 9px;
      margin:0px;
  }


非常感谢


编辑:

这段代码告诉浏览器跨度应该比 TD 小 70%。告诉 TD 它应该是什么宽度的唯一元素是跨度,该跨度希望比 TD 小 70%。所以 TD 最终只是使用跨度内的文本来判断它应该有多大。

然后,这与我的文本框示例不同,因为据我了解您的论点,在上述情况下,跨度元素(即跨度内的文本)使用其默认宽度呈现,而 TD 将其宽度调整为比 span 的默认宽度大 70%?! 但是在 TextBox 控件的情况下,用于 TextBoxes 控件的宽度不是它们的默认宽度 D,而是它们的宽度也减小了(我们称之为减小的 TextBox 的宽度 W),因此 TD 并不比 D 大 70%,而是相反,TD 比 W 大 70%(其中 W


现在右侧的 TD 想要是行 (TR) 宽度的 70%,这与 TABLE 的宽度相同。在这种情况下,左侧的 TD 决定了表格的结束大小,因为它的内容应该占表格宽度的 30%。

为什么说左边的元素决定了表格的大小呢?左右 TD 不是都决定了表格的最终大小吗?


感谢队友


第二次编辑:


a) 我知道这两个单元格应该有相对于彼此的大小,但我不确定我是否理解 55px / 30% * 70% 如何给我们正确的结果?如果有的话,公式不应该是 55 * 100% / 30% (这里 55px 代表右侧单元格宽度的 30%)或 55 * 100% / 70% (这里 55px 代表左侧单元格宽度的 70%)?!


b) 如果这两个单元格中的 span 元素的宽度不相等怎么办?那么浏览器将如何计算两个单元格的宽度?


c) 我假设如果 table 指定了宽度,那么两个单元格的宽度将不是相对于彼此,而是相对于 table 的宽度?


感谢队友


第三次编辑:


A) 据我了解您的解释,浏览器按以下方式计算两个单元格的宽度:

  • 左侧单元格的宽度设置为某个值的 30%,公式 55px * 100% / 30% = 183px* 告诉我们左侧单元格的宽度(即 55px)是 183px 的 30%。

  • 这也意味着右侧单元格的宽度等于 183px 的 70%,即 183 * 70% / 100% = 124px。因此左右列的宽度分别为 183px 的 30% 和 183px 的 70%。


B)但我认为您在解释中使用的术语->“左右单元格的宽度应该彼此相对”

a) 左侧单元格的宽度应为右侧单元格宽度的 30%。由于左侧单元格的宽度为 55px,其中 55px 代表右侧单元格宽度的 30%,因此右侧单元格的宽度为 55px * 100% / 30% = 183 px

            OR

b) 右侧单元格的宽度应为左侧单元格宽度的 70%。由于右侧单元格的宽度为 55px,其中 55px 代表左侧单元格宽度的 70%,因此左侧单元格的宽度为 55px * 100% / 70% = 78px

【问题讨论】:

    标签: asp.net css xhtml webforms


    【解决方案1】:

    当文本框的宽度设置为 70% 时,它告诉浏览器元素应该是其容器宽度的 70%——在本例中为 TD。您应该做的是将 TD 的宽度设置为 70%,然后将文本框宽度设置为 100%。像这样:

    <td style="width: 70%;">
        <asp:TextBox ID="UserName" Width="100%" runat="server"></asp:TextBox>
    </td>
    

    对标签也这样做。


    回答cmets:

    考虑浏览器用来确定 TD 大小的事件顺序。如果您有以下情况:

    <html>
    <body>
    <table border="1">
        <tr>
             <td><span style="width: 30%;">ASDF</span></td>
             <td><span style="width: 70%;">ASDF</span></td>
        </tr>
    <table>
    </body>
    </html>
    

    这段代码告诉浏览器跨度应该比 TD 小 70%。告诉 TD 它应该是什么宽度的唯一元素是跨度,该跨度希望比 TD 小 70%。所以 TD 最终只是使用 span 内的文本来判断它应该有多大。

    切换到这个:

    <html>
    <body>
    <table border="1">
        <tr>
             <td style="width: 30%;"><span>ASDF</span></td>
             <td style="width: 70%;"><span>ASDF</span></td>
        </tr>
    <table>
    </body>
    </html>
    

    现在右侧的 TD 想要是行 (TR) 宽度的 70%,这与 TABLE 的宽度相同。在这种情况下,左侧的 TD 决定了表格的结束大小,因为它的内容应该占表格宽度的 30%。


    编辑 2

    浏览器将尝试解释 HTML 并显示它认为 HTML 正在尝试执行的操作,这是因为 HTML 格式不正确。像这样的代码没有意义&lt;td&gt;&lt;span style="width: 70%;"&gt;ASDF&lt;/span&gt;&lt;/td&gt;,因为跨度表示它希望比 TD 小 70%,但 TD 没有指定大小。因为它没有指定大小,所以它从内容中获取大小。最后,跨度的宽度值被忽略。你可以看到所有这些东西都会产生相同的输出:

    <td><span style="width: 1%;">ASDF</span></td>
    <td><span style="width: 70%;">ASDF</span></td>
    <td><span style="width: 200%;">ASDF</span></td>
    

    这是浏览器为此所做的简化版本:

    <td><span style="width: 70%;">ASDF</span></td>
    
    • 找到一个 TD
    • TD没有宽度,它的TR和TABLE也没有设置宽度,需要根据内容确定宽度。
    • 内容是跨度
    • SPAN 的宽度为 70%,因此 SPAN 应为 TD 宽度的 70%(记住这一点以备后用)
    • SPAN 包含纯文本、绘制文本和测量宽度,假设结果为 55 像素。
    • 告诉 SPAN 其宽度至少应为 55 像素(因为未设置溢出属性)。
    • 哪个值更大? 55 像素还是 TD 宽度的 70%? 55 像素 > 未定义
    • 将 SPAN 的宽度设置为 55 像素
    • 将 TD 宽度设置为 55 像素

    此时浏览器将返回 HTML,因为设置了父宽度,这将是计算元素大小的第二遍。

    • TD 的宽度为 55 像素
    • SPAN 的宽度为 70%,因此 SPAN 应为 TD 宽度的 70%
    • 哪个值更大? 55 像素还是 TD 宽度的 70%? 55 像素 > 39 像素
    • 将 SPAN 的宽度保持在 55 像素
    • 检查文本的宽度,没有变化
    • 检查 SPAN 的宽度,没有变化
    • 检查 TD 的宽度,没有变化

    所以此时浏览器已遍历 HTML,然后返回 TD,进行更改,然后再次返回。

    在计算一行中多个单元格的宽度时会发生相同类型的过程。在这个例子中:

    <tr>
    <td><span style="width: 30%;">ASDF</span></td>
    <td><span style="width: 70%;">ASDF</span></td>
    </tr>
    

    每个 TD 分别计算出它的宽度并导致每个 55px,因为没有任何东西告诉 TD 他们应该有相对于彼此的大小。

    切换到下面的代码,突然间每个 TD 的宽度都为 55px,但随后样式通知浏览器它们应该是相对的。所以右列得到了一些额外的像素,最终达到 55px / 30% * 70% = 128 像素

    <tr>
    <td style="width: 30%;"><span>ASDF</span></td>
    <td style="width: 70%;"><span>ASDF</span></td>
    </tr>
    

    为什么浏览器使用左列来确定右列的大小?简单的浏览器会以两种方式计算它,并找出哪种方式仍然符合 TD 指定的最小宽度。此计算将导致左列宽度小于其内容所需的最小宽度:55px / 70% * 30% = 24 像素


    要回答您的第二次编辑,a/b - 浏览器通常必须以两种方式计算它,然后在给定约束的情况下确定哪种方式更有意义。它可能有复杂的算法来确定它是否真的需要查看您的意思是 30% 是左侧的约束还是 70% 是右侧的决定性约束。此外,如果你将某个值乘以 100%,它不会改变,因为它与乘以 1 相同。所以 55px * 100% / 30%(或 55 * 1 / 0.3)与 55px / 30% 相同(或 55 / 0.3)。

    您应该考虑以不同的方式处理这些类型的问题。构建 HTML 之后,如果默认值不是您想要的,您需要明确浏览器应该如何处理大小和间距。如果您只是将某个值设置为 30%,那么您可能没有为浏览器提供足够的信息来做出一致的选择。即使有一个 HTML 规范说明应该发生什么,也并不总是很清楚。不同的浏览器实现它的方式也不同,因为浏览器可能要经过 100 多个步骤来布局页面。

    例如,在您的原始示例中,如果默认大小不够,标签和文本框应该有像素宽度以正确适应您的图形设计。做任何其他事情都是让浏览器来解决它,因为 html 元素缺乏足够的上下文来保持一致。

    要了解浏览器在不同场景中的作用,只需尝试制作一个小 html 页面,将所有未测试的内容都去掉。然后一个接一个地调整直到有意义,这是在浏览器中学习像表格布局这样复杂的东西的唯一方法。如果发生的事情与您认为应该发生的事情相反,请在本网站的新问题中发布示例,然后有人会将您指向解释应该发生的事情的 HTML 规范。我推荐这个网站: http://www.w3schools.com/html/html_tables.asp
    http://www.w3schools.com/html/tryit.asp?filename=tryhtml_tables

    【讨论】:

    • 表格单元格 ( ) 的宽度从何而来?意思是,如果我没有明确设置表格单元格的宽度并且如果表格单元格中的填充设置为零,那么表格单元格的宽度不应该等于(或只是稍大)的宽度它包含的元素?
    • 我将在上面的答案中添加我的评论,因为这里没有足够的空间。
    • 为了回应您的回复,我已经编辑了我的初始帖子...抱歉一直拖着这个
    • 我很抱歉这么厚。无论如何,我已经在我最初的帖子中添加了第二个编辑......以防你还没有放弃我的豌豆大脑
    • +1 以获得对浏览器如何确定如何绘制界面的详尽解释。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签