2016-08-02 2 views
7

Я столкнулся с очень странным поведением относительно раскладки столбцов CSS, которое появляется только в Chrome.Столбцы CSS, нечетное смещение в зависимости от высоты

В зависимости от общей высоты элемента, который находится в столбце, смещение слева сдвинуто, что затрудняет определение фактического местоположения элементов. Отрисовка выглядит отлично, но если вы проверите элемент, вы можете увидеть, что он смещен довольно много.

Вот пример: https://jsfiddle.net/vx8h8u46/

Осмотрите элемент .panel, и вы увидите, что это ограничивающий прямоугольник не начинается слева. enter image description here

Если вы нажмете на кнопку, чтобы удалить один элемент, то внезапно ограничивающий прямоугольник будет правильным. enter image description here

Оказывается, что это происходит, когда высота панели превышает определенный порог, но это только предположение, на данный момент. Есть ли работа?


function logOffset() { 
 
    document.getElementById("log").innerText = document.querySelector(".panel").getBoundingClientRect().left; 
 
} 
 

 
window.removeLastItem = function() { 
 
    var items = document.querySelectorAll(".item"); 
 
    if (items.length) { 
 
    items[items.length - 1].remove(); 
 
    logOffset(); 
 
    } 
 
} 
 

 
logOffset();
* { 
 
    box-sizing: border-box; 
 
} 
 

 
.item { 
 
    display: inline-block; 
 
    width: 160px; 
 
    height: 80px; 
 
    outline: 1px solid red; 
 
} 
 

 
.container { 
 
    -moz-column-width: 320px; 
 
    column-width: 320px; 
 
    -moz-column-fill: auto; 
 
    column-fill: auto; 
 
    max-height: 160px; 
 
    width: 640px; 
 
}
<div class="container"> 
 
    <div class="panel"> 
 
    <div class="item">1</div> 
 
    <div class="item">2</div> 
 
    <div class="item">3</div> 
 
    <div class="item">4</div> 
 
    <div class="item">5</div> 
 
    <div class="item">6</div> 
 
    <div class="item">7</div> 
 
    <div class="item">8</div> 
 
    <div class="item">9</div> 
 

 
    <!-- Something weird happens after this --> 
 
    <div class="item">10</div> 
 
    </div> 
 
</div> 
 

 
<div> 
 
    Left offset of 
 
    <mark>panel</mark>: 
 
    <span id="log"></span> 
 
</div> 
 

 
<button onclick="removeLastItem()"> 
 
    Remove last item 
 
</button>

ответ

0

Дети колонн должны быть инлайн, поэтому следующий код должен работать хорошо:

.panel { 
    display: inline; /* Children of columns must be inline */ 
} 

И весь фрагмент кода:

function logOffset() { 
 
    document.getElementById("log").innerText = document.querySelector(".panel").getBoundingClientRect().left; 
 
} 
 

 
window.removeLastItem = function() { 
 
    var items = document.querySelectorAll(".item"); 
 
    if (items.length) { 
 
    items[items.length - 1].remove(); 
 
    logOffset(); 
 
    } 
 
} 
 

 
logOffset();
* { 
 
    box-sizing: border-box; 
 
} 
 

 
.item { 
 
    display: inline-block; 
 
    width: 160px; 
 
    height: 80px; 
 
    outline: 1px solid red; 
 
} 
 

 
.container { 
 
    column-width: 320px; 
 
    column-fill: auto; 
 
    max-height: 160px; 
 
    width: 640px; 
 
} 
 

 
.panel { 
 
    display: inline; /* Children of columns must be inline */ 
 
}
<div class="container"> 
 
    <div class="panel"> 
 
    <div class="item">1</div> 
 
    <div class="item">2</div> 
 
    <div class="item">3</div> 
 
    <div class="item">4</div> 
 
    <div class="item">5</div> 
 
    <div class="item">6</div> 
 
    <div class="item">7</div> 
 
    <div class="item">8</div> 
 
    <div class="item">9</div> 
 

 
    <!-- Something weird happens after this --> 
 
    <div class="item">10</div> 
 
    </div> 
 
