【问题标题】:border-width in em - but set a minimum border-widthem 中的边框宽度 - 但设置最小边框宽度
【发布时间】:2019-03-14 23:13:20
【问题描述】:

我希望 div 具有相对于字体大小的边框宽度,因此我设置了例如 border-width: 0.1em;。但是如果字体太小,则不会出现边框,因为它被渲染为更小0.5px。这当然不是我想要的。有没有机会设置1px的最小边框宽度?

div {
    border: 0.1em solid black;
}

【问题讨论】:

  • 没有。边框使用像素。您可以使用 box-shadows 来模拟边框并在其上添加 em 空格。
  • 我认为没有理由不使用相对长度。你能证明吗?但是百分比不起作用。你能给我一个盒子阴影解决方案的例子吗? @Hiral 我添加了我使用的代码,但很明显。
  • 您也可以将thinmediumthick 用于border-width(只要它们与您的首选宽度匹配)。它们将随界面缩放。

标签: css width border minimum-size


【解决方案1】:

在 CSS3 中,如果您的浏览器支持,您可以尝试(ab)使用 max css 功能。

border-width: max(1px, 0.1em);
border-style: solid; 
border-color: black;

不幸的是,目前任何浏览器都不支持这个很棒的 CSS3 功能,但我希望这会很快改变!

但在 CSS2 中——不,你不能。
但是,您可以使用 JavaScript/jQuery 循环遍历所有元素并将边框大小增加到 1px。

但是,如果页面上有太多元素(例如,超过 50-100 行的表格),这会消耗太多性能,您的浏览器会崩溃。
所以换句话说,不,这是不可能的。

$("[id$='ReportViewerControl']").find('*')

    .each(function () {

        if($(this).is('#ParametersRowReportViewerControl *')) 
            return;

        //console.log("Processing an element");
        //var cls = $(this).attr("class");

        // Don't add a border to sort-arrow
        if ($(this).is('img')) {
            return;
        }

        var anywidth = $(this).css('width');
        var anywidth = parseFloat(anywidth);
        //console.log("anywidth: " + anywidth);


        //var lol = $(this).css('borderLeftWidth');
        var blw = $(this).css('border-left-width');
        var brw = $(this).css('border-right-width');
        var btw = $(this).css('border-top-width');
        var bbw = $(this).css('border-bottom-width');

        var borls = $(this).css('border-left-style') == "solid";
        var borrs = $(this).css('border-right-style') == "solid";
        var borts = $(this).css('border-top-style') == "solid";
        var borbs = $(this).css('border-bottom-style') == "solid";

        var blw = parseFloat(blw);
        var brw = parseFloat(brw);
        var btw = parseFloat(btw);
        var bbw = parseFloat(bbw);

        //parseInt($(this).css("borderRightWidth"))
        //console.log(parseInt($(this).css("borderLeftWidth")));

        // UpdateLock = true;


        // Set width to 1px where 0px
        if (anywidth == 0)
            $(this).css('width', '1px');

        if (borls && blw == 0.0 || (blw > 0.0 && blw < 1.0)) {
            //console.log("setting border width");
            $(this).css('border-left-width', '1px');
        }

        if (borrs && brw == 0.0 || (brw > 0.0 && brw < 1.0)) {
            $(this).css('border-right-width', '1px');
        }

        if (borts && btw == 0.0 || (btw > 0.0 && btw < 1.0)) {
            $(this).css('border-top-width', '1px');
        }

        if (borbs && bbw == 0.0 || (bbw > 0.0 && bbw < 1.0)) {
            $(this).css('border-bottom-width', '1px');
        }

        // UpdateLock = false;
    });           // End $('*').each

