УСБ калькулятор альтернативные


Я пытаюсь динамично изменить ширину div с помощью CSS и без jquery. следующий код будет работать в следующих браузерах: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?

6 66

6 ответов:

почти всегда box-sizing: border-box может заменить правило calc, такое как calc(100% - 500px) используется для разметки.

например:

если у меня есть следующие разметки:

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

вместо этого: (предполагая, что боковая панель имеет ширину 300 пикселей)

.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)

Ширина Демо

Высота Демо

Я только что нашел этот пост из блога пола Айриша, где он также демонстрирует размер коробки как возможную альтернативу для простых выражений calc (): (полужирный мой)

один из моих любимых вариантов использования, который хорошо решает border-box,-это столбцы. Я возможно, вы захотите разделить мою сетку с 50% или 20% столбцов, но хочу добавьте прокладку через px или em. без предстоящего calc CSS() это невозможно... если вы не используете border-box.

Примечание: вышеприведенный метод действительно выглядит так же, как и соответствующий оператор calc (). Однако есть разница. При использовании правила calc () значение ширины содержимого div фактически будет 100% - width of fixed div, однако с вышеуказанным методом, фактическая ширина содержания div полная ширина 100%, но она имеет внешний вид "заполнения" оставшейся ширины. (что, вероятно, достаточно хорошо для того, чтобы хотеть, чтобы большинство людей нуждались здесь)

что сказал, Если это важно что ширина div контента на самом деле 100% - fixed div width тогда может быть использован другой метод, который использует контексты форматирования блоков (см. здесь и здесь для подробностей):

1) поплавок фиксированная ширина div

2) set overflow:hidden или overflow:auto на содержание div

демо

просто есть запасной вариант, прежде чем calc сделает трюк.

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

Смотрите больше здесь https://developer.mozilla.org/en-US/docs/Web/CSS/calc

использовать

    .content
{
    width: 100%;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    padding-right: 500px;
    margin-right: -500px;
}

просто потратил большую часть 3 часов, пытаясь обойти это для конкретного случая на устройствах andriod, не мог заставить размер коробки работать, поэтому я связал его с моим 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, используя это...

измените ширину # menuLog с % или px, и вы увидите магию. Работает с каждым устройством даже

*{
	-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>

Я хотел добавить альтернативу no-calc, no-border-box (т. е. CSS2).

элементы блока нормального потока изначально имеют width: auto, что фактически является шириной содержащего блока минус ширина поля, границы и заполнения.

The пример выше можно сделать, без рамки-коробки, просто как

.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.