УСБ калькулятор альтернативные
Я пытаюсь динамично изменить ширину 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 ответов:
почти всегда
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
.