2013-03-15 2 views
5

組織図をHTMLで作成しようとしています。コードはかなりシンプルですが、私はChrome/SafariとOperaのレンダリングにいくつか問題があります。ここでボーダーコラプスとコルスパンによる奇妙な動作

はそれがFirefoxとIEで動作として結果は、どのように見えるかです:ここでは

Desired result, Firefox and IE

はChromeとSafariの

Chrome and Safari

そして、ここではOperaであるです:

Opera

問題はCSSのborder-collapse: collapseプロパティから発生します。 cellspacing="0" cellpadding="0"という古いコーディングスタイルを使用すると多かれ少なかれ動作しますが、HTML5では有効ではありません。

私は、問題を表示するためにjsFiddleを作成:http://jsfiddle.net/aGVp4/7/

マイHTML:

<table cellspacing="0" cellpadding="0"> 
    <tr> 
     <td colspan="3"></td> 
     <td colspan="2" class="case"></td> 
     <td colspan="3"></td> 
    </tr> 
    <tr> 
     <td colspan="3"></td> 
     <td colspan="2" class="case"></td> 
     <td colspan="3"></td> 
    </tr> 
    <tr> 
     <td></td> 
     <td colspan="3" class="right bottom"></td> 
     <td colspan="3" class="bottom"></td> 
     <td></td> 
    </tr> 
    <tr> <!-- No colspan here, to make the layout symmetrical --> 
     <td class="right"></td> 
     <td></td> 
     <td></td> 
     <td></td> 
     <td></td> 
     <td></td> 
     <td class="right"></td> 
     <td></td> 
    </tr> 
    <tr> 
     <td colspan="2" class="case"></td> 
     <td colspan="4"></td> 
     <td colspan="2" class="case"></td> 
    </tr> 
</table> 

そして、私のCSS:

.orgchart { 
    border-spacing: 0; 
    border-collapse: collapse; 
} 

td { 
    width: 3em; 
    height: 1em; 
} 

td.case { 
    border: 1px solid black; 
} 

td.right { 
    border-right: 1px solid black; 
} 

td.bottom { 
    border-bottom: 1px solid black; 
} 

td.top { 
    border-top: 1px solid black; 
} 
+0

このようなかなり複雑なテーブルの場合でも、これはむしろ奇妙です。さて、テーブルには8列ありますが、3列目には7列しかないので、空のセルを追加する必要があります。これは問題の症状にのみ影響し、問題自体には影響しません。 2行目の2番目のセルで 'style =" border-color:red "を設定すると、妨害する線がこのセルの境界線の一部であることがわかります。しかし、この奇妙な現象の原因は何でしょうか? –

+0

@ JukkaK.Korpelaあなたの発言をありがとう、私は私の記事を編集しました。私はそれを取得しません:HTMLは有効ですが、私はCSSのハックやエキゾチックなものを使用しないので、私はうんざりしています。 –

答えて

4

問題は、ブラウザで折りたたみ境界線モデルの解釈が異なるために発生しているようです。 border conflict resolutionはスロットではなくセルで定義され、colspan=3を使用する場合は1つのセルが3つのスロットにまたがります。

2行目の2番目のセルは下の実線の境界線を持ち、3番目の行の2番目のセルは上の境界線を持たない。ボーダーが崩壊すると、ソリッドは勝利しません。しかし、細胞は部分的にしか隣接していません。ブラウザはこれを別の方法で渡します。 Chromeは境界線を上部セルのすべての列に張り巡らすが、Firefoxでは境界線が1つだけの列になり、セルが共有する列はより合理的だが、CSS 2.1では問題を開いたままにしているようだ。

私はborder: hiddenで試してみましたが、これはChromeで役立ちますが、Operaでは新しい問題が発生します。

2つのオプションがあるようです。彼らが仕事をするなら、あなたはHTML属性を使うことができます。 HTML5 CRでは廃止され禁止されていると宣言されていますが、同じ文書でもブラウザでの継続的なサポートが必要です。

しかし、よりクリーンで、おそらくより堅牢なアプローチは、空のセルを追加することによって問題を回避することです。これは、2つの3行目のセルを2つのセルに分割し、そのうちの1つだけが2行目のセルと境界線を共有することを意味します。

<table class="orgchart"> 
<tr> 
    <td colspan="3"></td> 
    <td colspan="2" class="case"></td> 
    <td colspan="3"></td> 
</tr> 
<tr> 
    <td colspan="3"></td> 
    <td colspan="2" class="case" ></td> 
    <td colspan="3"></td> 
</tr> 
<tr> 
    <td></td> 
    <td colspan="2" class="bottom"></td> 
    <td class="right bottom"></td> 
    <td class="bottom" ></td> 
    <td colspan="2" class="bottom" ></td> 
    <td></td> 
</tr> 
<tr> <!-- No colspan here, to make the layout symmetrical --> 
    <td class="right"></td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td class="right"></td> 
    <td></td> 
</tr> 
<tr> 
    <td colspan="2" class="case"></td> 
    <td colspan="4"></td> 
    <td colspan="2" class="case"></td> 
</tr> 
</table> 
+0

詳細な回答ありがとうございます。細胞を分けなければならないのはちょっと迷惑ですが、それでは暮らすことができます:) –

+0

FWIW - これは多くの人にとって既知のバグです(https://bugs.webkit.org/show_bug.cgi?id=20840)何年も...悲しいことに、上記のような細胞を分離する以外のこの問題の良い解決策はありません。 – Stephen

0

を私はあなたのjsfiddleで演奏し、ハックすることが判明ChromeとSafariで問題を解決してください。

FFやIEでも動作しますが、Operaではテストしませんでした。

jsfiddle)これを試してみてください:これはハックです

td.bottom { 
    border-top: 1px solid white; // this is the hack 
    border-bottom: 1px solid black; 
} 
td.right.bottom { 
    border-top: none; // fix for IE 
} 

として、それはあなたのチャートが複雑になるにつれて動作しますが、これは短期的には役立ちます願っていないかもしれません。

+0

あなたの答えをお寄せいただきありがとうございます。残念ながらOperaの方は見知らぬ人ですので、私は使えません:) –

+0

ああ、それは酷いことです。おそらく、すべての括弧を削除し、すべての行を描画するためにborder-topとborder-rightしか使用しないでください。 (border-bottomとborder-leftは使用しません)。 3つのクラスを定義する:(上、右の両方)、それらを使用する。 – haejeong87

0

はこの問題(ない美しいソリューションが、作品を)修正しますCOLSPANの下に新しい空の行<tr></tr>を追加します。これは、テーブル、さらに格子状ではなく、本質的に、より複雑になります。