Как заставить границу браузера заблокировать div при изменении размера?
Я смотрю на этот 3 макет CSS с фиксированным столбцом на http://www.vanseodesign.com. Я хочу использовать этот макет, но я бы хотел изменить способ его поведения при изменении размера браузера.
Когда браузер открыт хорошо и широко, столбцы хорошо центрируются на странице:
![Столбцы центрированы]()
Затем мы уменьшаем ширину браузера и фиксируем ее в левой части самого левого столбца следующим образом:
![Показывать левый столбец]()
Что бы я хотел сделать, это изменить CSS (или javascript, если необходимо), чтобы браузер блокировался в левой части среднего столбца, когда браузер стал слишком узким:
![введите описание изображения здесь]()
Я не уверен, как добиться этого, хотя?? Кто-нибудь может предложить, как изменить код и, самое главное, почему ваше решение работает?
EDIT:
Для тех, кто читает этот вопрос: Я отметил, что Salem Ouerdani отвечает как правильный, потому что он первым ответил на решение, которое работало именно так, как я хотел. Однако стало ясно, что люди толкуют вопрос несколько иначе. Поэтому стоит прочитать, потому что есть действительно отличные ответы, которые лучше подходят для вашей ситуации. Пожалуйста, поддержите их как таковые.
Ответы
Ответ 1
Попытайтесь изменить свой контейнер div следующим образом:
#container { width: 960px; margin: 20px auto;}
:
#container {
width: 960px;
margin: 20px auto;
position: absolute;
left: 50%;
margin-left: -480px; /* half the fixed width */
}
РЕДАКТИРОВАТЬ:
Также вам нужно добавить это, чтобы заблокировать левую часть центрального div, когда размер вашего браузера превышает фиксированный 960px:
@media (max-width: 960px) {
#container {
left: 0;
margin-left: -240px; /* Primary Sidebar width */
}
}
ОБНОВЛЕНИЕ: Поскольку @media (max-width: 480px){}
лучше решил проблему, а не 960px
, я добавляю пример связанного кода с окончательным решением:
Ответ 2
Обновление 2015-08-03 01:59 +0000
Чтение вашего комментария на другой ответ о том, чтобы оставаться центрированным до тех пор, пока левый край центрированного столбца не встретит края браузера, что сделало вещи намного яснее.
Это приведет к тому, что средний столбец будет центрирован до тех пор, пока браузер не станет таким же большим, как столбец, затем он будет придерживаться левого края столбца.
html, body {
margin:0;
padding:0;
}
@media (max-width: 480px) {
#container {
margin-left:-240px;
}
}
@media (max-width: 960px) and (min-width:481px) {
#container {
margin-left:calc( (960px - 100%) / -2 );
}
}
Оригинальный андерсервис
Чистый css. Значения "960" и "720" должны быть скорректированы для учета поля тела. Работает под Firefox, никаких гарантий в другом месте. Использование calc()
для адаптивного отрицательного поля на основе ширины браузера.
/* fixed negative margin below 720px width */
@media (max-width: 720px) {
#container {
margin-left:-240px;
}
}
/* adaptive negative margin vetween 720px and 960px width */
@media (max-width: 960px) and (min-width:721px) {
#container {
margin-left:calc( (960px - 100%) * -1 );
}
}
Предварительный просмотр
p >
Ответ 3
Исправленное решение (на основе OP comment)
Решение @spenibus является лучшим, и я рекомендую это. Решение не работает с браузерами <= IE9 (IE9 только частично поддерживает его). Если вы хотите сделать его совместимым с браузером, я предлагаю использовать javascript для ручной установки прокрутки.
Fiddle: http://jsfiddle.net/dp7gwcn5/4/
$(function () {
$(window).resize(function () {
var width = $(window).width();
if (width <= 960) {
if(width <= 480) $(document).scrollLeft($('#content').offset().left);
else $(document).scrollLeft((960-width) / 2);
}
});
});
Старое решение
Решение № 1 (Свиток: ничего не спрячь, просто цепляйтесь)
Если вы хотите, чтобы боковая панель все еще была доступна, прокручивая ее, но только сделайте левый край браузера левым краем основного содержимого #content
. Затем манипулируйте прокруткой
Fiddle: http://jsfiddle.net/dp7gwcn5/. Скрипка позволит вам изменить размер окна предварительного просмотра, как только вы уменьшите его достаточно, чтобы скрыть вторичную боковую панель, окно привязывается к левому краю #content
$(function(){
$(window).resize(function(){
if ($(window).width() < 720) {
$(document).scrollLeft($('#content').offset().left);
}
});
});
Примечание. Ширина 720 была задана на основе ширины, установленной на ваших боковых панелях и коннекторах, вы можете изменить ее для расчета на лету, если хотите.
Решение №2 (статическое: скрыть основную боковую панель)
Если вы хотите скрыть основную боковую панель, просто используйте медиа-запрос, чтобы скрыть основную боковую панель, когда размер вашего окна невелик.
Fiddle: http://jsfiddle.net/dp7gwcn5/1/
@media all and (max-width:720px) {
#primary {
display:none;
}
#container {
width:720px;
}
}
Решение №3 (динамическое: скрыть исходную боковую панель)
Решение №2 является статичным, и вы не можете его сделать, однако, если вы хотите вычислить ширину на лету и скрыть боковую панель, используйте script
Fiddle: http://jsfiddle.net/dp7gwcn5/2/
Script
$(function(){
$(window).resize(function(){
if ($(window).width() < 720) $('#container').addClass('small');
else $('#container').removeClass('small');
});
});
CSS
#container.small {
width:720px;
}
#container.small #primary {
display:none;
}
Мое предложение
Мое предложение состоит в том, чтобы использовать Решение № 1, если вы не хотите сделать его мобильным. Если вы хотите сделать мобильную совместимость, я предлагаю использовать Решение № 2 с помощью кнопки меню, чтобы показать свою основную боковую панель.
Примечание. Решение # 1 и решение №3 будут работать в большинстве браузеров. Решение № 2 не будет работать в браузерах, IE9
Ответ 4
Из того, что я вижу, этот шаблон использует маркер 0 auto в контейнере. Способ настройки поля, он центрирует "контейнер", который содержит все три столбца. Это означает, что в настоящее время контент сосредоточен, рассматривая каждый из трех столбцов как один большой.
Этот макет также не реагирует. Это означает, что он не адаптируется к большему или меньшему размеру браузера. Он имеет фиксированную ширину и высоту.
Простым решением является изменение единиц пикселя на%. Это создаст жидкую компоновку, которая будет легче адаптироваться к размеру браузера, поскольку измерения основаны на части размера окна, а не на фиксированном размере.
Например:
body {
width: 50%; }
Независимо от размера окна браузера, размер тела будет составлять половину размера.
Если вы хотите, чтобы все три столбца были видны в одном и том же макете или просто были видны в браузере без прокрутки в сторону независимо от того, какое устройство или размер экрана, тогда вам нужно использовать медиа-запросы. Медиа-запросы - это свойства css, которые позволяют устанавливать определенные стили CSS для определенных разрешений или размеров экрана.
Например:
@media screen and (max-width: 300px) {
body {
background-color: lightblue;
}
}
@media screen and (max-width: 600px) {
body {
background-color: purple;
}
}
В моем примере (хотя и очень грубом) фон тела будет фиолетовым до небольшого размера 600 пикселей. Затем он изменится до синего до 300px.
Подробнее о медиа-запросах вы можете узнать здесь: http://www.w3schools.com/cssref/css3_pr_mediaquery.asp
Ответ 5
1 - удалите маржу из вашего CSS-кода.
2 - оберните весь ваш html в оболочку... все содержимое вашего тела
3 - Определите CSS для оболочки:
Это будет держать все вместе, в центре на странице.
#conatiner{
margin-left:auto;
margin-right:auto;
width:960px;
}
Ответ 6
.container {
max-width: 960px !important;
margin: 0px auto;
position: relative;
}
он будет работать определенно.
Ответ 7
html, body
{
overflow: scroll !important;
ms-overflow-y: auto;
float: none !important;
overflow-y: auto;
overflow-x: visible;
}
попробуйте это в css
или в script используйте
function enableScrolling()
{
document.body.scroll = "yes";
document.body.overflow="hidden";
}
Ответ 8
@media(max-width : 960px)
{
#primary{width:0;}
#content{width:66.7%}
#secondary{width:33.3%}
#container{width:100%}
}
Надеюсь, это сработает для вас.
Ответ 9
Вы можете сделать это легко с помощью медиа-запросов
Внизу вашего CSS просто добавьте что-то вроде:
@media screen and (max-width : 960px) {
#container {
margin-left: -260px;
}
}
Когда размер окна становится меньше 960px, он сдвигает контейнер влево по ширине левого столбца, оставляя его фиксированным с левой стороны в среднем столбце
Вот скрипка: https://jsfiddle.net/Locwv54q/
EDIT:
С добавлением переходов CSS, чтобы сделать вещи более плавными, вы можете использовать что-то вроде этого
В нижней части вашего CSS добавьте медиа-запрос:
@media (max-width : 960px) {
#container {
left: 460px;
margin-left: -700px;
}
}
Затем во время определения контейнера ранее в CSS используйте что-то вроде этого:
#container {
position: absolute;
left: 50%;
width:960px;
margin-left: -480px;
margin-top: 20px;
margin-bottom: 20px;
-webkit-transition: margin-left 1s ease-in-out;
-moz-transition: margin-left 1s ease-in-out;
-o-transition: margin-left 1s ease-in-out;
transition: margin-left 1s ease-in-out;
}
Конечно, можно возиться со значениями/таймингами, чтобы получить вещи точно так, как вы хотите, но этот общий подход работает на моем конце
обновлен jsfiddle: https://jsfiddle.net/8L5n58jy/
EDIT2:
Теперь это должно работать как предполагалось
@media (max-width : 480px) {
#container {
margin-left: -240px;
left: 0px;
}
}
#container {
position: absolute;
width: 960px;
left: 50%;
margin-left: -480px;
margin-top: 20px;
margin-bottom: 20px;
}
Ответ 10
Я бы предложил всегда центрировать #container
с помощью
position: absolute;
left: 50%;
transform:translateX(-50%);
Затем, когда он будет только соответствовать центральному столбцу и 1 столбцу (max-width: 720px)
, вы зафиксируете позицию:
@media (max-width: 720px) {
#container {
left:240px;
transition: left 2s;//make it smooth
}
}
А плюс для сумасшедших вкладчиков будет добавлять переход для анимирования изменения transition: left 2s;
(но думать о "нормальных" пользователях это может и не понадобиться)
Ответ 11
Вы обязательно должны прочитать о платформе Twitter-Bootstrap, bro:
<div class="container">
<div class="row>
<div class="col-sm-3">
<h2>Left</h2>
</div>
<div class="col-sm-6">
<h2>Center</h2>
</div>
<div class="col-sm-3">
<h2>Right</h3>
</div>
</div>
</div>
выполнит вашу работу, так как это RESPONSIVE. Просто говорю!
Ответ 12
Почему бы не использовать Bootstrap для создания столбцов и использовать col-sm-
или col-xs-
, чтобы вытащить средний контейнер на место
Вот пример на странице Bootstrap