CSSはフロートプロパティの左と右の値のみをサポートすることを知っていますが、フローティングトップを実装する技術はありますか?説明しようと思います。私は次のコードを持っています:
<div style="float:left">
<div style="float:left">
<div style="float:left">
....
このコードでは、すべてのdivがページの右端に達するまで左にフロートされます。同じことを垂直方向に行いたいため、すべてのdivが前のdivの下部に配置され、ページの下部の制限に達すると、新しい列が作成されます。 CSSのみを使用してこれを行う方法はありますか(HTMLコードを編集する場合もあります)?
CSSのみでこれを行う唯一の方法は、すべてのブラウザー(FF 3.5、Opera、Safari、Chromeなどの最新世代のみ)で動作しないCSS 3を使用することです。
確かに、CSS 3には次のような素晴らしいプロパティがあります。
#myContent{
column-count: 2;
column-gap: 20px;
height: 350px;
}
#myContentが他のdivをラップしている場合。
詳細はこちら: http://www.quirksmode.org/css/multicolumn.html
あなたがそこで読むことができるように、これを使用することには重大な制限があります。上記の例では、コンテンツがオーバーフローした場合にのみ、別の列が追加されます。 mozillaでは、列幅プロパティを使用して、必要な数の列にコンテンツを分割できます。
それ以外の場合は、JavaScriptまたはバックエンドの異なるdiv間でコンテンツを配布する必要があります。
単にvertical-align
:
.className {
display: inline-block;
vertical-align: top;
}
Hugogi Raudel は、CSS
によってこれを達成する興味深い方法を思いつきました。ここにHTML
マークアップがあるとします:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
このCSS
コードを使用して3行の列を実現できます。
li:nth-child(3n+2){
margin: 120px 0 0 -110px;
}
li:nth-child(3n+3) {
margin: 230px 0 0 -110px;
}
最終結果は次のとおりです。
ここで行っているのは、行の各アイテムに適切なマージンを追加することです。このアプローチの制限は、列の行数を決定する必要があることです。動的にはなりません。確かにユースケースがあるので、このソリューションをここに含めました。
float:top
はなく、float:left
とfloat:right
のみがあります
Divをお互いの下に表示したい場合は、以下を行う必要があります。
<div style="float:left;clear:both"></div>
<div style="float:left;clear:both"></div>
私も楽しみのためにこれを試しました-私も解決策が欲しいので。
フィドル: http://jsfiddle.net/4V4cD/1/
html:
<div id="container">
<div class="object"><div class="content">one</div></div>
<div class="object"><div class="content">two</div></div>
<div class="object"><div class="content">three</div></div>
<div class="object"><div class="content">four</div></div>
<div class="object tall"><div class="content">five</div></div>
<div class="object"><div class="content">six</div></div>
<div class="object"><div class="content">seven</div></div>
<div class="object"><div class="content">eight</div></div>
</div>
css:
#container {
width:300px; height:300px; border:1px solid blue;
transform:rotate(90deg);
-ms-transform:rotate(90deg); /* IE 9 */
-moz-transform:rotate(90deg); /* Firefox */
-webkit-transform:rotate(90deg); /* Safari and Chrome */
-o-transform:rotate(90deg); /* Opera */
}
.object {
float:left;
width:96px;
height:96px;
margin:1px;
border:1px solid red;
position:relative;
}
.tall {
width:196px;
}
.content {
padding:0;
margin:0;
position:absolute;
bottom:0;
left:0;
text-align:left;
border:1px solid green;
-webkit-transform-Origin: 0 0;
transform:rotate(-70deg);
-ms-transform:rotate(-90deg); /* IE 9 */
-moz-transform:rotate(-90deg); /* Firefox */
-webkit-transform:rotate(-90deg); /* Safari and Chrome */
-o-transform:rotate(-90deg); /* Opera */
}
これは、より高い/より広いdivで機能することがわかります。横向きに考えるだけです。ポジショニングが問題になると思います。 transform-Originはそれを助けてくれるはずです。
FF、Opera、Chromeで機能する(ほぼ完璧な)ソリューションを次に示します。
<style>
html {height:100%}
p {page-break-inside:avoid;text-align:center;
width:128px;display:inline-block;
padding:2px;margin:2px;border:1px solid red; border-radius: 8px;}
a {display:block;text-decoration:none}
b {display:block;color:red}
body {
margin:0px;padding:1%;
height:97%; /* less than 98 b/c scroolbar */
-webkit-column-width:138px;
-moz-column-width:138px;
column-width:138px;
}
</style>
<body>
<p><b>title 1</b>
<a>link 1</a>
<a>link 2</a>
<a>link 3</a>
<a>link 4</a>
</p>
<p><b>title 2</b>
<a>link 1</a>
<a>link 2</a>
<a>link 3</a>
<a>link 4</a>
<a>link 5</a>
</p>
</body>
トリックは、Pで「page-break-inside:avoid」、BODYでcolumn-widthです。動的な列カウントが付属しています。 Aのテキストは複数行で、ブロックの高さは異なる場合があります。
たぶん、誰かがEdgeとIEのために何かを持っている
あなたが話していることを達成するための最良の方法は、列となる一連のdivを用意し、それらを説明した方法で設定することだと思います。次に、これらのdivを、あなたが話しているコンテンツで垂直に埋めます。
<div class="block blockLeft">...</div>
<div class="block blockRight">...</div>
<div class="block blockLeft">...</div>
<div class="block blockRight">...</div>
<div class="block blockLeft">...</div>
<div class="block blockRight">...</div>
block {width:300px;}
blockLeft {float:left;}
blockRight {float:right;}
ただし、divの要素の数が固定されていない場合、または要素の量がわからない場合は、JSが必要です。 jQuery :even
、:odd
を使用します
CSS3を使用してこれを達成するには、適切に理解している限りそれほど難しくはありません。 HTML DIVは次のように見えるとしましょう。
<div class="rightDIV">
<p>Some content</p>
<div>
<!-- -->
<div class="leftDIV">
<p>Some content</p>
</div>
CSSは次のようになります。次のCSSは、DIVに左フロートを実行させ、親DIV要素の左に「固定」します。次に、「top:0」を使用すると、ブラウザウィンドウの上部に「固定」されます。
#rightDIV {
float: left
top: 0
}
#leftDIV {
float: right;
top: 0
}
JQueryで作成しました。
FirefoxとIE10でテストしました。
私の問題では、アイテムの高さが異なります。
<!DOCTYPE html>
<html>
<head>
<style>
.item {
border: 1px solid #FF0;
width: 100px;
position: relative;
}
</style>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</head>
<body>
<script>
function itemClicked(e) {
if (navigator.appName == 'Microsoft Internet Explorer')
e.removeNode();
else
e.remove();
reposition();
}
function reposition() {
var px = 0;
var py = 0;
var margeY = 0;
var limitContainer = $('#divContainer').innerHeight();
var voltaY=false;
$('#divContainer .item').each(function(key, value){
var c = $(value);
if ((py+c.outerHeight()) > limitContainer) {
px+=100;
margeY-=py;
py=0;
voltaY=true;
}
c.animate({
left:px+'px',
top:margeY+'px'
});
voltaY=false;
py+=c.outerHeight();
});
}
function addItem() {
$('#divContainer').append('<div class="item" style="height: '+Math.floor(Math.random()*3+1)*20+'px;" onclick="itemClicked(this);"></div>');
reposition();
}
</script>
<div id="divMarge" style="height: 100px;"></div>
<div id="divContainer" style="height: 200px; border: 1px solid #F00;">
<!--div class="item"></div-->
</div>
<div style="border: 1px solid #00F;">
<input type="button" value="Add Item" onclick="addItem();" />
</div>
</body>
</html>
私のために働いたトリックは、div-alignmentの期間中に書き込みモードを変更することでした。
.outer{
/* Limit height of outer div so there has to be a line-break*/
height:100px;
/* Tell the browser we are writing chinese. This makes everything that is text
top-bottom then left to right. */
writing-mode:vertical-lr;
}
.outer > div{
/* float:left behaves like float:top because this block is beeing aligned top-bottom first
*/
float:left;
width:40px;
/* Switch back to normal writing mode. If you leave this out, everything inside the
div will also be top-bottom. */
writing-mode:horizontal-tb;
}
<div class="outer">
<div>one</div>
<div>two</div>
<div>three</div>
<div>four</div>
<div>one</div>
<div>two</div>
<div>three</div>
<div>four</div>
<div>one</div>
<div>two</div>
<div>three</div>
<div>four</div>
</div>
これは動作し、ul
に適用されます:
display:flex;
flex-direction:column;
flex-wrap:wrap;
あなたは兄弟セレクタで何かをすることができるかもしれません、例えば:
div + div + div + div{
float: left
}
試していないが、これはおそらくあなたが望むことをして残っている4番目のdivをフロートさせるかもしれない。再び完全にサポートされていません。
私はこの質問が古いことを知っています。しかし、今日ここでそれをしたい人は誰でもここに行きます。
div.floatablediv{
-webkit-column-break-inside: avoid;
-moz-column-break-inside: avoid;
column-break-inside: avoid;
}
div.floatcontainer{
-webkit-column-count: 2;
-webkit-column-gap: 1px;
-webkit-column-fill: auto;
-moz-column-count: 2;
-moz-column-gap: 1px;
-moz-column-fill: auto;
column-count: 2;
column-gap: 1px;
column-fill: auto;
}
<div style="background-color: #ccc; width: 100px;" class="floatcontainer">
<div style="height: 50px; width: 50px; background-color: #ff0000;" class="floatablediv">
</div>
<div style="height: 70px; width: 50px; background-color: #00ff00;" class="floatablediv">
</div>
<div style="height: 30px; width: 50px; background-color: #0000ff;" class="floatablediv">
</div>
<div style="height: 40px; width: 50px; background-color: #ffff00;" class="floatablediv">
</div>
<div style="clear:both;"></div>
</div>