71

我正在尝试使用 CSS 而没有 jquery 动态更改 div 的宽度。以下代码适用于以下浏览器:http ://caniuse.com/calc

/* Firefox */
width: -moz-calc(100% - 500px);
/* WebKit */
width: -webkit-calc(100% - 500px);
/* Opera */
width: -o-calc(100% - 500px);
/* Standard */
width: calc(100% - 500px);

我还想支持 IE 5.5 及更高版本,我发现了以下内容:表达式。这是正确的用法吗:

/* IE-OLD */
width: expression(100% - 500px);

我还可以支持 Opera 和 Android 浏览器吗?

4

6 回答 6

119

几乎总是box-sizing: border-box可以替换诸如calc(100% - 500px)用于布局的计算规则。

例如:

如果我有以下标记:

<div class="sideBar">sideBar</div>
<div class="content">content</div>

而不是这样做:(假设侧边栏是 300px 宽)

.content {
  width: calc(100% - 300px);
}

做这个:

.sideBar {
     position: absolute; 
     top:0;
     left:0;
     width: 300px;
}
.content {
    padding-left: 300px;
    width: 100%;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

* {
  margin: 0;
  padding: 0;
}
html,
body,
div {
  height: 100%;
}
.sideBar {
  position: absolute;
  top: 0;
  left: 0;
  width: 300px;
  background: orange;
}
.content {
  padding-left: 300px;
  width: 100%;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  background: wheat;
}
<div class="sideBar">sideBar</div>
<div class="content">content</div>

PS:我不会在 IE 5.5 中工作(哈哈哈),但它可以在 IE8+、所有移动设备和所有现代浏览器(caniuse)中工作

宽度演示

高度演示

我刚刚从 Paul Irish 的博客中找到了这篇文章,他还展示了 box-sizing 作为简单 calc() 表达式的可能替代方案:(粗体是我的)

我最喜欢的边界框很好解决的用例之一是列。我可能想用 50% 或 20% 的列来划分我的网格,但想通过 px 或 em 添加填充。如果没有 CSS 即将推出的 calc() ,这是不可能的……除非你使用 border-box

注意:上述技术确实看起来与相应的 calc() 语句相同。不过还是有区别的。当使用 calc() 规则时,内容 div 的宽度值实际上是100% - width of fixed div,但是使用上述技术,内容 div 的实际宽度是完整的 100% 宽度,但它具有“填充”的外观剩余的宽度。(这可能足以满足大多数人的需求)

也就是说,如果内容 div 的宽度实际上很重要100% - fixed div width, 那么可以使用一种不同的技术 - 它利用块格式化上下文 - 可以使用(有关血腥细节,请参见此处此处):

1)浮动固定宽度的div

2)设置overflow:hiddenoverflow:auto在内容div上

演示

于 2013-09-02T10:03:38.990 回答
36

在 calc 起作用之前有一个后备。

width: 98%;               /* fallback for browsers without support for calc() */
width: calc(100% - 1em);

在此处查看更多信息https://developer.mozilla.org/en-US/docs/Web/CSS/calc

于 2013-09-02T09:54:26.613 回答
17

用这个

    .content
{
    width: 100%;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    padding-right: 500px;
    margin-right: -500px;
}
于 2013-11-12T06:49:01.887 回答
0

刚刚花了 3 个小时的大部分时间尝试在 Android 设备上针对特定情况解决此问题,但无法让盒子大小正常工作,所以我将其链接到我的 JS 作为一个肮脏的解决方法......虽然不需要 jQuery!:)

采用 andriod 2.3 上的工作代码。

<div class="sessionDiv" style="width:auto;">
<img> <!-- image to resize -->
</div>
<div class="sessionDiv" style="width:auto;">
<img> <!-- image to resize -->
</div>

带有事件监听器的 JS

var orient =
{
    orientation:window.orientation,
    width: window.innerWidth,
    check: function()
    {
        // if orientation does not match stored value, update
        if(window.orientation !== this.orientation)  
        {
            this.orientation = window.orientation; //set new orientation
            this.width = window.innerWidth; //set new width
            this.adjustIrritatingCSS(this.width); //change ui to current value
        }
        //if width does not match stored value, update
        if(window.innerWidth !== this.width)
        {
            this.width = window.innerWidth; //set new width
            this.adjustIrritatingCSS(this.width); //change ui to current value
        }
    },
    adjustIrritatingCSS: function(screenWidth)
    {   
    //disgusting workaround function
        var titleBoxes = document.getElementsByClassName('sessionDiv'); 
        var i = titleBoxes.length;
        var sessWidth = screenWidth - 300; // calc(100% - 300px); -> equivalent
        while(i--)
        {
            titleBoxes[i].style.width = String( sessWidth + "px"); 
            //resize image in auto sized div
        }
        sessWidth = null; //clear width
        titleBoxes = null; //clear nodelist
        i = null; // clear index int
    }
};

window.onload = function()
{
    window.addEventListener('resize', function(){orient.check();}); 
    //on resize, check our values for updates and if theres changes run functions
    window.addEventListener('orientationchange', function(){orient.check();});
    //on rotate, check our values for updates and if theres changes run functions
    setInterval(function(){orient.check();}, 2000);
    //occasionally check our values for updates and if theres changes run functions(just incase!!)
    orient.adjustIrritatingCSS(orient.width); 
    //sets value on first run
};

希望这可以帮助那些无法让盒子尺寸工作的人!PS我在使用这个iOS时遇到了问题......

于 2014-04-10T08:18:19.527 回答
0

我想添加 no-calc、no-border-box(即 CSS2)替代方案。

正常流块元素最初具有width: auto,它实际上是包含块的宽度减去边距、边框和填充宽度。

上面的例子可以在没有边框的情况下完成,就像

.content {
    padding-left: 300px;
}

同样,与

.content {
  margin-left: 1px;
  border-left: 1em solid;
  padding-left: 1rem;
}

有效宽度为100% - 1px - 1em - 1rem

对于绝对定位的元素,height: auto具有相似的属性:

.content {
  position: absolute;
  top: 0;
  bottom: 0;
  margin-bottom: 1px;
  border-bottom: 1em solid;
  padding-bottom: 1rem;
}

这里的有效高度是100% - 1px - 1em - 1rem

于 2017-08-11T03:04:49.210 回答
0

使用 % 或 px 更改#menuLog 宽度,您将看到神奇的效果。适用于所有设备,甚至 < 2.3

*{
	-moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
}
#menuLog{
  width:30%;
  /*width:300px;*/
	height: 60px;
	padding: 5px;
	background-color: #ddd;
}
#menuLog > div[inline-log="1"]{
	display: inline-block;
	vertical-align: top;
	width: 100%;
	height: 100%;
	margin-right: -60px;
}
#menuLog > div[inline-log="1"] > div[inline-log="1.1"]{
	margin-right: 60px;
	height: 100%;
	background-color: red;
}
#menuLog > div[inline-log="2"]{
	display: inline-block;
	vertical-align: top;
	width: 60px;
	height: 100%;
}
#menuLog > div[inline-log="2"] > div[inline-log="2.1"]{
	display: inline-block;
	vertical-align: top;
	width: 55px;
	height: 100%;
	background-color: yellow;
	margin-left:5px;
}
<div id="menuLog">
  <div inline-log="1">
    <div inline-log="1.1">
      One
    </div>
  </div><div inline-log="2">
     <div inline-log="2.1">
      Two
     </div>
  </div>
</div>

于 2017-03-23T22:37:11.510 回答