Javascript, чтобы получить ширину экрана в переменной PHP

У меня есть отзывчивый сайт, у которого есть простое раскрывающееся меню входа, когда сайт находится в «рабочем столе» (ширина доступной ширины> 768) рядом с другими навигационными ссылками. Когда ширина экрана падает ниже 768, навигационные ссылки заканчиваются выбором. Проблема заключается в том, что выпадающее меню входа не работает из выбранного параметра.

Я хотел бы использовать PHP для изменения выпадающего меню входа в систему с простой ссылкой <a href> когда ширина экрана становится меньше 768.

Прямо сейчас у меня на моей странице <head> :

 <? $screenWidth = '<script type="text/javascript">document.write(screen.availWidth);</script>'; ?> 

В <body> :

 <? if($screenWidth <= "768") { echo '<li><a href="login.php">Log in</a></li>'; } else { ?> <div id="fancy"> <li id="login"> <a id="login-trigger" href="#">Log in <span>▼</span></a> <div id="login-content"> <form> <fieldset id="inputs"> <input id="username" type="email" name="Email" placeholder="Your email address" required> <input id="password" type="password" name="Password" placeholder="Password" required> </fieldset> <fieldset id="actions"> <input type="submit" id="submit" value="Log in"> <label><input type="checkbox" checked="checked"> Keep me signed in</label> </fieldset> </form> </div> </li> <? } ?> 

На моем рабочем столе я повторил $ ​​screenWidth, который дает 1920. Поэтому я ожидаю, что вы увидите меню «выпадающего» выпадающего меню. (И это так).

На моем мобильном устройстве эхо-сигнал $ screenWidth дает 320. Тогда я ожидал, что будет отображаться ссылка <a href> . (Это не так – вместо этого отображается меню «причудливое»).

Кажется странным, что переменная, когда эхо в теле будет давать другое число, но при сравнении в выражении if она не меняет результат.

Есть ли лучший способ изменить выход?

Изменить: код режима jquery отзывчивый

jquery.responsivemenu.js:

 (function($) { $.fn.responsiveMenu = function(options) { var defaults = {autoArrows: false} var options = $.extend(defaults, options); return this.each(function() { var $this = $(this); var $window = $(window); var setClass = function() { if ($window.width() > 768) {$this.addClass('dropdown').removeClass('accordion').find('li:has(ul)').removeClass('accorChild');} else {$this.addClass('accordion').find('li:has(ul)').addClass('accorChild').parent().removeClass('dropdown');} } $window.resize(function() { setClass(); $this.find('ul').css('display', 'none'); }); setClass(); $this .addClass('responsive-menu') .find('li.current a') .live('click', function(e) { var $a = $(this); var container = $a.next('ul,div'); if ($this.hasClass('accordion') && container.length > 0) { container.slideToggle(); return false; } }) .stop() .siblings('ul').parent('li').addClass('hasChild'); if (options.autoArrows) { $('.hasChild > a', $this) .find('strong').append('<span class="arrow">&nbsp;</span>'); } }); } })(jQuery); 

Самый простой вариант – заполнить обе опции в DOM, а затем использовать запросы CSS3 Media, чтобы скрыть / показать правильный элемент на основе размера экрана.

Таким образом, ваш HTML-код может выглядеть так:

  <li class="login-link"><a href="login.php">Log in</a></li> <div id="fancy"> <li id="login"> <a id="login-trigger" href="#">Log in <span>&#x25BC;</span></a> <div id="login-content"> <form> <fieldset id="inputs"> <input id="username" type="email" name="Email" placeholder="Your email address" required> <input id="password" type="password" name="Password" placeholder="Password" required> </fieldset> <fieldset id="actions"> <input type="submit" id="submit" value="Log in"> <label><input type="checkbox" checked="checked"> Keep me signed in</label> </fieldset> </form> </div> </li> 

И ваш CSS мог бы выглядеть так:

 .login-link, #login{ display: none; } @media screen and (max-width: 767px){ .login-link { display: block; } #login{ display: none; } } @media screen and (min-width: 768px) { #login{ display: block; } .login-link{ display: none; } } 

Изменить: Исправлена ​​ссылка #login. Редактирование 2: Добавление примера JSFiddle Пример JSFiddle

PHP выполняется на стороне сервера, это означает, что var screenWidth содержит именно: document.write (screen.availWidth); когда вы его сравниваете. Вывод выполняется на стороне клиента.

Чтобы сделать отзывчивый дизайн, в прошлом мы использовали JavaScript. С CCS3 вы можете использовать @media для ответа на изменения в окне просмотра.

Подобно:

 @media screen and (max-width: 1280px) and (max-height: 1024px) { .splash { width: 100px; } } @media screen and (min-width: 1281px) and (max-width: 1920px) and (max-height: 960px) { .splash { width: 300px; } } 

Некоторые мысли:

Я не думаю, что PHP может напрямую взаимодействовать с настольным компьютером.

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

Итак, шаг 1: проверьте, существует ли файл cookie со значением, указывающим размер экрана клиента. (или использовать переменные сеанса), если да, запустите с ним. если нет, есть javascript, который отправляет вас на ту же страницу с строкой запроса, определяющей размер окна. Шаг 2: если cookie не существует, и у вас есть строка запроса, указывающая размер окна, создайте файл cookie и соответствующим образом настройте.

Вы можете попробовать

 $userBrowserAtts = get_browser(null, true) 

Возвращает удобный массив всех видов информации о браузере. Но будьте осторожны – это зависит от $ _SERVER ['HTTP_USER_AGENT'], и это может быть подделано. Таким образом, этот метод не является доказательством пули. Я не знаю, вернет ли он ширину экрана как таковой, но вы, вероятно, сможете узнать, мобильна ли она или планшет или рабочий стол.

удобно:

http://www.php.net/manual/en/function.get-browser.php

Лучший способ сделать это – с помощью мультимедийных запросов CSS3, но если сервер действительно должен знать о браузере, это единственное, что вы можете сделать.