視口(viewport)是用來(lái)約束網(wǎng)頁(yè)中最頂級(jí)塊元素的,即它決定了網(wǎng)頁(yè)的大小,網(wǎng)頁(yè)是先在視口上渲染,然后再通過(guò)視口放回到瀏覽器窗口上的,網(wǎng)頁(yè)的渲染過(guò)程如下:
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的浪卡子網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
pc端視口的大小和瀏覽器的大小一樣,所以網(wǎng)頁(yè)是1:1的放到瀏覽器窗口上,而移動(dòng)端視口就有點(diǎn)特殊,移動(dòng)端視口的寬度是比移動(dòng)端屏幕要寬,寬度尺寸一般是980px或者1024px,網(wǎng)頁(yè)是視口上渲染完之后,為了能在移動(dòng)端屏幕上顯示整個(gè)網(wǎng)頁(yè),整個(gè)視口會(huì)整體縮放到屏幕的寬度,這樣,網(wǎng)頁(yè)看上去就整體縮放
具體如何設(shè)置視口以及禁止視口頁(yè)面縮放可以自行百度
(主要針對(duì)移動(dòng)端以及pc端網(wǎng)頁(yè)需要實(shí)現(xiàn)等比放大縮小頁(yè)面效果)
大概有以下幾種
1、流體布局
流體布局其實(shí)就是寬度用百分比,高度用固定值的布局方式,寬度通過(guò)百分比來(lái)適配不同寬度的屏幕。
為了適配手機(jī)端不同尺寸的屏幕,我們?cè)诙x元素寬度的時(shí)候可以寫(xiě)百分比,百分比是相對(duì)于屏幕的寬度,所有寬度就可以做到自適應(yīng),而在高度方向,由于網(wǎng)頁(yè)的高度是不定的,所以我們可以把高度寫(xiě)成固定的值(px),這種布局方式叫做流體布局。
注意兩個(gè)概念
2、彈性盒模型布局flex
這種布局方式是通過(guò)css3新增的一些輔助布局的樣式屬性來(lái)制作布局的方式。
3、rem布局
rem是一種相對(duì)長(zhǎng)度單位,通過(guò)這個(gè)長(zhǎng)度單位可以實(shí)現(xiàn)元素寬高等比例縮放,從而完成不同寬度屏幕的適配。
4、響應(yīng)式布局 (媒體查詢)
通過(guò)樣式動(dòng)態(tài)查詢屏幕的寬度,動(dòng)態(tài)切換樣式來(lái)適配不同寬度屏幕的布局方式。
Bootstrap是最典型的一種
待補(bǔ)充
實(shí)際開(kāi)發(fā)中,pc端頁(yè)面需要實(shí)現(xiàn)響應(yīng)式等比縮放(即自適應(yīng)),使用rem+彈性布局是比較現(xiàn)實(shí)及理想的解決方式
移動(dòng)端可以使用rem布局,也可以使用px實(shí)現(xiàn)(主要用flex),具體看產(chǎn)品是怎么設(shè)計(jì)要求的
css3規(guī)定:1rem的大小就是根元素html的font-size的值。
rem其實(shí)是一個(gè)單位 ,是個(gè)相對(duì)單位 root em。rem就是root(根元素的大?。┫鄬?duì)于html元素的字體大小的單位。
rem布局的原理
就是根據(jù)一個(gè)html根元素來(lái)控制,網(wǎng)頁(yè)的布局,實(shí)現(xiàn)類(lèi)似于自適應(yīng)等比例的縮放的布局。
rem優(yōu)勢(shì)
通過(guò)修改html文字的大小,來(lái)改變頁(yè)面中元素的大小,實(shí)現(xiàn)了頁(yè)面的整體控制
rem的作用
通過(guò)設(shè)置 根元素html的font-size的大小,來(lái)控制整個(gè)html文檔內(nèi)的字體大小、元素寬高、內(nèi)外邊距等,根據(jù)移動(dòng)設(shè)備的寬度大小來(lái)實(shí)現(xiàn)自適應(yīng),不同的設(shè)備都展示一致的頁(yè)面效果。
簡(jiǎn)單用法
vscode中安裝cssrem插件,通過(guò)這個(gè)插件可以自動(dòng)計(jì)算rem數(shù)值。
具體設(shè)置如下
注意:設(shè)置后 vscode軟件需要重啟 否則計(jì)算的rem值會(huì)出錯(cuò)
待補(bǔ)充
可以通過(guò)js的方式來(lái)改變,也可以通過(guò)css媒體查詢的方式來(lái)改變,
待補(bǔ)充
需要準(zhǔn)備的材料分別有:電腦、瀏覽器、html編輯器。
1、首先,打開(kāi)html編輯器,新建html文件,例如:index.html。
2、在index.html中的head標(biāo)簽中,輸入meta代碼:meta name="viewport" content="width=device-width, initial-scale=1"。
3、瀏覽器運(yùn)行index.html頁(yè)面,此時(shí)PC端的網(wǎng)頁(yè)在移動(dòng)端上也能自動(dòng)適配。
在移動(dòng)端實(shí)現(xiàn)純css的自定義布局的方法:
1、html5主頁(yè)面
!doctype html
html lang="en"
head
meta charset="UTF-8"
meta name="viewport" content="width=device-width,initial-scale=1 user-scalable=0"/
titlehtml5 移動(dòng)端單頁(yè)面布局/title
/head
body
!--頁(yè)面主體部分--
div class="main"
section class="curr"
img src="pp_1x.png" alt=""
/section
section class="hide"
img src="css3.jpg" alt=""
/section
section class="hide"
img src="hra.png" alt=""
/section
section class="hide"
img src="company-info_1x.png" alt=""
/section
/div
!--頁(yè)面菜單按鈕--
div class="menu"
ul
li class="curr"Html5/li
liCss3/li
liJavascript/li
liAbout/li
/ul
/div
script src="js/zepto.js"/script
/body
/html
2、css編寫(xiě)的樣式:
style
/*初始化css*/
*{ margin:0; padding: 0;}
li{ list-style-type: none;}
img{ max-width: 100%; display: block; margin: 0 auto 5px auto;}
html,body{ width: 100%; height: 100%; background: #e4e4e4;
-webkit-tap-highlight-color: rgba(88,44,22,0.9);
-webkit-touch-callout: none;
-webkit-user-select: none;
}
/*主體頁(yè)面樣式*/
.main{ width: 100%; height: auto; position: relative;}
.main section{ width: 100%; height: auto; position:absolute; left: 0; top:0; }
.main section.hide{ display: none;}
.main section.curr{ display: block;}
/*菜單樣式*/
.menu{ width: 100%; height: 45px; position: fixed; bottom:0; left:0; box-shadow: #2d2d2d 0 0 4px;background:#0099cc;}
.menu.menucurr{ background: #ea4c88;}
.menu ul{width: 100%; height: 100%; }
.menu li{ width: 24.9%; height: 100%; float: left; line-height: 45px; text-align: center; background: #0099cc; color:#fff;}
.menu li.curr{ background: #ea4c88;}
.menu li:nth-child(1),.menu li:nth-child(2),.menu li:nth-child(3){ border-right:1px solid #663300;}
/style
如果是在回調(diào)里置頂DIV的話(比如點(diǎn)擊事件),可以用scrollIntoView。
scrollIntoView如果不想吸頂 可以加個(gè)before偽類(lèi)設(shè)置高度
CSS3滾動(dòng)置頂目前有兩種解決方案:
第一種(主流):transform: translate3d(x,y,z)
第二種(未來(lái)):position: sticky;top:xxx;
假設(shè)需求:
需求一:滾動(dòng)過(guò)程中A ,C區(qū)域不吸頂,B區(qū)域吸頂
VUE框架推薦直接使用vantUI插件,indexbar索引欄。
vantUI原理用的是transform。
以上面圖片為例大致講解:
1.transform對(duì)JS的能力要求高些,頁(yè)面加載完畢后,給每個(gè)B區(qū)域?qū)?yīng)的DIV設(shè)置translate3d的Y軸值,值為B對(duì)應(yīng)div離頂部的高度。
2.當(dāng)開(kāi)始滾動(dòng)起來(lái)后,Y軸值為原來(lái)值減去滾動(dòng)條滾動(dòng)距離值
3.當(dāng)Y軸值小于0的時(shí)候,鎖死為0,就自動(dòng)吸頂了
4.當(dāng)待置頂DIV的translate3d Y軸值小于DIV的高度時(shí),已置頂DIV的Y軸值開(kāi)始變?yōu)樨?fù)數(shù),這樣會(huì)有一個(gè)頂出的效果
5.已置頂DIV被待置頂DIV頂出一定距離(一般兩倍DIV高度),取消translate3d屬性,
6.回滾反向計(jì)算即可
需求二:滾動(dòng)過(guò)程中 C不吸頂,B吸頂,A一直吸頂 B在A下面
這個(gè)需求vantUI(v2.9.3)目前解決不了,采用translate太復(fù)雜,決定采用CSS3新屬性position: sticky。
如果是2018年使用該屬性兼容性還是個(gè)問(wèn)題,但來(lái)到2020年下半年,對(duì)大部分生產(chǎn)環(huán)境都不是問(wèn)題。博主測(cè)試的IOS11和安卓小米 華為 都支持該屬性。
博主的建議是:如果是公司APP內(nèi)嵌H5頁(yè)面或者微信打開(kāi)可以使用該屬性,如果純H5頁(yè)面 ,建議translate.
position: sticky;字面意思就是粘性定位。
可以粘頂部也可以粘底部 右側(cè) 左側(cè)。
所以除了position: sticky;還要給一個(gè)定位值,比如top:0px或者right:0px就可以了 非常簡(jiǎn)單。
比如直接給Bdiv設(shè)置下面樣式就行
實(shí)際使用要注意下面幾點(diǎn):
1.如果想兼容IOS12 IOS11 必須帶position: -webkit-sticky;而且要在樣式表里寫(xiě),不能寫(xiě)在style里。
2.容器相關(guān)。只有要移除容器范疇才起作用。比如body的height不要設(shè)置100%,height:100%表示所有元素一直在屏幕范圍
關(guān)于css常見(jiàn)問(wèn)題,大多是移動(dòng)端的。
簡(jiǎn)單的排版規(guī)則:條目與條目之間空兩行,每條內(nèi)容部分分段空一行。標(biāo)點(diǎn)符號(hào)全部用中文字符。css的標(biāo)點(diǎn)用英文。
條目編號(hào)后面緊跟英文字母的,要空一格,比如 4. css,“4.”和“css”之間有一個(gè)空格。
一、在做手機(jī)輪播圖時(shí),banner圖的寬度是手機(jī)屏幕的寬度,輪播圖加了左右切換按鈕,按鈕的position:absolute;定位的元素,定位的元素超出父容器時(shí)(超出了100%),會(huì)出現(xiàn)滾動(dòng)條。
二、在移動(dòng)端有3種布局可選。
1.定位布局
說(shuō)明:頭部、尾部是fixed定位。中間內(nèi)容部分絕對(duì)定位,overflow-y:auto;
2. flex布局(朕極力推薦)
說(shuō)明:這里寫(xiě)的簡(jiǎn)潔,沒(méi)有寫(xiě)很多兼容,移動(dòng)端兼容性比較好,安卓5.1以上都可以用。用的是較新的flex聲明。(這個(gè)布局是抄襲手淘團(tuán)隊(duì)的。)
3.普通的流式布局
說(shuō)明:頭部和尾部依然是fixed定位,但是#content內(nèi)容部分則是用padding-top和padding-bottom來(lái)支撐頁(yè)面,這種布局相當(dāng)垃圾,會(huì)帶來(lái)各種頁(yè)面上下莫名其妙的留白問(wèn)題。
三、css屬性
1. word-wrap:break-word; word-break:break-all;讓一行連續(xù)的數(shù)字或英文字母遇到邊界自動(dòng)換行。
2. -webkit-user-select:none | normal | text;這個(gè)屬性是禁止用戶選擇、復(fù)制文字,同時(shí)還會(huì)使input框、select框不能獲取焦點(diǎn),導(dǎo)致無(wú)法輸入或選擇。 所以在使用這個(gè)屬性時(shí),注意防止對(duì)input和select的污染。
3. css3屬性選擇器。li[class*='act'],可以選中所有class中有‘a(chǎn)ct’的li元素。
$('li').attr('class').indexOf('act'); 只是獲取第一個(gè)li的class,然后判斷是否有‘a(chǎn)ct’;
通過(guò)for循環(huán)可以進(jìn)一步操作,
for(var i = 0; i $("li[class*='act']").length; i++){
$("li[class*='act']")[i] . . .
}
4.清除浮動(dòng),解決高度塌陷
a.偽類(lèi)(抄襲bootstrap的做法)
.clearfix{}
.clearfix:after{ display:table; content:' '; clear:both; }
b.王妮的做法
.box{ clear:both; overflow:hidden; }
c.對(duì)于子元素寫(xiě)margin-top把父級(jí)拖下來(lái)的情況
(百度說(shuō)是W3C的標(biāo)準(zhǔn),只要破壞了父級(jí)子級(jí)緊貼的結(jié)構(gòu)就可以了)
給父級(jí)寫(xiě)border-top,或者給父級(jí)寫(xiě)padding-top。采用b方法也可以,a方法無(wú)效。
5. css高度單位和顏色單位
height:calc(100vh - 200px); 目前來(lái)看,兼容性還不錯(cuò)。注意,減號(hào)兩邊是有空格的。
background:rgba(255,255,255,0.5); rgb顏色值 和 顏色透明度。
6.關(guān)于 padding-top:100%; padding-left:100%;
可以利用這兩個(gè)屬性做絕對(duì)正方形。比如微信朋友圈的照片9宮格,qq空間的照片9宮格,sina微博的照片9宮格。屏幕寬度未知,一行排3個(gè),每個(gè)寬度都是33.33333%,但是高度不能寫(xiě)百分比了。在每個(gè)寬度為33.3333%的元素里再寫(xiě)一個(gè)div,這個(gè)div的默認(rèn)寬度就是父級(jí)的33.33333%,再用padding-top:100%;把高度撐開(kāi),padding-top:%;就是根據(jù)已有寬度計(jì)算,padding-top:100%;padding-top的px值就和寬度相同,這樣,正方形就做出來(lái)了,在正方形里面position:absolute;一個(gè)div,width:100%; height:100%;然后在這個(gè)div里面布局就好。
每個(gè)正方形的間距可以用qq空間的2px的透明邊框來(lái)做,也可以像sina微博一樣,用左右padding和margin-bottom來(lái)做。一張圖和四張圖的時(shí)候,sina是另外寫(xiě)兩個(gè)class來(lái)做的。
qq空間是js插件寫(xiě)進(jìn)去的,最大寬度是290px,高度是根據(jù)最大寬度計(jì)算出來(lái)的。
7. 0.5px的線
a.發(fā)現(xiàn)qq空間的細(xì)線,兼容2倍屏和3倍屏
@media only screen and (-webkit-min-device-pixel-ratio : 1.5),(min-resolution:120dpi),(-ms-high-contrast:active),(-ms-high-contrast:none) {
.action.flex .dropdown-menu .btn:after,.action.flex:after,.action.flex:before,.feed .source:after,.min-comments .hr,.min-comments:nth-child(1):after {
-webkit-transform:scaleY(.5);
-moz-transform: scaleY(.5);
-ms-transform: scaleY(.5);
-o-transform: scaleY(.5);
transform: scaleY(.5)
}
.action.flex .dropdown-menu .btn:after,.action.flex:before,.min-comments:nth-child(1):after {
-webkit-transform-origin: 100% 0;
-moz-transform-origin: 100% 0;
-ms-transform-origin: 100% 0;
-o-transform-origin: 100% 0;
transform-origin: 100% 0
}
.action.flex:after,.action.flex.btn:after,.feed .source:after {
-webkit-transform-origin: 0 100%;
-moz-transform-origin: 0 100%;
-ms-transform-origin: 0 100%;
-o-transform-origin: 0 100%;
transform-origin: 0 100%
}
}
@media only screen and (-webkit-device-pixel-ratio: 1.5) {
.action.flex .dropdown-menu .btn:after,.action.flex:after,.action.flex:before,.feed .source:after,.min-comments .hr,.min-comments:nth-child(1):after {
-webkit-transform:scaleY(.6666);
-moz-transform: scaleY(.6666);
-ms-transform: scaleY(.6666);
-o-transform: scaleY(.6666);
transform: scaleY(.6666)
}
}
@media only screen and (-webkit-device-pixel-ratio: 3) {
.action.flex .dropdown-menu .btn:after,.action.flex:after,.action.flex:before,.feed .source:after,.min-comments .hr,.min-comments:nth-child(1):after {
-webkit-transform:scaleY(.33);
-moz-transform: scaleY(.33);
-ms-transform: scaleY(.33);
-o-transform: scaleY(.33);
transform: scaleY(.33)
}
}
b. weui的作法是
.weui-cells:after {
content: " ";
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: 1px;
border-bottom: 1px solid #e5e5e5;
color: #e5e5e5;
-webkit-transform-origin: 0 100%;
transform-origin: 0 100%;
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
z-index: 2;
}
8.背景圖片尺寸background-size,img標(biāo)簽object-fit,object-position。
background-size:contain | cover | auto 90% | 50% auto;
這是以背景圖的方式展示圖片的,如果用img元素的話,
object-fit:fill | contain | cover | none | scale-down;(和background-size效果類(lèi)似)
object-position:center; 和background-position的取值一樣。
這兩個(gè)屬性一起用的話,就能讓img元素src的圖片效果像背景圖片的效果一樣,不會(huì)因?yàn)閳D片尺寸不成比例而走形。但是兼容性不太好,目前只適合在移動(dòng)端用。
9.阻止手機(jī)彈出默認(rèn)菜單,長(zhǎng)按img標(biāo)簽或者長(zhǎng)按a標(biāo)簽會(huì)彈出系統(tǒng)默認(rèn)菜單(ios上,安卓上沒(méi)測(cè))。
-webkit-touch-callout:none;
10.給文字寫(xiě)行高時(shí),讓文字垂直居中時(shí),要把高度也一起寫(xiě)了,line-height:35px; height:35px;
在用appcan做hybrid app時(shí),發(fā)現(xiàn)在華為meta8上,用 ul li 做九宮格,li 浮動(dòng)排在一行時(shí),每個(gè) li 有文字,高度用li的行高撐開(kāi)的,沒(méi)有文字的 li 和有文字的 li 的高度是不一樣的。有的格子有文字有的沒(méi)有文字,導(dǎo)致九個(gè)格子沒(méi)有排在3行,有格子掉下去了,排成了4行。所以,在用行高讓文字居中時(shí),高度和行高要都寫(xiě)上。
11. text-align:justify;
p標(biāo)簽內(nèi)大段文字時(shí),除了最后一行,其余的文字都是左對(duì)齊,導(dǎo)致段落文字距離右邊間距明顯大于左邊。
可以利用這個(gè)屬性不處理最后一行的特性,做這種布局:
上面這個(gè)布局有一點(diǎn)bug,最后一行是留白,把父級(jí)撐高了,原因是父級(jí)認(rèn)為所有子代,包括空文本節(jié)點(diǎn)都是占據(jù)空間的,哪怕空格,也占據(jù)空間??梢越o父級(jí) ul 寫(xiě) font-size:0;就能把底部留白去除了,然后給子代再寫(xiě)font-size:14px;就可以了。 但是,text-align:justify;畢竟是處理空格(拉伸空格來(lái)使內(nèi)部元素水平分散),所以在html中,li 要是連著寫(xiě)和分段寫(xiě),表現(xiàn)結(jié)果是不一樣的,所以這種奇妙的布局還是有些許不完美,甚至不能用。
12.去除-webkit-的滾動(dòng)條
#content::-webkit-scrollbar{ display:none; }
設(shè)置滾動(dòng)條樣式
/*滾動(dòng)條寬度*/
#content::-webkit-scrollbar{ width:5px; }
/*滾動(dòng)條滑塊*/
#content::-webkit-scrollbar-thumb{ background:rgba(0,0,0,0.25); border-radius:3px; }
/*滾動(dòng)條的整個(gè)背景*/
#content::-webkit-scrollbar-track-piece{ background:#eee; }
TGuide
/* scrollbar */
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-button{display:none}
::-webkit-scrollbar-track{background-color:black}
::-webkit-scrollbar-track-piece{background:#FFF}
::-webkit-scrollbar-thumb{background-color:#8E8E8E;border-radius:5px}
::-webkit-scrollbar-thumb:hover{background-color:#3B3B3B}
::-webkit-scrollbar-corner{background-color:#535353}
/*::-webkit-scrollbar-resizer{background-color:#FF6E00}*/
前面不加選擇器表示,所有出現(xiàn)滾動(dòng)條的元素。
13.設(shè)置placeholder的樣式
input::-webkit-input-placeholder{ color:#999; }
input::-moz-input-placeholder{ color:#999; }
input:-ms-input-placeholder{ color:#999; }
注意 -ms- 前面是一個(gè) “ :”。
14.移動(dòng)端點(diǎn)擊某一行 :active 時(shí)添加背景色,比如 li:active{ background:#eee; } 時(shí),要給 body標(biāo)簽上寫(xiě)ontouchstart,否則沒(méi)有效果。
另一方面,給body添加,可以阻止圖片被默認(rèn)拖拽。百度的logo就可以被拖拽。
15.pageshow()和pagehide()方法。
問(wèn)題描述:A頁(yè)面跳轉(zhuǎn)到B頁(yè)面,在B頁(yè)面操作后,返回到A頁(yè)面,A頁(yè)面的ajax方法不能被再次觸發(fā)。appcan里面從B頁(yè)面返回A頁(yè)面是直接關(guān)閉了B頁(yè)面,微信里是從緩存里取。這兩者都不能再次觸發(fā)A頁(yè)面的ajax。比如,修改姓名,修改性別。從A頁(yè)面點(diǎn)擊input跳轉(zhuǎn)到B頁(yè)面進(jìn)行修改操作,修改完成之后返回A頁(yè)面,發(fā)現(xiàn)信息沒(méi)有刷新,此時(shí)需要主動(dòng)觸發(fā)。
解決方法:可以監(jiān)聽(tīng)pageshow方法,用addEventListener方法進(jìn)行監(jiān)聽(tīng)。pageshow()方法的觸發(fā)條件是,只要頁(yè)面被顯示就觸發(fā),比如appcan里的B頁(yè)面覆蓋在A頁(yè)面,把B頁(yè)面關(guān)閉,A頁(yè)面自然就展現(xiàn)出來(lái)了,那么A頁(yè)面的pageshow方法就會(huì)觸發(fā);微信里,點(diǎn)擊返回,雖然是從緩存里取頁(yè)面,但也會(huì)觸發(fā)pageshow方法。pagehide()顧名思義。
16.關(guān)于position。
華為meta7,安卓版本4.4.2,position:relative; 的元素比position:absolute; 的元素層級(jí)要高。百度新聞的導(dǎo)航效果,也是利用了這個(gè)。很奇怪。
這種結(jié)構(gòu),i.line是absolute,每個(gè)div都是relative,安卓4.4.2上 i.line 會(huì)被父級(jí)的兄弟div遮擋住。
解決辦法是,把 i.line 拿出來(lái),和div同級(jí)。
17. background:url() no-repeat center, url() no-repeat center; 可以一次性放兩個(gè)圖片,中間用逗號(hào)隔開(kāi)。
18.關(guān)于移動(dòng)端軟鍵盤(pán)彈起,蓋住頁(yè)面的問(wèn)題。
核心解決辦法是利用 document.activeElement.scrollIntoView(false); 參數(shù)false,表示activeElement的元素與頁(yè)面下邊對(duì)齊,true表示activeElement的元素與頁(yè)面上邊對(duì)齊。這個(gè)方法兼容性很好。
另一個(gè)方法與之類(lèi)似 document.activeElement.scrollIntoViewIfNeeded(); 這個(gè)方法效果不是很好,沒(méi)有上面那個(gè)好用。
19.常見(jiàn)于小說(shuō)、報(bào)紙排版的column布局。
常用的5個(gè)屬性有4個(gè)是知曉效果的:
column-width:; 每列的寬度。
column-gap:; 列與列之間的間距。
column-fill:; 不知有何軟用。
column-rule:; 列與列直接的分割線,與border屬性效果一樣。
column-count:; 總共分多少列。(這個(gè)屬性受column-width限制,當(dāng)同時(shí)寫(xiě)上column-width和column-count時(shí),以column-width優(yōu)先,比如總寬度800px,height:200px; column-width:400px; column-count:4; 顯然,800px最多只能分2列,所以優(yōu)先以column-width進(jìn)行計(jì)算。)
小兼容:ios上,橫向滾動(dòng) overflow-x:auto; 的容器不適合直接當(dāng)成分欄布局的容器,應(yīng)該在 overflow-x 的元素內(nèi)嵌套一個(gè)div當(dāng)做分欄布局的容器。否則會(huì)出現(xiàn),分欄線,column-rule不跟隨容器滾動(dòng)的奇異現(xiàn)象。另外,column-gap不適合賦值,應(yīng)當(dāng)將column-gap寫(xiě)成0,列與列之間的間距可以用分欄布局的子元素的左右padding來(lái)做。
大段文字
.box{ width:300px; height:14em; overflow-x:auto; } /*滾動(dòng)的容器*/
.col{ height:11.9em; text-align:justify; column-count:2; column-gap:0; } /*分欄的容器*/
.col p{ padding:0 .5em; line-height:1.2; } /*文字內(nèi)容的容器,加左右padding以增加列與列之間的間距。*/
四、貌似很多webapp都會(huì)寫(xiě)兩個(gè)meta標(biāo)簽
不確定是否支持16進(jìn)制的顏色值。(好像測(cè)試過(guò),16進(jìn)制顏色沒(méi)有效果。在appcan里也沒(méi)有效果。)
五、 一般不能上傳相同圖片
可以用 $('input[type="file"]').wrap('').closest('form').get(0).reset(); 重置后就可以了。
六、在安卓上touchmove出現(xiàn)了神奇的bug,百度上說(shuō),安卓上touchmove的一瞬間就會(huì)觸發(fā)touchcancel,touch事件就全部被取消了。IOS上是沒(méi)有這個(gè)問(wèn)題的。
解決方法是:在touchmove里寫(xiě)e.preventDefault();即可。但是這樣的話,手指滑動(dòng)頁(yè)面就不能scroll了。頁(yè)面將無(wú)法滾動(dòng)了。
七、flex布局
1. 2012年以后的版本
給父級(jí)添加 display:-webkit-flex; display:flex;
flex盒子內(nèi)子元素的排列方向稱(chēng)作主軸,與主軸垂直的稱(chēng)作交叉軸。
flex盒子內(nèi)的子元素可以被作項(xiàng)目。
注意:設(shè)為flex后,其子元素的float、clear、vertical-align屬性就會(huì)失效。
a.作用于父級(jí)的6個(gè)屬性:flex-direction,flex-wrap,flex-flow,justify-content,align-items,align-content。
//子元素的排列方向
flex-direction:row(默認(rèn)值,從左到右) | row-reverse(從右到左) | column(從上到下) | column-reverse(從下到上);
//子元素是否換行
flex-wrap:nowrap(默認(rèn)值,不換行) | wrap(換行) | wrap-reverse(換行,但第一行在下方);
//子元素排列方向和子元素是否換行的簡(jiǎn)寫(xiě)
flex-flow:row nowrap;(默認(rèn)值,從左到右,不換行。)
//項(xiàng)目(子元素)在主軸上的對(duì)齊方式
justify-content:flex-start(默認(rèn)值,以起點(diǎn)為始) | flex-end(以終點(diǎn)為始) | center(居中) | space-between(首尾兩個(gè)元素緊貼邊界,其余元素之間間隔相等) | space-around(每個(gè)項(xiàng)目的兩側(cè)間隔相等,相當(dāng)于給每個(gè)項(xiàng)目加了margin,并且左右margin相等。所以首尾元素與邊界都是有間距的。);
//項(xiàng)目(子元素)在交叉軸上的對(duì)齊方式
align-items:flex-start(以起點(diǎn)為始) | flex-end(以終點(diǎn)為始) | center(居中) | baseline(與項(xiàng)目的第一行文字的基線對(duì)齊) | stretch(默認(rèn)值,在交叉軸方向撐滿父級(jí));
//多根軸線的對(duì)齊方式,如果只有一根軸線,該屬性不起作用。
align-content:flex-start(與交叉軸的起點(diǎn)對(duì)齊) | flex-end(與交叉軸的終點(diǎn)對(duì)齊) | center(與交叉軸的中點(diǎn)對(duì)齊) | space-between(與交叉軸兩端對(duì)齊,軸線之間的間隔平均分布) | space-around(每根軸線兩側(cè)的間隔都相等。軸線之間的間隔比軸線與邊框的間隔大一倍,第一行和最后一行不會(huì)緊貼邊框) | stretch(默認(rèn)值,鋪滿整個(gè)交叉軸);
( align-content:stretch; 第一根軸線與邊框?qū)R,其他軸線均分父級(jí)間隙。 )
b.作用于項(xiàng)目(子元素)的6個(gè)屬性:order,flex-grow,flex-shrink,flex-basis,flex,align-self。
//子元素的排列順序
order:0(默認(rèn)值) | 1 | 2 | 3 . . .
//項(xiàng)目(子元素)的放大比例
flex-grow:0(默認(rèn)值,默認(rèn)不放大,盡管有剩余空間) | 1 | 2 | 3 . . .
//項(xiàng)目的縮小比例
flex-shrink:1(默認(rèn)值,當(dāng)空間不足時(shí),該項(xiàng)目將縮?。?| 0(不論如何,都不縮?。?
//項(xiàng)目占據(jù)的主軸空間
flex-basis:auto(默認(rèn)值,項(xiàng)目本來(lái)的大?。?| 固定值(200px,50%,100% . . .);
//flex-grow,flex-shrink,flex-basis的簡(jiǎn)寫(xiě) flex :0 1 auto;
flex:0 1 auto(默認(rèn)值,有多余空間也不放大,但空間不足會(huì)縮小,默認(rèn)占據(jù)空間就是自身大?。?
flex:auto; = flex:1 1 auto; 根據(jù)空間大小,可放大可縮小。(有兼容性問(wèn)題,chrome可以正常解析 flex:auto; -- flex:1 1 auto; 但 IE 就搞笑了,IE10解析出來(lái)的flex:auto -- flex:1 0 auto;只放大,不縮小。IE11解析出來(lái)的flex:auto;和chrome一樣,可放大可縮小。所以在用這個(gè)屬性的時(shí)候,要寫(xiě)完整值,不要簡(jiǎn)寫(xiě)。)
flex:none; -- flex:0 0 auto;不放大,也不縮小。
//單個(gè)項(xiàng)目與其他項(xiàng)目不一樣的對(duì)齊方式,會(huì)覆蓋父級(jí)的align-items;
align-self:auto(默認(rèn)值, 繼承父級(jí)的align-items的值) | flex-start | flex-end | center | baseline | stretch; 除了auto,其他的與父級(jí)align-items屬性一致。
注意要活用align-self:stretch;和align-items:stretch;
2. 2009年的版本
目前新版本被支持的很好,所以舊版的直接寫(xiě)帶前綴的。
display:-webkit-box; display:-ms-flexbox;
子元素如果有display:inline的,要把子元素寫(xiě)成display:block; 2012年的版本不需要。
a.父級(jí)的5個(gè)屬性。-webkit-box-pack,-webkit-box-align,-webkit-box-direction,-webkit-box-orient,-webkit-box-lines。
//項(xiàng)目在主軸上的對(duì)齊方式
-webkit-box-pack:start(默認(rèn)值,從起點(diǎn)開(kāi)始) | end | center | justify;
//項(xiàng)目在交叉軸上的對(duì)齊方式
-webkit-box-align:stretch(默認(rèn)值,交叉軸方向撐滿父級(jí)) | start | end | center | baseline;
//項(xiàng)目的排列順序
-webkit-box-direction:normal(默認(rèn)值,以起點(diǎn)為始) | reverse(以終點(diǎn)為始);
//主軸方向
-webkit-box-orient:horizontal(默認(rèn)值,水平方向) | vertical(垂直方向) | inline-axis(行內(nèi)方式,映射為horizontal) | block-axis(塊方式排列,映射為vertical);
//項(xiàng)目(子元素是否換行)
box-lines:single(默認(rèn)值,不允許) | multiple(允許);
經(jīng)測(cè)試,沒(méi)有瀏覽器支持,這個(gè)屬性不能用。
b.子元素的3個(gè)屬性。box-flex,box-flex-group,box-ordinal-group。
//是否縮放
-webkit-box-flex:0(默認(rèn)值,不放大也不縮?。?| 1 | 2 | 3 . . .;
//子元素排列次序
-webkit-box-ordinal-group:1 | 2 | 3 . . . 從小到大排列。
3. 對(duì) 1、2 的小結(jié)。
2012年版本比2009年的版本主要多了兩個(gè)屬性,1個(gè)是子元素是否換行,flex-wrap,2009年的box-lines不起作用。還有一個(gè)是子元素在主軸的對(duì)齊方式,2012年的justify-content:space-around; 2009年的沒(méi)有這個(gè)效果,但是可以通過(guò)加左右padding值的方式做到。
如果要兼容2009年版本的盒子布局又想換行的,只能改用float布局。
八、html結(jié)構(gòu)嵌套問(wèn)題
p標(biāo)簽內(nèi)不要嵌套塊元素,其他的像h、p、dl . . .的塊元素都會(huì)發(fā)生解析錯(cuò)誤。可以嵌套行間元素。
類(lèi)似的,還有a標(biāo)簽里不能再出現(xiàn)a標(biāo)簽,嵌套多少層都不行。
html標(biāo)簽嵌套要按照塊元素包含行間元素的規(guī)則來(lái)寫(xiě)。
九、標(biāo)簽
讓瀏覽器用最新內(nèi)核渲染。
十、form標(biāo)簽一點(diǎn)特性
在移動(dòng)端,input框獲取焦點(diǎn)時(shí),瀏覽器會(huì)彈出軟鍵盤(pán),想讓軟鍵盤(pán)的enter鍵變成搜索兩個(gè)字,需要讓這個(gè)input按照這種結(jié)構(gòu)寫(xiě):
說(shuō)明:onsubmit='return false';阻止表單默認(rèn)提交,便于自己操作。
input 的 type 必須是 search。
input 的 加了style='position:relative;',防止ios上點(diǎn)擊搜索按鈕會(huì)閃屏(白屏)。
十一、瀏覽器兼容
1.關(guān)于table表格的寬度設(shè)置問(wèn)題。
Firefox和chrome的解析方式是不一樣的,chrome會(huì)把你寫(xiě)的table寬度全部轉(zhuǎn)化成px。Firefox則不會(huì),所以在td寫(xiě)行間樣式寬度時(shí),不能百分比和px混用,要統(tǒng)一,要么每個(gè)td都寫(xiě)百分比的寬,要么都寫(xiě)px的寬;不要這幾個(gè)td寫(xiě)百分比,那幾個(gè)td寫(xiě)px。
2.某些安卓不識(shí)別height:calc(); 可以用flex布局代替。
十二、KTV字幕效果
實(shí)現(xiàn)方式1:
把文字寫(xiě)兩遍,兩個(gè)行間元素span,包裹相同的文字。
首頁(yè)
首頁(yè)
或者
首頁(yè)
首頁(yè)
實(shí)現(xiàn)原理是:讓內(nèi)部?jī)蓚€(gè)span寬度相等,其中一個(gè)設(shè)置width:0%;overflow:hidden; 然后用js動(dòng)態(tài)控制width從0% -- 100%。
實(shí)現(xiàn)方式2:(張?chǎng)涡裾f(shuō)只適用于chrome,但是我測(cè)了下,好像firefox也是可以的。)
實(shí)現(xiàn)原理:background-image是覆蓋在background-color上的,chrome有個(gè)私有屬性 -webkit-background-clip:text; 意為背景裁切,以文字為裁切起止。效果就是背景圖片只會(huì)展示文字的書(shū)寫(xiě)路徑,除了文字的其他部分空間不展示背景圖。再結(jié)合-webkit-text-fill-color:transparent; 將文字渲染的顏色寫(xiě)為透明,這樣,文字路徑就透出了背景圖。再改變背景圖片的水平位置,就能露出文字和背景圖片下的背景顏色,就做到KTV字母效果了。
核心的css屬性:
background-image:url(); /*純色的背景圖,用來(lái)渲染文字顏色,因?yàn)槲淖质峭该鞯摹?/
background-repeat:no-repeat;
-webkit-background-clip:text;
-webkit-text-fill-color:transparent;
background-position:0 0;
↑改變他就可以了。
關(guān)于實(shí)現(xiàn)方式2的圖示: