Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Ширина блока равна высоте экрана разных девайсов (https://javascript.ru/forum/events/51669-shirina-bloka-ravna-vysote-ehkrana-raznykh-devajjsov.html)

learner 15.11.2014 04:56

Ширина блока равна высоте экрана разных девайсов
 
Я только собираюсь учить JS и практически ничего не знаю по этой теме, прошу помочь в одном вопросе
Его суть, - существует некий nav:
HTML:
<div id="page">
	<div id="wrap">
		<nav id="nav">
			<ul> 
				<li><a></a></li>
				<li><a></a></li> 
				<li><a></a></li> 
				<li><a></a></li> 
				<li><a></a></li>
			</ul>
		</nav>
	</div>
</div>

CSS:
Код:

#page {
      max-width: 100em;  /*1em=10px*/
      margin: 0 auto;
}

#wrap {
      width: 92%;
      margin: 0 auto;;
}

#nav {
      height: 5.5em;
}
       
#nav li {
      width: 20%;
      height: 5.5em;
      float: left;
}

При ширине экрана в 320рх я его переворачиваю:
Код:

@media (max-width: 320px) {
        #nav {
                height: 20px;
                position: fixed;
                top: 0;
                left: 0;
                transform-origin: 0 0;
                transform: translateX(20px) rotate(90deg);
        }

        #nav li {
                height: 20px;
        }
}

Задача стояла, как сделать nav резиновым по отношению к высоте окна, можно написать #nav{width: 100vh;}, но единицы vw и vh не кроссбраузерное решение.
Нашёл здесь на форуме такой ответ на вопрос, как присвоить высоте div значение window.innerHeight.
<script type="text/javascript">
    onload = function() {
        var div  = document.getElementById("nav");
        var html = document.documentElement;
        div.style.height = html.clientHeight + "px";
              
        onresize = function() {
            div.style.height = html.clientHeight + "px";
        };
    }
</script>

Переписал скрипт вот так:
<script type="text/javascript">
    onload = function() {
            var div  = document.getElementById("nav");
            var html = document.documentElement;
            div.style.width = html.clientHeight + "px";
              
            onresize = function() {
                div.style.width = html.clientHeight + "px";
            };
       }
</script>

И вот так:
<script type="text/javascript">
        onload = function() {
            var div  = document.getElementById("nav");
            var html = document.documentElement;
            div.style.width = window.innerHeight + "px";
              
            onresize = function() {
                div.style.width = window.innerHeight + "px";
            };
       }
</script>

И оба моих варианта работают во всех браузерах FF, Chrome, Safari, Opera, IE9. Но есть два вопроса, во-первых, как сделать так, чтобы скрипт срабатывал только при медиа-запросе и только при ширине окна 320px и меньше и во-вторых, какой из двух моих вариантов скрипта надёжней, если так можно выразиться. Надеюсь на ответ.

krasovsky 17.11.2014 08:40

Как ты сделаешь при медиа-запросе? Никак. На window.onresize проверяй ширину экрана и исполняй соответственно.

learner 18.11.2014 20:30

Цитата:

Сообщение от krasovsky
На window.onresize проверяй ширину экрана и исполняй соответственно

Во-первых большое спасибо за ответ, но я пока мало что в JS смыслю, каков синтаксис такого выражения?
onresize = function() {
                div.style.width = window.innerHeight + "px";
           };

я по-дилетански пробовал так:

div.style.width320px = window.innerHeight + "px";

и так;

div.style.width.320 = window.innerHeight + "px";

не работает, как я понимаю, из-за моего безграмотного синтаксиса.

krasovsky 19.11.2014 08:32

Вот
http://jsfiddle.net/czo3c2er/

learner 19.11.2014 23:46

Цитата:

Сообщение от krasovsky (Сообщение 341701)