【讨论】:

  • 谢谢,min() 函数正是我所需要的,尽管它还不支持。
  • @luke:小心点,口语和数学的区别。您需要 max 函数,而不是 min 函数;)在 1px 和 0.1em 的边框宽度之间,因为边框的最小宽度为 1px(或更大),您需要选择两个值中的最大值!跨度>
  • 似乎 min/max 函数没有很好地记录:This 是我阅读更多关于它们的地方,但他们的例子是错误的。谢谢!顺便说一句,你为什么写虐待?该功能的实际用途是什么?
  • 备注:当你使用 sass 时,max() 方法不起作用,b/c sass 会覆盖原生 css 函数。有人知道这个问题的解决方案吗?
【解决方案2】:

看起来不同的浏览器以不同的方式处理小于 1px 的边框。在 Firefox 中,这样的边框呈现为 1px 宽,但在 Chrome 中它们消失了。另一方面,Chrome 似乎会呈现 box-shadow,即使它小于 1px,所以使用它而不是边框​​可能是一个好主意(克里斯蒂娜实际上是在对问题的评论中建议它)。再一次,如果box-shadow 太薄,某些浏览器将不会呈现它(Firefox 会这样做)。另外box-shadow 不添加盒子模型,因此可能需要使用额外的margin

这是克服这些问题的尝试。请注意,我不得不求助于 JavaScript userAgent 检测黑客(如果它是 webkit 浏览器,只需在 body 中添加一个额外的类),因为我无法单独使用 CSS 来实现它。

if (navigator.userAgent.toLowerCase().indexOf("webkit") > -1)
{
    document.body.className += " webkitHack";
}
/* Borders */

.border{
  border:0.0625em solid black;
}

.shadowyBorder{
  box-shadow: 0 0 0 0.0625em black;
  /* Compensating for the fact that box-shadow doesn't count towards box model */
  margin: 0.0625em;
}

.comboBorder
{
  /* If it's not webkit use border */
  border:0.0625em solid black;
}

/* If it's webkit use box-shadow */
.webkitHack .comboBorder
{
  border: none;
  box-shadow: 0 0 0 0.0625em black;
  /* Compensating for the fact that box-shadow doesn't count towards box model */
  margin: 0.0625em;
}

/* Extras */
td, th
{
  padding:5px;
}
.em05
{
  font-size:8px;
}

.em1
{
  font-size:16px;
}

.em2
{
  font-size:32px;
}

.box
{
  display:inline-block;
  height:1em;
  width:1em;
}
<table>
  <tr>
    <th>Font size</th><th>Border</th><th>Box shadow</th><th>Box shadow in webkit</th>
  </tr>
  <tr>
    <td>
      8px
    </td>
    <td class="em05">
      <div class="box border"></div>
    </td>
    <td class="em05">
      <div class="box shadowyBorder"></div>
    </td>
    <td class="em05">
      <div class="box comboBorder"></div>
    </td>
  </tr>
  <tr>
    <td>
      16px
    </td>
    <td class="em1">
      <div class="box border"></div>
    </td>
    <td class="em1">
      <div class="box shadowyBorder"></div>
    </td>
    <td class="em1">
      <div class="box comboBorder"></div>
    </td>
  </tr>
  <tr>
    <td>
      32px
    </td>
    <td class="em2">
      <div class="box border"></div>
    </td>
    <td class="em2">
      <div class="box shadowyBorder"></div>
    </td>
    <td class="em2">
      <div class="box comboBorder"></div>
    </td>
  </tr>
</table>

【讨论】:

  • 使用此方法可以从所有边重新创建边框或仅单个边重新创建边框,但要使用inset box-shadow 实现2 或3 边的边框组合可能需要额外的填充。
  • 看来当前版本的 Chrome 确实将比 1px 更薄的边框渲染为 1px,但是如果针对的是较旧的 webkit 浏览器(如 Android 4.x 上的 Android 浏览器等),此技巧可能仍然有用.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2018-01-29
  • 2017-05-28
  • 2022-01-17
  • 2010-12-11
  • 2021-06-10
  • 2013-09-13
相关资源
最近更新 更多