容器的左上角——這一部分對整個(gè)布局特性是關(guān)鍵的,就像使面板互相位于頂部。規(guī)則設(shè)置面板為和容器同樣的高度,給內(nèi)容一些內(nèi)邊距,設(shè)置字體顏色(
color
),和背景顏色(
background-color
)。
我們將添加的第二條規(guī)則,對帶有類( class
)為( active-panel
)的面板,設(shè)置z-index
為 1,會讓他位于其他的面板之上(默認(rèn)定位元素 z-index
的值是 0,會使默認(rèn)元素位于下面)。同樣的,我們會在合適的時(shí)候用JavaScript 來添加這個(gè)類。
.info-box article {
position: absolute;
top: 0;
left: 0;
height: 352px;
padding: 10px;
color: white;
background-color: #a60000;
}
.info-box .active-panel {
z-index: 1;
}
添加我們的JavaScript
讓這些特性工作的最后一步是添加一些JavaScript。添加下列一塊代碼,準(zhǔn)確的寫在你的開始和結(jié)束的
標(biāo)簽之間(在接下來的HTML內(nèi)容中你將會發(fā)現(xiàn)這些):
var tabs = document.querySelectorAll(".info-box li a");
var panels = document.querySelectorAll(".info-box article");
for(i = 0; i < tabs.length; i++) {
var tab = tabs[i];
setTabHandler(tab, i);
}
function setTabHandler(tab, tabPos) {
tab.onclick = function() {
for(i = 0; i < tabs.length; i++) {
if(tabs[i].getAttribute("class")) {
tabs[i].removeAttribute("class");
}
}
tab.setAttribute("class", "active");
for(i = 0; i < panels.length; i++) {
if(panels[i].getAttribute("class")) {
panels[i].removeAttribute("class");
}
}
panels[tabPos].setAttribute("class", "active-panel");
}
}
這些代碼做了如下工作:
首先我們保存所有的選項(xiàng)卡和所有的面板引用到兩個(gè)變量中,名為 tabs
和 panels
,這樣此后我們可以容易地為它們做事。
然后我們使用 for
循環(huán)遍歷所有的選項(xiàng)卡,并且在每一個(gè)上運(yùn)行叫做setTabHandler()
的函數(shù),此函數(shù)建立當(dāng)每個(gè)選項(xiàng)卡被點(diǎn)擊時(shí)應(yīng)該發(fā)生的功能。 運(yùn)行時(shí), 函數(shù)會被傳遞選項(xiàng)卡,和一個(gè)索引數(shù)i
指明選項(xiàng)卡在tabs
數(shù)組中的位置。
在setTabHandler()函數(shù)中,這個(gè)標(biāo)簽創(chuàng)建了一個(gè)onclick事件來處理點(diǎn)擊,所以當(dāng)標(biāo)簽被點(diǎn)擊的時(shí)候,接下來會發(fā)生:
一個(gè)for循環(huán)用來清除所有標(biāo)簽當(dāng)前存在的類。
當(dāng)點(diǎn)擊的時(shí)候在標(biāo)簽上創(chuàng)建了一個(gè)active 類——從相關(guān)聯(lián)的元素中繼承了CSS的一些屬性,具有和panels的樣式相同的顏色,背景顏色。
一個(gè)for循環(huán)用于清除所有面板當(dāng)前存在的類。
當(dāng)標(biāo)簽被點(diǎn)擊的時(shí)候在和標(biāo)簽相對應(yīng)的面板上創(chuàng)建了一個(gè)active-panel 類——從相關(guān)聯(lián)的元素中繼承了CSS的一些屬性,使他的z-index屬性被設(shè)置為1,讓他能位于所有的面板的上面。
效果如下:
一個(gè)固定位置的列表消息盒子
在我們的第二個(gè)例子中,我們將會采用我們的第一個(gè)例子——我們的消息盒子——把她加到一個(gè)滿的網(wǎng)頁之中去。但是不僅僅是這樣——我們將固定她的位置,以便于他能待在瀏覽器窗口的同一個(gè)位置。當(dāng)主要內(nèi)容滾動時(shí),這個(gè)消息盒子將會待在屏幕的同一個(gè)位置。我們完工以后的例子長下面這樣:
注:你可以點(diǎn)擊藍(lán)字 fixed-info-box.html (source code)預(yù)覽完成后的效果,看看哪些部分是你在這篇文章里你要制作的。
在開始的時(shí)候,你可以使用第一部分中完成的例子,或者從我們的Github倉庫中info-box.html 拷貝info-box.html到本地。
添加HTML
首先,我們需要一些額外的內(nèi)容在當(dāng)前的主內(nèi)容中。添加下列部分在你的body標(biāo)簽之中,在已存在的部分之中前:
Fake content
This is fake content. Your main web page contents would probably go here.
This is fake content. Your main web page contents would probably go here.
This is fake content. Your main web page contents would probably go here.
This is fake content. Your main web page contents would probably go here.
This is fake content. Your main web page contents would probably go here.
This is fake content. Your main web page contents would probably go here.
This is fake content. Your main web page contents would probably go here.
This is fake content. Your main web page contents would probably go here.
注:你可以隨意更改內(nèi)容,替換為你想要內(nèi)容。
更改存在的CSS
接下來我們需要對之前的Css進(jìn)行一些小修改,讓消息盒子放置和定位的好一些。刪除你的margin: 0 auto (不需要居中顯示),添加fixed定位;調(diào)整top 屬性把她粘在瀏覽器的視域。
.info-box {
width: 450px;
height: 400px;
position: fixed;
top: 0;
}
對主內(nèi)容樣式設(shè)計(jì)
對于這個(gè)例子來說唯一剩下的事情就是給主內(nèi)容提供一些樣式設(shè)計(jì)。添加下面的規(guī)則到你剩下的Css 的下面:
.fake-content {
background-color: #a60000;
color: white;
padding: 10px;
height: 2000px;
margin-left: 470px;
}
開始我們給這個(gè)內(nèi)容和消息盒子面板一樣的背景顏色,顏色,內(nèi)邊距。然后給他一個(gè)大的margin-left使他移動到右邊,為消息盒子在左邊騰出位置,以便于各個(gè)部分不重疊。
這標(biāo)志著第二個(gè)例子的結(jié)束;我們希望你能感到第三個(gè)例子,完全是因?yàn)榕d趣。
一個(gè)滑動隱藏的面板
最后一個(gè)我們在這里介紹的例子是通過按圖標(biāo)使面板滑動出現(xiàn)或者消失——就像前面提到的,這種場景在移動端的布局很流行,因?yàn)橐苿佣说钠聊缓苄。阅悴幌M褂么蟛糠纸缑鎭盹@示一個(gè)有用的內(nèi)容而是用消息面板或者菜單代替。
我們完工后的例子長這樣:
提示:你可以點(diǎn)擊藍(lán)字hidden-info-panel.html (source code)預(yù)覽完成后的效果,仔細(xì)看看哪些部分是你在這篇文章里你要制作的。
在一開始,老規(guī)矩在我們的Githib代碼倉庫拷貝hideen-info-panel-start.html(源碼)。
Hidden info panel
?
這個(gè)例子并沒有用先前的例子,所以我們需要一個(gè)新的開始文件。讓我們來仔細(xì)觀察一下這個(gè)HTML文件:
?
//label
的 for屬性規(guī)定label屬性綁定到哪個(gè)表單元素。
開始,我們看到了一個(gè)label 元素和input元素——
元素普遍用來聯(lián)系文字標(biāo)簽和表單,目的是能更好的理解表單(允許用戶查看表單元素的描述)。這里通過for屬性綁定id到了
標(biāo)簽的checkbox元素。
提示:我們已經(jīng)設(shè)置了一個(gè)特殊的問題標(biāo)記特性到我們的HTML中,來當(dāng)作我們的信息圖標(biāo)——這代表著這個(gè)按鈕將可以按下顯示或隱藏面板。
現(xiàn)在我們使用這些元素稍稍不同的目的——另一個(gè)
標(biāo)簽有副作用使你能通過點(diǎn)擊checkbox的label標(biāo)簽來選擇這個(gè)checkbox,就好像點(diǎn)擊了這個(gè)checkbox自己一樣。這就會實(shí)現(xiàn)有名的checkbox hack 技術(shù),可以提供無JS的方法來控制一個(gè)元素,通過一個(gè)按鈕的聯(lián)系。我們將控制的元素使aside元素,通過其他兩個(gè)(為了簡潔起見,我們已將其內(nèi)容從上述代碼列表中刪除)。
在下面的部分我們將解釋這一切如何運(yùn)作。
設(shè)置表單元素樣式
首先讓我們處理表單元素 - 在style標(biāo)簽之間添加以下CSS:
label[for="toggle"] {
font-size: 3rem;
position: absolute;
top: 4px;
right: 5px;
z-index: 1;
cursor: pointer;
}
input[type="checkbox"] {
position: absolute;
top: -100px;
}
設(shè)置面板的樣式
現(xiàn)在是時(shí)候?yàn)閷?shí)際的滑動面板設(shè)計(jì)風(fēng)格了。在你的css底部添加下列規(guī)則:
aside {
background-color: #a60000;
color: white;
width: 340px;
height: 98%;
padding: 10px 1%;
position: fixed;
top: 0;
right: -370px;
transition: 0.6s all;
}
這里有很多項(xiàng)——讓我們一點(diǎn)一點(diǎn)討論:
首先,我們在信息盒子中設(shè)置了一些簡單的背景顏色和顏色。
然后,我們在面板上設(shè)置一個(gè)固定的寬度,讓她的高度充滿整個(gè)瀏覽器窗口的高度。
我們同樣包括一些內(nèi)邊距來組成我們小于那個(gè)要的高度和寬度總體的值(如果我們沒有設(shè)置box-sizing:border-box來說的話是很必要的,正如這個(gè)例子)
然后,我們設(shè)置面板的定位為fixed,即使頁面的內(nèi)容在滾動,也總是顯示在同一個(gè)位置。我們把設(shè)置top屬性讓窗口粘在頂部,然后設(shè)置默認(rèn)情況下遠(yuǎn)離屏幕,設(shè)置right屬性使其位于屏幕的右邊。
最后我們設(shè)置transition屬性,Transitions是一個(gè)有意思的特性,允許你在狀態(tài)改變的時(shí)候平滑的過渡,而不是粗暴的“變”或“還原”。在這個(gè)例子中我們嘗試在checkbox被選中時(shí)讓面板平滑的滑動到屏幕上。(或者換句話說,當(dāng)問題標(biāo)記圖標(biāo)被點(diǎn)擊以后——記住,點(diǎn)擊標(biāo)簽也會選擇相對應(yīng)的checkbox!我們已經(jīng)告訴你這是一種hack了)你將會學(xué)到更多。。。
設(shè)置選擇后的狀態(tài)
這是最后的css添加——把這些放到你的css底部:
input[type=checkbox]:checked + aside {
right: 0px;
}
這里的選擇器是復(fù)雜的——我們選擇
元素鄰接的
元素,但是僅僅在他被選擇(請注意使用checked偽類來實(shí)現(xiàn)此目的),在這種情況下,我們將right屬性設(shè)置為0px,會造成面板再次出現(xiàn)在屏幕上(由于過渡屬性會平滑的出現(xiàn))。再一次點(diǎn)擊這個(gè)標(biāo)簽會取消選中checkbox,面板將會跟著再一次消失。
所以你有它 ——一個(gè)相當(dāng)巧妙的避免使用JavaScript來創(chuàng)建一個(gè)切換按鈕效果方式。 這將在IE9及以上版本中起作用(平滑過渡將在IE10及更高版本中起作用)。這種效果確實(shí)有一些問題 ——這是有點(diǎn)濫用表單元素(它們不是為了這個(gè)目的),并且在可訪問性方面效果不是很好 - 標(biāo)簽在默認(rèn)情況下不可聚焦,并且表單元素的非語義使用可能會導(dǎo)致屏幕朗讀器出現(xiàn)問題。 JavaScript和鏈接或按鈕可能更合適,但這樣的實(shí)驗(yàn)仍然很有趣。
最后完成的代碼如下:
(另外這里我使用了?
來取代那個(gè)問號的圖標(biāo),效果是一樣的。)
Hidden info panel
?
gif效果圖:
總結(jié)
這樣完成了我們對定位的關(guān)注——現(xiàn)在,你應(yīng)該理解基本機(jī)制的工作原理,同樣理解了怎樣應(yīng)用這些知識去構(gòu)建一些有趣的用戶界面功能,不要由于你還未完全理解所有的知識而擔(dān)心——定位是一個(gè)相當(dāng)高級的話題,你可以隨時(shí)讀這篇文章來幫助你的理解。下一個(gè)主題我們將轉(zhuǎn)向Flexbox。
【end】
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/2178.html