Спасибо за ответ, Ваш скрипт работает, но это не то, что мне нужно. В Вашем скрипте блок, с заданными шириной и высотой подстраивается под искусственно изменённое окно. То есть, при загрузке страницы получаем блок с первичными параметрами, а если мышью изменить размер окна, то блок растянется на всю его площадь.
У меня же стоит задача для адаптивного дизайна, и тут речь идёт о первоначальной загрузке когда блок, ставший из горизонтального положения в вертикальное за свою ширину должен взять высоту окна просмотра того девайса, но который он загрузится. тут дело не в ресайзе окна мышью.
Повторюсь, вот скрипт, который это делает, он переписан мною методом тыка с другого скрипта, но он работает.
onload = function() {
            var div  = document.getElementById("nav");
            var html = document.documentElement;
            div.style.width = window.innerHeight + "px";
       }

Для решения не хватает лишь задать ему условие ширины окна при котором он ширине nav придаст высоту окна. Как его переписать так, чтобы он срабатывал только при ширине окна 320рх и меньше?
Не знаю правильно ли я понял Ваш ответ и грамотно ли объяснил мой вопрос.

krasovsky 20.11.2014 07:48

Так а в чем проблем?
Проверяй каждый раз при загрузке страницы ее ширину
window.onload = function(){
if (window.innerWidth >= 320) {
div.style.width = window.innerHeight + "px";
}
}

learner 21.11.2014 01:34

Так вот проблема в том. что в такой Вашей транскрипции:
window.onload = function(){            
            if (window.innerWidth >= 320) {
            div.style.width = window.innerHeight + "px";
            }
    	}

скрипт не работает, как я думаю, не может найти объект к которому применить своё действие, а если я добавляю строку с id:
window.onload = function(){ 
           var div  = document.getElementById("nav");
            if (window.innerWidth >= 320) {
            div.style.width = window.innerHeight + "px";
            }
    	}

то он срабатывет, но не только при ширине окна 320, но при всех больших разрешениях. Правда при разрешении меньше 320 уже всё ок.
В редакции без Вашей новой строки
if (window.innerWidth >= 320)

он при любых разрешения экрана находил nav и присваивал его ширине высоту экрана.

krasovsky 21.11.2014 09:39

Ну ясное дело, что переменную div надо определить сначала. Я привел пример просто а не полный код, кроме того почему бы тебе не заменить ">" на "<" самостоятельно?

learner 22.11.2014 07:05

Дело в том, что как я писал выше, я только буду учить js и его синтаксис для меня пока ещё тёмный лес, теперь, благодаря Вам я уже знаю, что >= это больше или равно, а это <= меньше или равно. :)
Ещё раз спасибо Вам за Ваше терпение и ответы.
В таком виде:
window.onload = function(){
    var div  = document.getElementById("nav");
        if (window.innerWidth <= 320) {
            div.style.width = window.innerHeight + "px";
        }
}

всё работает, но если иметь в виду ещё и ресайз окна по вертикали, я написал вот так:
window.onresize = function(){
    var div  = document.getElementById("nav");
        if (window.innerWidth <= 320) {
            div.style.width = window.innerHeight + "px";
        }        
}

это работает. Но я не знаю, должны ли эти записи быть телом одного скрипта, телом одного JS-документа при подключении из внешнего файла или это два разных скрипта с самостоятельным подключение для каждого? Работают все варианты, даже так:
window.onload = function(){
    var div  = document.getElementById("nav");
        if (window.innerWidth <= 320) {
            div.style.width = window.innerHeight + "px";
        }
window.onresize = function(){
    var div  = document.getElementById("nav");
        if (window.innerWidth <= 320) {
            div.style.width = window.innerHeight + "px";
        }        
}
}

И ещё один вопрос, если позволите. При ресайзе окна по ширине, с 320рх на большую, когда nav становится в своё исходное горизонтальное положение, то без перезагрузки страницы он всё ещё принимает высоту окна, в качестве своей ширины. Я попытался это исправить, не зная возможно ли это в принципе:
window.onresize = function(){        
    var div  = document.getElementById("nav");
        if (window.innerWidth > 320) {
            div.style.width = parent.style.width + "px"; // мои каракули
        }
}

Не работает.
Ширина nav при ширине экрана больше чем 320рх у меня 100% ширины своего родителя #wrapp. Пробовал взять переменную wrapper:
div.style.width = wrapper.style.width + "px";