</div> 
 

 
<div> 
 
    Left offset of 
 
    <mark>panel</mark>: 
 
    <span id="log"></span> 
 
</div> 
 

 
<button onclick="removeLastItem()"> 
 
    Remove last item 
 
</button>

function logOffset() { 
 
    document.getElementById("log").innerText = document.querySelector(".panel").getBoundingClientRect().left; 
 
} 
 

 
window.removeLastItem = function() { 
 
    var items = document.querySelectorAll(".item"); 
 
    if (items.length) { 
 
    items[items.length - 1].remove(); 
 
    logOffset(); 
 
    } 
 
} 
 

 
logOffset();
* { 
 
    box-sizing: border-box; 
 
} 
 

 
.item { 
 
    display: inline-block; 
 
    width: 160px; 
 
    height: 80px; 
 
    outline: 1px solid red; 
 
} 
 

 
.container { 
 
    -moz-column-width: 320px; 
 
    column-width: 320px; 
 
    -moz-column-fill: auto; 
 
    column-fill: auto; 
 
    max-height: 160px; 
 
    width: 640px; 
 
}
<div class="container"> 
 
    <div class="panel"> 
 
    <div class="item">1</div> 
 
    <div class="item">2</div> 
 
    <div class="item">3</div> 
 
    <div class="item">4</div> 
 
    <div class="item">5</div> 
 
    <div class="item">6</div> 
 
    <div class="item">7</div> 
 
    <div class="item">8</div> 
 
    <div class="item">9</div> 
 

 
    <!-- Something weird happens after this --> 
 
    <div class="item">10</div> 
 
    </div> 
 
</div> 
 

 
<div> 
 
    Left offset of 
 
    <mark>panel</mark>: 
 
    <span id="log"></span> 
 
</div> 
 

 
<button onclick="removeLastItem()"> 
 
    Remove last item 
 
</button>

+0

Какой именно элемент вы имеете в виду? Если вы примените 'display: inline' к' .panel', это устранит проблему. Если это то, что вы имеете в виду, проясните в своем ответе и подумайте о добавлении фрагмента примера. – misterManSam

+0

Я забыл добавить, что .panel имеет отображение: встроенный блок, но проблема сохраняется. –

0

Пользователь Border заменит outline в .item класса

CSS свойства границ позволяют определить стиль и цвет границы элемента.

Схема представляет собой линию, которая обращается вокруг элементов (за пределами границ), чтобы сделать элемент «выделиться»

CSS-контурный свойство является запутанным свойство. Когда вы впервые узнаете об этом , трудно понять, как он удаленно отличается от от границы. W3C объясняет это как имеющее следующие отличия:

1.Outlines не занимают место.

2.Outlines может быть непрямоугольным.

.item { 
    display: inline-block; 
    width: 160px; 
    height: 80px; 
    border: 1px solid red; 
} 

Живая Demo

+0

Контур просто предназначен для визуализации, где элементы не влияют на макет. Основная проблема заключается в том, что Chrome компенсирует ограничивающий прямоугольник .panel. –

+0

браузер мудрый высота окна отличается, тогда проблема возникает. .plz читать: Ссылка [http://stackoverflow.com/questions/12325424/window-height-issues-in-ie-and-ff], http://stackoverflow.com/questions/11359363/height-being- calculate-different-between-chrome-and-firefox –

0

Простота в решении проблемы может быть лучше, чем усложнять его больше sometimes.I предлагает оставить все, как это и попытаться добавить прогибаются. Он не только поможет вам отображать во всех браузерах, но и изменит представление в соответствии с размером браузера в бутстрапе, как простой метод. Попробуйте, и если он сделает какой-либо нежелательный ответ, прокомментируйте это.

.classname { 
    display: flex; 
    flex-wrap: wrap; 
    justify-content:center; 
} 
+0

Мы фактически используем flex для элементов в реальном коде (inline-flex по правде говоря, чтобы предотвратить многоколоночное обрезание элементов), но проблема сохраняется. Что-то происходит, когда высота каждой панели достигает определенной точки. –

Смежные вопросы