作為最常用的布局元素,DIV在Web開發中起著至關重要的作用。這裡總結一下我在使用DIV中遇到的各種操作。
1.div顯示滾動條 這個是很常見的一個任務了,基本是通過CSS去實現滾動條。
(1)垂直滾動條
設置是否顯示滾動條主要是在CSS中設置下列的屬性:
復制代碼代碼如下:
overflow:visible|auto|hidden|scroll
overflow-x:橫向滾動條
overflow-y:縱向滾動條
參數的意義:
visible: 不剪切內容也不添加滾動條。假如顯式聲明此默認值,對象將被剪切為包含對象的window或frame的大小。並且clip屬性設置將失效。
auto: 此為body對象和textarea的默認值。在需要時剪切內容並添加滾動條
hidden: 不顯示超過對象尺寸的內容
scroll: 總是顯示滾動條
overflow:auto;這個表示當你內容超過div高度出現垂直的滾動條
所以我們想在需要的時候顯示垂直的滾動條,可以這麼實現:
復制代碼代碼如下:
<divstyle="overflow:auto;">...</div>
或者
復制代碼代碼如下:
<divstyle="overflow-y:auto;">...</div>
(2)水平滾動條
如果只想出現水平的滾動條,一般還要配合禁止換行的設置,例如:
復制代碼代碼如下:
<divstyle="overflow-x:auto;height:40px;width:100px;white-space:nowrap"></div>
(3)滾動條的外觀
在IE中,主要是使用各種顏色屬性:
復制代碼代碼如下:
scrollbar-3dlight-color:color;設置或檢索滾動條亮邊框顏色;
scrollbar-highlight-color:color;設置或檢索滾動條3D界面的亮邊顏色;
scrollbar-face-color:color;設置或檢索滾動條3D表面的顏色;
scrollbar-arrow-color:color;設置或檢索滾動條方向箭頭的顏色;當滾動條出現但不可用時,此屬性失效;
scrollbar-shadow-color:color;設置或檢索滾動條3D界面的暗邊顏色;
scrollbar-darkshadow-color:color;設置或檢索滾動條暗邊框顏色;
scrollbar-base-color:color;設置或檢索滾動條基准顏色。其它界面顏色將據此自動調整。
scrollbar-track-color:color;設置或檢索滾動條的拖動區域顏色
在Chrome中,基本上是使用webkit專用屬性設置:
復制代碼代碼如下:
::-webkit-scrollbar-track-piece{
background-color:#fff;/*滾動條的背景顏色*/
-webkit-border-radius:0;/*滾動條的圓角寬度*/
}
::-webkit-scrollbar{
width:8px;/*滾動條的寬度*/
height:8px;/*滾動條的高度*/
}
::-webkit-scrollbar-thumb:vertical{/*垂直滾動條的樣式*/
height:50px;
background-color:#999;
-webkit-border-radius:4px;
outline:2pxsolid#fff;
outline-offset:-2px;
border:2pxsolid#fff;
}
::-webkit-scrollbar-thumb:hover{/*滾動條的hover樣式*/
height:50px;
background-color:#9f9f9f;
-webkit-border-radius:4px;
}
::-webkit-scrollbar-thumb:horizontal{/*水平滾動條的樣式*/
width:5px;
background-color:#CCCCCC;
-webkit-border-radius:6px;
}
2.禁止div的事件冒泡 這個基本上都是使用標准的event.stopPropagation()方法阻止事件冒泡,當然IE除外:
復制代碼代碼如下:
functionBigDiv(event){
if(event.stopPropagation){
event.stopPropagation();//在基於firefox內核的浏覽器中支持做法stopPropagation
}else{
event.cancelBubble=true;//基於ie的寫法
}
//othercodes...
}
3.禁止div執行默認的行為 這個其實是一個普遍的問題,對於具有默認行為的元素,比如提交按鈕的提交表單行為,,<a>元素的超鏈接行為等,我們如果在這些元素上應用事件,同時也往往希望取消它們的默認行為,這個通過在事件的回調函數中調用event.preventDefault();實現。
4.動態計算div的位置(比如常見的計算div彈出層的位置)
(1)DOM屬性方式
offsetTop:當前對象到其上級層頂部的距離。不能對其進行賦值,設置對象到父對象頂部的距離需要使用style.top屬性。
offsetLeft:當前對象到其上級層左邊的距離.。不能對其進行賦值,設置對象到父對象左邊的距離需要使用style.left屬性。
這裡要注意offsetTop與style.top的區別(offsetLeft與style.left也是一樣的道理):
•offsetTop返回的是數字,而style.top返回的是字符串,除了數字外還帶有單位:px,通常需要使用parseInt轉換成數值。
•offsetTop只讀,而style.top可讀寫。
•如果沒有給HTML元素指定過top樣式,則style.top返回的是空字符串。
注意:在FireFox中,給style.top賦值的時候,也要是字符串(帶px)這種形式。
(2)CSS中position屬性對位置的影響
position默認的屬性值都是static,靜態。但是position中最關鍵的屬性值是relative(相對)以及absolute(絕對)。
往往我們會把absolute屬性與left、top配合起來制作相關的“懸浮層”效果。然而有時候我們需要針對某一個容器的懸浮效果,而不是針對窗口的。這時候通過高度、寬度的計算不但麻煩,而且幾乎無法完美實現效果。其實只要把其上一級的樣式屬性position設置為relative就可以了。也就是說,position的屬性值的效果,直接受其容器樣式中position屬性值影響。例如如下A-B的嵌套結構
復制代碼代碼如下:
<divid="A">
<divid="B">
</div>
</div>
當A的position為relative時,B的position為absolute才有效。這時候left:0、top:0就不再針對窗口文檔,而是針對id為A的這個div了。但是如果你在A中的padding="50px",在A中的其他沒有設置postion為absolute的會隨著A的padding的值而變化,但是B不會變的它的position是相對上一級的。
這裡再稍微啰嗦一下position的四個屬性值:relative,absolute,fixed,static。還是以上面的代碼為例:
relative
relative值意味著元素要根據它本身的位置進行相對的偏移。例如在上面的代碼中,如果設定B設置了relative值,比如設置如下CSS代碼:
復制代碼代碼如下:
#B{
position:relative;
padding:5px;
top:5px;
left:5px;
}
我們可以這樣理解,如果不設置relative屬性,B的位置按照正常的文檔流,它應該處於某個位置。但當設置B的position為relative後,將根據top,right,bottom,left的值按照它理應所在的位置進行偏移,relative的“相對的”意思也正體現於此。
注意:relative的偏移是基於對象的margin的左上側的。
absolute
這個屬性總是有人給出誤導。說當position屬性設為absolute後,總是按照浏覽器窗口來進行定位的,這其實是錯誤的。實際上,這是fixed屬性的特點。
當B的position設置為absolute後,其到底以誰為對象進行偏移呢?這裡分為兩種情況:
•當B的父對象(或曾祖父,只要是父級對象)parent也設置了position屬性,且position的屬性值為absolute或者relative時,也就是說,不是默認值的情況,此時B按照這個parent來進行定位。
•當B不存在一個有著position屬性的父對象,那麼那就會以body為定位對象,按照浏覽器的窗口進行定位,這個比較容易理解。
fixed
fixed是特殊的absolute,即fixed總是以body為定位對象的,按照浏覽器的窗口進行定位。
static
position的默認值,一般不設置position屬性時,會按照正常的文檔流進行排列。
(3)Jquery方式
提示類彈出框是常見的一種方式,這個任務最重要的是計算彈出框的位置。通過事件對象獲取到事件源,然後可以使用offset()函數計算事件源相對於document的位置:
復制代碼代碼如下:
vartop=$(event.target).offset().top;
varleft=$(event.target).offset().left;
因為是相對於document,即頁面左上角的位置,所以需要將彈出層放在Body元素中的第一層,即父類就是body。如果包含在其他元素中,需要確定任何一個父類的position樣式設置為了relative。計算出來的top和left是事件源的位置,在此位置顯示會將事件源對象遮蓋住。所以通常需要手工做一些偏移,比如top+20。
5.隱藏div元素 css中隱藏元素可以有兩種方式:display:none或者visibility:hidden。兩種方式的不同之處在於設置display的值後元素完全隱藏,元素所占的位置也沒有了,下面的元素上移。設置visibility後元素所占的位置還在,就是看不見。
6.div的子元素橫排,豎排 使用float屬性控制。div默認是豎排的,寬度是100%,CSS中設置float:left以後就變成橫排了。如果想從橫排中間斷開,後面的還原成豎排,則需要使用clear:both修改。看下面的例子:
復制代碼代碼如下:
<div>
<divstyle="float:left">aaaaaaaaaaaaaa</div>
<divstyle="float:left">bbbbbbbbbbbbbb</div>
以上這兩個div就是橫向排列。
<divstyle="clear:both"></div>這個東西很重要,它清除上兩個層的浮動,也就是說以下的層就繼續垂直排列了。
<div>這個層就垂直排列了</div>
<div>這個層就垂直排列了</div>
</div>
上面只是float屬性的一個簡單應用。
float屬性主要是用於控制元素的流向,也就是向右靠攏,還是向左靠攏。這裡看一下float屬性的語法:
復制代碼代碼如下:
float:none|left|right
none:默認值。對象不飄浮
left:文本流向對象的右邊
right:文本流向對象的左邊
為了達到某些效果,通常我們需要在某個時候取消浮動以免對別的對象造成影響,這是通過上面介紹過的那個clear屬性實現的:
clear屬性有四個值:
復制代碼代碼如下:
clear:both|left|right|none;
簡單來說呢,clear屬性的作用就是“清除”浮動。如果某元素設置clear:left;表示該元素左邊不存在浮動元素;相應的,clear:right;表示該元素右邊不存在浮動元素;clear:both;表示該元素兩邊都不存浮動元素。clear:none表示兩邊允許有浮動元素。
7.設置div中文字的字體 先看一下CSS中控制文本的屬性列表:
復制代碼代碼如下:
Word-spacing:定義了各個單詞之間的間距,取值:Normal|<length>。
Letter-spacing:定義了每個字母之間的間距,取值:Normal|<length>。
Text-decoration:定義文字的“裝飾”樣式,取值范圍:None|underline|overline|line-through|blink。
Vertical-align:定義了元素在垂直方向上的位置,取值:Baseline|sub|super|top|text-top|middle|bottom|text-bottom|<percentage>。
text-transform:使文本轉換為其它形式,取值:Capitalize|uppercase|lowercase|none。
Text-align:定義了文字的對齊方式,取值:Left|right|center|justify。
Text-indent:定義了文本的首行的縮進方式,取值:<length>|<percentage>。
Line-height:定義了文本的行高,取值:Normal|<number>|<length>|<percentage>。
我們可以從上面看到在這裡可以定義文本的文字間距、字母間距、裝飾、對齊方式、縮進方式和行高等屬性。舉個例子來看看吧:
復制代碼代碼如下:
<pstyle="letter-spacing:5px;text-align:justify;text-indent:4em;line-height:17pt">我們看到經過文本屬性處理的文本字與字之間多了間距,行與行之間多了行高,對齊方式變成了兩端對齊,並且段首又多縮進了兩格。</p>
letter-spacing設置了字間距為5px,其中5px為一個長度單位;text-align設置了對齊方式為兩端對齊;indent設置了縮進格為4em;line-height設置了行高為17pt。從上面的例子,我們可以看出利用CSS的文本屬性可以方便的對頁面中的文本進行排版。
行間距取決於字體的大小,一般來說,小的字號需要大一點的行間距來便於閱讀,中文字體在網頁上如果沒有行間距的設定,對於閱讀大段文字來說是讀者的災難,所以適當設定line-height是非常必要的。一般地,line-height在網頁設計中應該是字體大小的1.5倍到2倍。Word和其它的文本編輯軟件裡,一般設定字體的120%作為缺省的行間距。css裡的line-height設定,是均分後加在每一行的上下,也就是說,如果line-height設定為20px的話,那麼每一行文字的上下各有10px的間距。
8.設置div的tooltip分行顯示 在html種對於鏈接和圖片,我們可以通過添加title屬性以顯示一些說明文字,一般情況下,這些文字都是顯示成一行,那麼有沒有辦法讓它以多行的方式顯示呢?解決的方法有兩種:
(1).將title屬性分成幾行來寫,例如:
復制代碼代碼如下:
<ahref=#"title="說明一
說明二
說明三">建站學</a>
(2).第一行相對來說不夠直觀,我們還可以在需換行的地方添加 (&為半角)或 來實現:
復制代碼代碼如下:
<ahref=#"title="說明一 說明二 說明三">建站學</a>
<ahref=#"title="說明一 說明二 說明三">建站學</a>
9.鼠標中鍵控制水平滾動條 在Chrome和FireFox中,一般都是鼠標中鍵控制垂直滾動條,如果你的DIV只有水平控制條,默認情況下,鼠標中鍵是不起滾動作用的,這個時候需要自己實現。
首先,掛接鼠標滾輪事件:
復制代碼代碼如下:
//MousewheeleventforNonFireFox
element.onmousewheel=fireElementScrolled;
//MousewheeleventforFireFox
element.addEventListener('DOMMouseScroll',fireElementScrolled,false);
這裡FireFox的特殊一點,需要使用addEventListener這種方式掛接。
然後,實現fireElementScrolled方法:
復制代碼代碼如下:
fireElementScrolled=function(event){
varrolled=0;
if(event.wheelDelta){
rolled=event.wheelDelta;
}
else{
//Firefox:需要處理一下下
rolled=-event.detail*30;
}
varhtmlElement=document.getElementById('test');
htmlElement.scrollLeft=htmlElement.scrollLeft-rolled;
event.preventDefault();
returnfalse;
};
原理很簡單,就是拿到滾輪滾動的距離,處理後給div元素的scrollLeft屬性賦值即可。
10.子元素居中 (1)水平居中
普通的文字和圖片居中很好辦,設置父容器的CSS樣式包含text-align:center;即可。
當子元素是DIV等元素的情況稍微復雜一點,以子元素為div為例,如果只有一個子div,則可以通過設置子元素的CSS樣式包含margin:0auto;實現居中。例如下面的例子:
復制代碼代碼如下:
<divid="a"style="width:400px;height:300px;border:1pxsolidgreen;">
<divid="b"style="margin:0auto;width:200px;border:1pxsolidblue;">簡單的一個子DIV居中問題</div>
</div>
如果含有多個子元素,我通常是多加一層div來實現,看例子:
復制代碼代碼如下:
<divstyle="width:400px;height:300px;border:1pxsolidred;">
<divstyle="margin:0auto;position:relative;left:50%;float:left;">
<divstyle="position:relative;left:-50%;float:left">
<divstyle="border:1pxsolidblue;text-align:center;">1</div>
<divstyle="border:1pxsolidblue;text-align:center;">2</div>
<divstyle="border:1pxsolidblue;text-align:center;">3</div>
<divstyle="border:1pxsolidblue;float:left;">4</div>
<divstyle="border:1pxsolidblue;float:left;">5</div>
<divstyle="border:1pxsolidblue;float:left;">6</div>
</div>
</div>
</div>
(2)垂直居中
垂直居中麻煩一點,有一種做法很簡單,可以同時實現水平和垂直居中。首先給父元素寫上positon:relative,這麼做是為了給子元素打上position:absolute的時候不會被定位到外面去。接下去,寫上子元素的height和width,某些浏覽器在解析的時候如果沒有這2個值的話會出現意想不到的錯位。接著就是整個方法的核心,給子元素再打上top:50%;left:50%以及margin-top:一半的height值的的負數;margin-left:一半的weight值的負數。當然,這裡父元素也要先寫上width和height。看例子:
復制代碼代碼如下:
<divstyle="width:600px;height:300px;position:absolute;top:50%;left:50%;margin-top:-150px;margin-left:-300px;border:1pxsolidred;">居中方法</div>