Так тоже не работает, ширина всего окна мне не подойдёт, так как #wrapp уже, и его ширина меняется при разных разрешениях экрана.

krasovsky 24.11.2014 07:43

По первому вопросу, конечно же код не должен повторятся, оберни в функцию и используй когда нужно
myFnc = fucntion(){
        var div  = document.getElementById("nav");
        if (window.innerWidth > 320) {
            div.style.width = parent.style.width + "px"; // мои каракули
        }
}
window.onload = myFnc();
window.onresize = myFnc();

Вроде можно даже так "window.onload = window.onresize = myFnc();", не знаю не проверял.

По второму можно дописать
if (window.innerWidth <= 320) {
        div.style.width = window.innerWidth + "px"; 
 }
 else {
        div.removeAttribute('style');
 }

Этот способ убирает инлайн-атрибут style, снимая стили навешанные через js и написаные прямо в html

learner 25.11.2014 22:49

Хотите верьте, хотите нет. Написал как Вы предложили:
myFnc = function(){
    var div  = document.getElementById("nav");
        if (window.innerWidth <= 320) {
            div.style.width = window.innerHeight + "px";
        }             
}   //здесь нужна точка с запятой?
window.onload = myFnc();
window.onresize = myFnc();

Всё работало, и при подключении скрипта в head и из внешнего файла, при чём так:
window.onload = window.onresize = myFnc(); тоже работало.
Потом решил попробовать перестроить дизайн и изменил ширину экрана для начала трансформации nav с <= 320 на <= 600 и уже никак не работает, не из head, не из внешнего файла. Вернул на <= 320, хотя это уже шаманство, не заработало. В итоге работает только так:
window.onload = function(){
    var div  = document.getElementById("nav");
        if (window.innerWidth <= 320) {
            div.style.width = window.innerHeight + "px";
        }             
}

window.onresize = function(){
    var div  = document.getElementById("nav");
        if (window.innerWidth <= 320) {
            div.style.width = window.innerHeight + "px";
        }             
}

Как же с этим быть, если в скриптах повторятся? Редактор и меня phpDesigner8 в связке с Denver3.
Что же касается способа удаления стилей навешанных через js:
if (window.innerWidth > 320) {
    div.style.width = window.innerHeight + "px";
}
else {
    div.removeAttribute('style');
}

