li{ display: inline-block; background: red; width: 300px; height: 100px; } <div> <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> </div>
瀏覽器會把inline元素間的空白字符(空格、換行、Tab等)渲染成一個空格。而爲了美觀。咱們一般是一個<li>
放在一行,這致使<li>
換行後產生換行字符,它變成一個空格,佔用了一個字符的寬度。
解決:
方法一:爲<li>
設置float: left
。不足:有些容器是不能設置浮動,如左右切換的焦點圖等。
方法二:將全部<li>
寫在同一行。不足:代碼不美觀。
方法三:將<ul>
內的字符尺寸直接設爲0,即font-size: 0
。不足:<ul>
中的其餘字符尺寸也被設爲0,須要額外從新設定其餘字符尺寸,且在Safari瀏覽器依然會出現空白間隔。
方法四:消除<ul>
的字符間隔letter-spacing: -8px
,而這也設置了<li>
內的字符間隔,所以須要將<li>
內的字符間隔設爲默認letter-spacing: normal
。
在之前是須要用到js與css才能夠順利完成一個圖片瀑布流的實現,如今有了CCS3以後就能夠只用CSS樣式實現完美的自適應多列圖片瀑布流
<div></div>要點
一、column-count 把div中的文本分爲多少列
二、column-width 規定列寬
三、column-gap 規定列間隙
四、break-inside: avoid; 避免元素內部斷行併產生新列
注意: Internet Explorer 9及更早 IE 版本瀏覽器不支持 column-count 屬性。css
/*瀑布流層*/ .waterfall { -moz-column-count: 4; /* Firefox */ -webkit-column-count: 4; /* Safari 和 Chrome */ column-count: 4; -moz-column-gap: 1em; -webkit-column-gap: 1em; column-gap: 1em; } /*一個內容層*/ .item { padding: 1em; margin: 0 0 1em 0; -moz-page-break-inside: avoid;a -webkit-column-break-inside: avoid; break-inside: avoid; border: 1px solid #000; }
擴展
CSS3多列屬性
column-count
一行須要分割多少列column-gap
每一列的列距column-rule-style
列邊框樣式column-rule-width
列邊框寬度column-rule-color
列邊框顏色column-rule
column-rule-*
全部屬性的簡寫。 如:column-rule: 1px solid #ccc(與border使用類似)column-span
指定元素跨越多少列column-width
指定列的寬度能夠直接使用CSS3中的:nth-child(n)
選擇器。
:nth-child(n)
選擇器匹配父元素中的第 n 個子元素,元素類型沒有限制。n 能夠是一個數字,一個關鍵字,或者一個公式。
table tbody tr:nth-child(2) td:nth-child(2){ background: red; }
我當時提出的是使用排除法,只要第二行第二列,也就是排除第一行第一列,因此就能夠直接使用:not()
排除就能夠了。不過當須要排除的行列更多時,這個方法明顯不行,所以能夠用第二種方法,CSS3中的~
選擇器。
<div></div>
~
選擇器
element1~element2
選擇器匹配出如今element1
後面的element2
。
element1
和element2
這兩種元素必須具備相同的父元素,但element2
沒必要緊跟在element1
的後面。
//能夠修改第幾行第幾列,即爲第n+1行第n+1列 這裏的n爲1 tr:nth-child(n)~tr>td:nth-child(n)~td { background: red; }
經典問題,具體參考 javaScript事件流
事件委託:事件委託就是利用事件冒泡,只指定一個事件處理程序,就能夠管理某一類型的全部事件。
通俗來說就是把多個相同的子元素的點擊事件綁定到父元素上,利用時間冒泡的原理,點擊子元素最終都會冒泡到父元素,所以只把事件綁定在父元素判斷是哪一個子元素被點擊就能夠了。
<div></div>
舉個栗子
子節點實現相同的功能:
// 實現功能是點擊li,彈出123: <ul id="ul1"> <li>111</li> <li>222</li> <li>333</li> <li>444</li> </ul> // 傳統的方法 須要經過循環對多個li進行時間綁定 window.onload = function(){ var oUl = document.getElementById("ul1"); var aLi = oUl.getElementsByTagName('li'); for(var i=0;i<aLi.length;i++){ aLi[i].onclick = function(){ alert(123); } } } // 事件委託的方式 // Event對象提供了一個屬性叫target,能夠返回事件的目標節點,咱們成爲事件源,也就是說,target就能夠表示爲當前的事件操做的dom,可是不是真正操做dom,固然,這個是有兼容性的,標準瀏覽器用ev.target,IE瀏覽器用event.srcElement window.onload = function(){ var oUl = document.getElementById("ul1"); oUl.onclick = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; if(target.nodeName.toLowerCase() == 'li'){ alert(123); alert(target.innerHTML); } } }
target
:觸發事件的某個具體對象,只會出如今事件流的目標階段(誰觸發誰命中,因此確定是目標階段)
currentTarget
:綁定事件的對象,恆等於this,可能出如今事件流的任意一個階段中
也是一個經典問題,參考 Vue.js 父子組件及非父子組件間實現通訊
有多種方法解決html
- 使用一個空的 Vue 實例做爲中央事件總線
- 使用Vuex
- 使用localStorage和SessionStorage
相同點:均可以做爲瀏覽器存儲,且都不能進行跨域訪問;
不一樣點:前端
- cookie始終會在同源 http 請求頭中攜帶(即便不須要),在瀏覽器和服務器間來回傳遞
- localStorage 不會自動把數據發給服務器,僅在本地保存;
- localStorage 存儲大小比cookie大得多,能夠達到5M或更大;
- localStorage 存儲持久數據,瀏覽器關閉後數據不丟失除非主動刪除數據;
- cookie 設置的cookie過時時間以前一直有效,與瀏覽器是否關閉無關。