2012-11-09 84 views
25

我在這裏搜索了廣泛的答案,但還沒有完全找到我要找的東西。發現這CSS - How to Style a Selected Radio Buttons Label?但答案涉及改變標記,這是我想避免的,我將在下面解釋。當輸入位於標籤內時,CSS複選框和單選按鈕?

我想定製CSS3複選框和單選按鈕添加到我的XenForo論壇的主題,而我已經對這個閱讀教程有輸入後標籤:

<input type="checkbox" id="c1" name="cc" /> 
<label for="c1">Check Box 1</label> 

然而,在XenForo的標記輸入是標籤內:

<label for="ctrl_enable_rte"> 
<input type="checkbox" name="enable_rte" value="1" id="ctrl_enable_rte" {xen:checked "{$visitor.enable_rte}"} /> 
{xen:phrase use_rich_text_editor_to_create_and_edit_messages} 
</label> 

我看着這是爲什麼,但是當標記是這樣沒有發現任何相關的自定義CSS複選框/單選按鈕。我想避免改變標記,因爲我正在處理一個論壇系統,這將涉及編輯一堆核心模板......我必須在每次論壇軟件時更新標記推出更新(假定模板已更改)。

我試着創建可以使用這種類型的標記的CSS規則,但到目前爲止,我一直不成功。我對CSS不太熟悉,沒有記住每一個選擇器,僞類對我來說仍然是非常陌生的,所以我希望這裏有人能夠闡明如果這是可能的,如果是的話,我如何可能會去做。我已經準備好了我的精靈,我只需要找出CSS。

我的主要問題是我無法弄清楚如何選擇標籤(當然只涉及這些輸入的標籤)。通常像

input[type="checkbox"] + label 

被使用,但是當標籤是不是輸入後,而是外前的/它...我該如何選擇呢?

+1

而不是爲選中的輸入選擇標籤(我認爲在這種情況下不能使用CSS進行選擇,因爲「父」選擇器不存在),可能會有CSS的解決方法。你想要發生什麼? –

+0

@WesleyMurch我試圖自定義所有的複選框/單選按鈕,爲每個不同的狀態(檢查,懸停,焦點,活動,禁用)定義的背景位置添加一個精靈圖像。我不知道我可以選擇什麼來實現這一點,關於自定義css3複選框等的所有教程在輸入和CSS特別反映後都有標籤。對不起,如果我沒有準確回答你的問題或者有足夠的細節。 –

+0

你的回答很明確,但你的限制並不完全。因此,除了要求在標籤內保留輸入的要求外,您是否可以編輯HTML?例如,你可以在每個複選框後添加一個空的'',或者將相鄰的內容包裝在一個?如果沒有,恐怕你被卡住了使用JavaScript(這不是一件壞事)。 –

回答

2

不幸的是CSS不允許基於子元素的父元素的造型這將是最簡單的方法例如:

div.a < div { border: solid 3px red; } 

選擇孩子的基於父相反:

div.a > div { border: solid 3px red; } 

你想要做的事情可以使用jQuery來實現。

退房this後。

+0

有趣的,我會研究這個。在回顧其他答案之後,看起來JS確實是這裏的關鍵,正如Wesley Murch所說,我可以通過簡單地向封裝標籤添加一個類來實現它。謝謝! –

1

非常有趣的問題。真相被告知,我非常肯定,僅靠CSS就不可能。

如果標籤的屬性存在某種模式(ctrl_enable_rte),那麼對您有希望。例如,如果所有複選框標籤與rte結束,你可以使用

label[for$=rte] { ... } 

如果不存在這樣的模式,並且該複選框的ID是任意選擇,你必須訴諸的JavaScript。

+0

有趣的是,我得看看這個,看看它是否可能的解決方案,謝謝!編輯:似乎「ctrl_」在任何地方使用複選框輸入,但它也用於沒有複選框的標籤。猜猜這畢竟不行,而且JS越來越像這裏唯一的出路。 –

+0

我不明白這是如何用於樣式的標籤取決於檢查控制狀態。狀態是dynamix,'for'屬性是靜態的。 –

11

如果您可以編輯標記來包裝實際的標籤字符,例如:

<label> 
    <input type="checkbox"> 
    <span>One</span> 
</label> 
<label> 
    <input type="checkbox"> 
    <span>Two</span> 
</label> 
<label> 
    <input type="checkbox" disabled> 
    <span>Three</span> 
</label> 

你可以拉過一些技巧與CSS:

label { 
    position:relative; 
    cursor:pointer; 
} 
label [type="checkbox"] { 
    display:none; /* use your custom sprites instead as background on the span */ 
} 
[type="checkbox"] + span { 
    display:inline-block; 
    padding:1em; 
} 
:checked + span { 
    background:#0f0; 
} 
[type="checkbox"][disabled] + span { 
    background:#f00; 
}​ 

演示:http://jsfiddle.net/dMhDM/1/

請記住,如果瀏覽器不支持:checked,這將失敗。

這與其他解決方案基本相同,但是在跨度而不是標籤上完成了定位。

+0

雖然這將涉及到編輯我想要避免的HTML,但這是一種使用正則表達式的一些模板mod可能的方法,在論壇更新期間,這些方法會更好和無縫。唯一的缺點是我仍然需要修改73個模板和任何來自未來更新或插件的新模板。也許我應該放棄純粹的CSS解決方案,而是考慮讓JS在所有情況下都能很好地工作。感謝您花時間回覆並撰寫了一個示例,非常感謝。我相信它會幫助那些不像我自己那樣處於特殊狀況的人。 –

+0

或者您可以簡單地修改「{xen:phrase ...}」輸出的任何內容以將其包含在一個範圍中。我個人會和js一起去,但是我的公司支持IE7作爲規則 - 我嫉妒那些每天都會使用CSS3的人。 –

+0

嗯,沒想到。儘管這可能會在某些地區造成一些尷尬,但這絕對是另一種可能性。絕對看起來像JS是唯一的方式去這裏......它會增加額外的瀏覽器兼容性,CSS將缺乏。我只需要弄清楚一個適合我的情況的優秀JS解決方案。再次感謝。 –