1. 程式人生 > >有關列分組,定義css樣式無效的問題

有關列分組,定義css樣式無效的問題

建議 table gin solid 開發者 自己的 div code 利用

聲明: web前端學習筆記,歡迎大神指點。聯系QQ:1522025433.

有時候我們要單獨對表格的某列定義單獨的樣式,就會很自然的想到 表格的 在<table>標簽內使用的 <colgroup>與<col> 標簽,對列進行分組。

來看個例子:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>有關列分組,定義css樣式無效的問題</title>
<style type="text/css">
    table 
{ width: 300px; height: 200px; border-collapse: collapse;/*合並單元格邊框*/ } th,td { border: 1px solid red;/*定義單元格邊框*/ } </style> </head> <body> <table> <!--對表格的列進行分組,第一個列組 橫跨兩列。 span為colgroup和col的屬性,表示橫跨的列數--> <colgroup class="colgroup-1"
><col span="2" /></colgroup> <!--第二個列組 橫跨一列。/ --> <colgroup class="colgroup-2"><col span="" /></colgroup> <tbody> <tr> <th>表頭</th> <th>表頭</th> <th>表頭</th> </
tr> <tr> <td>單元格</td> <td>單元格</td> <td>單元格</td> </tr> <tr> <td>單元格</td> <td>單元格</td> <td>單元格</td> </tr> </tbody> </table> </body> </html>

在上面的例子中我們把表格分為了兩個列組,我們看一下,沒有給列組定義樣式的瀏覽器效果:

技術分享

表頭是默認居中對齊的。單元格是默認左對齊的!

下面,我們對列組進天劍如下演示樣式:

css:

    .colgroup-1 {
        text-align: right;
    }

給列組1 (即:前兩列) 定義 文本右對齊;

看一下有沒有效果:

技術分享

很明顯,並沒有向我們想象的一樣右對齊(谷歌,火狐,IE均無效);

我們在來看一下看寬度有沒有效,避免測試受影響,我們先把,表格中的 總寬度去掉(只是在測試寬度時去掉,下面測試背景顏色時會恢復),及修改

    table {
        /*width: 300px;去掉表格寬度*/
        height: 200px;
        border-collapse: collapse;/*合並單元格邊框*/
    }

先看一瀏覽器的效果:

技術分享

現在我們來給列組1 添加寬度

css修該位置的代碼:

    .colgroup-1 {
        width: 150px;

    }

火狐、IE瀏覽器中的效果(谷歌一點反應沒有):

技術分享

乍看上去,好像是起作用了,但是經過我的測量發現,發現,列組1的寬度並不是150px,而是300px;看來在火狐瀏覽器中把列組的每個列的寬度解析成:150px(自我認為而已,猜的);

此時看來寬度也是沒有效果。高度也是一點效果沒有(已測試),就附圖片了;

我們再來看一下,背景顏色。

    .colgroup-1 {

    background: pink;
    }

瀏覽器效果:

技術分享

這次在各大瀏覽器中的效果都是一樣的;都得到了正確的渲染;

通過以上示例可總結為: 在列組上定義樣式,text-align 、width、hieght 、等都是無效的,只有背景顏色是有效的

經過在網上的搜索,發現原因是:

之所以直接在 col 上定義樣式無效,是一個老問題了。實際上HTML4定義的col上的align屬性在現代瀏覽器上從來沒有得到過良好支持(只有始於CSS時代之前的IE支持),原因很簡單,因為此設計在CSS1、2乃至3的機制中都無法實現。

按照CSS的模型,一個元素上的CSS樣式值要麽來自於匹配了自己的規則,要麽來自於匹配了祖先元素的規則然後通過繼承獲得。所以一個cell(td/th)的text-align,要麽來自於匹配td/th的規則,要麽來自於tr,tbody,table等祖先元素。而col/colgroup不可能是其祖先元素。

因此盡管這個需求被開發者要求了十多年,但是始終未能滿足。最終還是需要通過更新CSS規範,創造新的combinator和偽類來實現


下面談你這個需求:

一、table元素應該用於真的表格,所謂真的表格即二維數據表。從你的需求來看,其實並不像是真的數據表。因此不建議用table元素。

二、其實你可以使用 nth-child 來實現你要的效果。

針對以上問題的解決方法:

但是方法我們可以利用css3中的偽類選擇符(E:nth-child(n)或E:nth-of-type(n))實現想要的效果。(具體屬性介紹詳見css3參考手冊 進入) 我們可以用如下css樣式,實現前兩列文本右對齊,和背景顏色的修改:
/*代表意思為 選中 父級元素tr下的 第一個 th,第二個th,第一個td,第二個td*/
    th:nth-of-type(1) , th:nth-of-type(2) , td:nth-of-type(1) , td:nth-of-type(2) {
        text-align: right;
        background: green;
    }

各大瀏覽器的效果圖:

技術分享

此種方法不止可以用於文本對齊,背景顏色,基本上所有的css屬性,都可以得到很好的體現(但是表格的單元格td不支持margin屬性,利用cellspacing屬性可以代替使用時必須確定單元格之間相互獨立即不能定義border-collapse:collapse;,但css定義了border-spacing,能夠分離單元格的間隙,取值包括一個值或兩個值,當定義一個值時,則定義單元格行間距和列間距都為該值,建議使用css來定義;但cellpading可以完全用padding屬性代替,來定義單元格的補白)。詳情可查閱css88的css3產考手冊;

最後總結:

“colgroup”和“col”這兩個標簽存在嚴重的瀏覽器兼容問題,在Chrome、FireFox、Safari等瀏覽器中都只支持背景色、寬度等少數幾種樣式屬性,所以建議最好不要使用。可以用文章中提到的css3偽類選擇符的方法實現,想要的的效果。

有關列分組,定義css樣式無效的問題