то при увеличении ширины окна nav это срабатывает, но если отыграть назад, то nav уже не растягивается на всю высоту окна, причём то же и при ресайзе окна по высоте. Перезагрузка страницы не помогает, выходит, что вариант с удалением атрибута 'style' вообще блокирует работу скрипта. Перепробовал все варианты:
div.removeAttribute('style');
div.removeAttribute('style.width');
div.removeAttribute('width');
div.removeAttribute('window.innerHeight);

krasovsky 26.11.2014 08:00

Цитата:

Сообщение от learner
Вернул на <= 320, хотя это уже шаманство, не заработало.

Незнаю что тебе тут еще сказать.....смотри что ты НЕПРАВИЛЬНО сделал, разбирайся. Открой консоль и работай с ней.

Ты кстати смотришь что вообще пишешь?
if (window.innerWidth > 320) {//если ширина окна БОЛЬШЕ 320
div.style.width = window.innerHeight + "px";//задать ширину дива ширине экрана

И это при том что у тебя выше код
window.onresize = function(){
var div = document.getElementById("nav");
if (window.innerWidth <= 320) {если ширина окна МЕНЬШЕ 320
div.style.width = window.innerHeight + "px";//задать ширину дива ширине экрана
}
}

??

Цитата:

Сообщение от learner
что вариант с удалением атрибута 'style' вообще блокирует работу скрипта

Не выходит

Цитата:

Сообщение от learner
div.removeAttribute('style.width');
div.removeAttribute('width');
div.removeAttribute('window.innerHeight);

??

learner 27.11.2014 02:45

Цитата:

Сообщение от krasovsky
Не знаю что тебе тут еще сказать.....смотри что ты НЕПРАВИЛЬНО сделал, разбирайся.

Ну, не знаю, я уже думал, что может мой редактор после многократного редактирования скрипта оставил какие-то вспомогательные символы, из-за которых скрипт читается с ошибками. Короче, взял новый документ и написал всё заново, но вариант с оборачиванием в функцию, не работает ни в одном браузере, а вот так:
window.onload = function(){
    var div = document.getElementById("nav");
    if (window.innerWidth <= 320){
        div.style.width = window.innerHeight + "px";
    }
}
window.onresize = window.onload;

работает с одним лишь только но. В Opera(12.17) при старом условии <= 320, тоже всё ок, но если его изменить на любое другое, то скрипт работает только при подключении в head. Причём, если сузить окно до прежнего <= 320, то работает, перезагрузишь страницу, снова отказ, вот такая вот ерунда, но это не критично.
Вы можете мне подсказать как написать такую строку на js?
var div = document.getElementById("nav");
	if (window.innerWidth > 320) {
	    div.style.width = снова равна 100% ширине #wrap;
	}

Это уже последняя просьба и, в любом случае, ещё раз спасибо за Ваши ответы, они мне очень помогли.:)

krasovsky 28.11.2014 08:05

Я лично уже запутался. Опиши какая конкретно задача у тебя стоит?
Если только менять ширину блока под разные разрешения экрана - так с эти замечательно справиться css media queries. И не нужно никакого js вообще.
@media (max-width:320px) {
   #nav {
      width:320px;
      //или
      width:100%;
   }
}

При этом ширина предка #nav должна естественно равняться ширине экрана.

learner 29.11.2014 03:30

Цитата:

Сообщение от krasovsky
Я лично уже запутался.

Смотрите, есть nav, который располагается обычно, то есть горизонтально, его ширина 100% ширины #wrap и, разумеется, для адаптивного дизайна я использую медиа-запросы. При ширине экрана 320px я его переворачиваю на 90 градусов и при помощи fixed прижимаю к верхнему левому углу экрана и он становится узкой полосой параллельно скроллингу, просто такое дизайнерское решение.
Задача была, и которая благодаря Вам уже решена, чтобы nav, при ширине окна 320рх и меньше, в качестве своей ширины принимал высоту окна, тогда он будет резиновым на любом устройстве, с любой высотой viewport.
Вот код устанавливающий nav в положение параллельно скроллингу:
@media (max-width: 320px) {
#nav { 
                height: 20px;
                position: fixed;
                top: 0;
                left: 0;
                transform-origin: 0 0;
                transform: translateX(20px) rotate(90deg);
            }
}

Вот скрипт, отредактированный Вами, который делает его резиновым в этом перевёрнутом положении:
window.onload = function(){
	    var div = document.getElementById("nav");
	    if (window.innerWidth <= 320){
	        div.style.width = window.innerHeight + "px";	    }
	}
window.onresize = window.onload;

window.onresize = window.onload; Эта строка, делает nav резиновым при ресайзе окна по высоте (только по высоте, ширина 320рх!) без перезагрузки страницы. Осталось только сделать так, чтобы при ресайзе окна по ширине с 321рх и больше, nav, за свою ширину снова принял своё старое значение ширины, а именно, 100% ширины #wrap.
Я ведь, только при ширине 320рх и меньше его переворачиваю, а при 321рх и больше действуют старые правила, где он горизонтальный и значение высоты окна мне уже не нужно.
Как я понимаю, это условие должно выглядеть так:
if (window.innerWidth > 320) {
	        div.style.width = снова равна 100% ширине #wrap; 
	    }

А я, как Вы знаете, мало что пока понимаю в этом вопросе.
снова равна 100% ширине #wrap, как вот такую строку, или строку с более грамотно сформулированной задачей, прописать на JS?

krasovsky 01.12.2014 14:43

Можно попробовать что то типо этого
if (window.innerWidth <= 320){
     div.style.width = window.innerHeight + "px";        
}
else {
    div.style.width = '100%'; //если ширина не <= 320 установить ее в 100% или подставь свое значение
}

learner 02.12.2014 01:02

Работает! Да-а, как всё просто в руках мастера :), ещё раз огромное Вам спасибо.


Часовой пояс GMT +3, время: 07:34.