Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
文通過js代碼實現(xiàn)了按住鍵盤的SHIFT鍵,通過鼠標點擊網(wǎng)頁復(fù)現(xiàn)框?qū)崿F(xiàn)區(qū)間選中的功能,還是比較實用的。 完整的代碼實現(xiàn)例子如下:
<!DOCTYPE html>
<html>
<head>
<title>測試頁面</title>
<meta name="content-type" content="text/html; charset=gb2312">
<script type="text/javascript" src="jquery.js" ></script>
<script type="text/javascript">
//選擇全部
function checkAllItem(obj){
var box = document.getElementsByName("box");
for(var index=0;index<box.length;index++){
if(obj.checked){
box[index].checked = true;
}else{
box[index].checked = false;
}
}
}
//全局變量
var shiftKeyDown = false;
function keyDownHandler(event){
shiftKeyDown = true;
}
function keyUpHandler(event){
shiftKeyDown = false;
}
function selectRow(obj){
if(shiftKeyDown){
var checks = $(":checkbox[name='box']");
var currentIndex = checks.index($(obj)[0]);
var lastIndex = -1;
var box = document.getElementsByName("box");
for(var index=0;index<box.length;index++){
if(box[index].checked){
if(index!=currentIndex){
lastIndex = index;
if(index < currentIndex)
break;
}
}
}
if(lastIndex ==-1){
return ;
}
if(lastIndex < currentIndex){
for(var i=lastIndex;i<=currentIndex;i++){
if(obj.checked){
box[i].checked = true;
}else{
box[i].checked = false;
}
}
}else{
for(var i=currentIndex;i<=lastIndex;i++){
if(obj.checked){
box[i].checked = true;
}else{
box[i].checked = false;
}
}
}
}
}
</script>
</head>
<body onkeydown="keyDownHandler(event)" onkeyup="keyUpHandler(event);">
<h3>javascript代碼實現(xiàn)按住shift鍵完成復(fù)選框的區(qū)間選中</h3>
<table style="width: 60%;" border="1">
<tr>
<td style="width: 10%" ><input type="checkbox" name="allBox" onclick="checkAllItem(this);"/>全選 </td>
<td>列1</td><td>列2</td></tr><tr>
<td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr><tr>
<td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
<tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>
<td>Cell</td><td>Cell</td></tr>
</table>
</body>
</html>
家好,不知道你們是否和我一樣存在這樣的困惑呢,雖然css入門容易,但是其內(nèi)容太多,好多屬性看了似是而非,覺得自己看懂了,到自己用的時候又很犯難了,看到漂亮的效果還是無從下手,這主要還是自己對新屬性實踐太少了,不能進行靈活應(yīng)用,CSS總讓一些人找不到感覺。其實學(xué)好CSS真的沒有太多捷徑,和JS編程一樣,要重視對待,要多看和多練,因為現(xiàn)在的CSS不再是以前的CSS啦。
比如這兩本書《 CSS 權(quán)威指南第四版》,1000多頁,買了好幾個月我到現(xiàn)在還沒看完,文字實在太枯燥了,看完了忘,忘了繼續(xù)看,實在看不下去,不知道大家有沒有同樣的感受呢?
好了,廢話不多說,今天我們要做的一個案例就是做一個常見的例子:在不少網(wǎng)站右側(cè)都有一個固定浮動的留言圖標,我們點擊這個圖標,就會側(cè)滑顯示留言內(nèi)容面板。你也許會說這個不簡單嗎,使用JQ就能輕松實現(xiàn),但是我想說的,為了網(wǎng)站的性能,能用CSS實現(xiàn)的盡量不要用JS,因為現(xiàn)在CSS已足夠強大。
今天這個例子,我們將使用純CSS實現(xiàn)這個效果,這里我們將用到” CSS checkbox hack“的技術(shù),效果如下圖所示:
基于上面的效果圖,我們要創(chuàng)建三個元素,一個 checkbox 元素以及對應(yīng)的 label 標記,和一個表單面板元素。
這里用到了一個 CSS 特性值得大家關(guān)注下:<label> 標簽的 for 屬性用于指定與哪個表單元素進行關(guān)聯(lián),擴大表單元素的點擊區(qū)域,我們點擊 label 元素標記,其對應(yīng)的表單元素將會被聚焦選中。
這個特性是我們實現(xiàn)這個案例的技巧之一,再結(jié)合 CSS checkbox 的偽類選擇器進行留言面板的顯示與隱藏,這樣我們就可以擺脫 JS 來實現(xiàn)這個案例。
基于以上思路 ,我們開始動手吧,首先我們先放置 checkbox,和其對應(yīng)的 label,最后添加表單面板和相關(guān)的表單元素。
我們將通過表單的 id 屬性與表單中l(wèi)abel元素的 for 值與其關(guān)聯(lián),最終我們完成了 HTML 結(jié)構(gòu)如下段代碼所示:
<input type="checkbox" id="mycheckbox">
<label for="mycheckbox" class="feedback-label">FEEDBACK</label>
<form class="form">
<div>
<label for="fullname">Full Name</label>
<input type="text" id="fullname">
</div>
<div>
<label for="email">Email</label>
<input type="email" id="email">
</div>
<div>
<label for="comment">Comment</label>
<textarea id="comment"></textarea>
</div>
<div>
<button type="submit">Send</button>
</div>
</form>
完成后的效果圖如下:
現(xiàn)在我們開始添加一些基礎(chǔ)的CSS的式,這里我們用到了CSS自定義變量,方便我們?nèi)中薷模€有一些 reset 規(guī)則,和表單的基礎(chǔ)規(guī)則樣式,示例代碼如下:
:root {
--white: white;
--gradient: linear-gradient(-45deg, #FFA600 0%, #FF5E03 50%);
--form: #eeefef;
--border-radius: 4px;
--form-width: 500px;
--form-mob-width: 320px;
}
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
body {
font: 20px/1.5 sans-serif;
background: var(--white);
}
h1 {
font-size: 2rem;
text-align: center;
margin-top: 20vh;
}
button,
label {
cursor: pointer;
}
label {
display: block;
}
button,
input,
textarea {
font-family: inherit;
font-size: 100%;
border: none;
}
textarea {
resize: none;
}
1、由于 checkbox 這個元素在案例中無需顯示,我們只是用其的偽類特性結(jié)合 label 控制留言面板的顯示與隱藏,因此我們需要將其移出可視區(qū)域,記住這里不能用隱藏屬性(display:none)。示例代碼如下:
[type="checkbox"] {
position: absolute;
left: -9999px;
}
2、接下來,我們需要添加這些CSS操作:
對應(yīng)的CSS代碼如下:
/*CUSTOM VARIABLES HERE*/
.feedback-label,
.form {
position: fixed;
top: 50%;
right: 0;
}
.feedback-label {
transform-origin: top right;
transform: rotate(-90deg) translate(50%, -100%);
z-index: 2;
}
.form {
width: var(--form-width);
max-height: 90vh;
transform: translate(100%, -50%);
padding: 30px;
overflow: auto;
background: var(--form);
z-index: 1;
}
小提示:
1、這里需要強調(diào)的是 feedback-label 樣式,在其垂直變換時,我們先逆時針進行了旋轉(zhuǎn),其 x ,y 軸的方向也是隨著旋轉(zhuǎn)的,所以是translate(50%, -100%),將其垂直居中。
2、在 form 樣式里,我們使用 transform 方法,translate(100%, -50%) 將其移出頁面顯示區(qū)域
3、我們繼續(xù),大家不要著急,馬上就快完成了,我們需要將頁面弄的漂亮些,添加一些樣式,示例代碼如下:
/*CUSTOM VARIABLES HERE*/
.feedback-label,
.form input,
.form textarea,
.form button {
border-radius: var(--border-radius);
}
.feedback-label,
.form button {
background: var(--gradient);
color: var(--white);
}
.feedback-label:hover,
.form button:hover {
filter: hue-rotate(-45deg);
}
.feedback-label {
padding: 5px 10px;
border-radius: var(--border-radius) var(--border-radius) 0 0;
}
form div:not(:last-child) {
margin-bottom: 20px;
}
form div:last-child {
text-align: right;
}
.form input,
.form textarea {
padding: 0 5px;
width: 100%;
}
.form button {
padding: 10px 20px;
width: 50%;
max-width: 120px;
}
.form input {
height: 40px;
}
.form textarea {
height: 220px;
}
小提示:這里我們的背景色用到了 linear-gradient() 線性漸變,實現(xiàn)了一個漂亮的顏色漸變背景。還有一個 CSS3 語法需要關(guān)注下:hue-rotate,色調(diào)旋轉(zhuǎn)濾鏡,方便我們改變當前的顏色。
我們通過點擊 checkbox 對應(yīng)的 label 標簽進行切換和顯示留言面板,這里我們用到了 :checked 偽類,以及 ~(后續(xù)同胞選擇器)和 +(緊鄰?fù)x擇器),輔助元素的選擇進行樣式變換,示例代碼如下:
[type="checkbox"]:checked + .feedback-label {
transform: rotate(-90deg) translate(50%, calc((var(--form-width) + 100%) * -1));
}
[type="checkbox"]:focus + .feedback-label {
outline: 2px solid rgb(77, 144, 254);
}
[type="checkbox"]:checked ~ .form {
transform: translate(0, -50%);
}
.feedback-label,
.form {
transition: all 0.35s ease-in-out;
}
這里有幾個樣式規(guī)則我們需要聊一下:
最后,特別重點提示下我們做頁面要考慮頁面響應(yīng)式適配的問題,這里我們需要針對手機設(shè)備做一些樣式的調(diào)整,比如更改表單面板的寬度由原來的 500px 調(diào)整到 320px,以及初始字體的大小,調(diào)整成16px。
最終添加的響應(yīng)式代碼如下:
/*CUSTOM VARIABLES HERE*/
@media screen and (max-width: 600px) {
body {
font-size: 16px;
}
.form {
padding: 15px;
width: var(--form-mob-width);
}
form div:not(:last-child) {
margin-bottom: 10px;
}
[type="checkbox"]:checked + .feedback-label {
transform: rotate(-90deg) translate(50%, calc((var(--form-mob-width) + 100%) * -1));
}
}
好了,到這里,我們的案例就全部完成了,你可以欣賞下自己完成的杰作啦,實現(xiàn)起來是不是很簡單呢,最后我還是建議大家還是親自動手實踐一遍,這樣才能加深對本案例用到的CSS屬性的理解。
最終完成的效果,大家可以點擊以下網(wǎng)址進行在線體驗:
https://www.qianduandaren.com/demo/feedback/
今天的內(nèi)容就和大家分享到這里,感謝你的閱讀,如果你喜歡我的分享,麻煩給個關(guān)注、點贊加轉(zhuǎn)發(fā)哦,你的支持,就是我分享的動力,后續(xù)會持續(xù)分享 CSS 常用案例和技巧,歡迎持續(xù)關(guān)注。
基礎(chǔ)章節(jié):這30個CSS選擇器,你必須熟記(上)
基礎(chǔ)章節(jié):這30個CSS選擇器,你必須熟記(中)
基礎(chǔ)章節(jié):這30個CSS選擇器,你必須熟記(下)
使用 CSS Checkbox Hack 技術(shù)制作一個手風琴組件
計思路:利用復(fù)選框的是否選中來控制側(cè)邊欄的顯示與隱藏
主要知識點:label標簽 、
.class:checked偽類 、
"+" 選擇器
實現(xiàn)步驟:
html:
<div class="wrap"> <header class="header"> <span><img src="./bars.svg" alt="導(dǎo)航欄"></span> <span>小白開始學(xué)前端</span> </header> <aside class="navbar"> <p>側(cè)邊欄</p> </aside> <article class="main"> <<p>主要內(nèi)容</p> </article> <footer class="footer"> 底部 </footer> </div>
css:
*{ margin: 0;padding: 0;box-sizing: border-box; } .wrap{ width: 100vw;width: 100%;height: 100vh;position: relative;padding: 60px 0; } .wrap .header{ width: 100vw;width: 100%;height: 60px;position: fixed;top: 0;background-color: #000; padding:0 10px;color: #fff; /* 布局 */ display: flex;flex-flow: row nowrap; justify-content: space-between;align-items: center; } .wrap .header *{ display: inline-block;height: 40px;line-height: 40px; } .header img{ max-height: 100%;display: block;cursor: pointer; } .wrap .navbar{ width: 100vw;width: 100%;height: calc(100% - 60px);position: absolute;z-index: 999;background-color: rgba(213, 204, 204, 0.92); } .wrap .navbar::after{ position: absolute;content: "";display: inline-block; z-index:-1;width: 90vw;height: 100%;background-color: #fff;top:0; } .wrap .footer{ width: 100vw;width: 100%;height: 60px;position: fixed;bottom: 0;background-color: #000; }
效果圖:
設(shè)置側(cè)邊欄 display:none或者是visibility:hidden;
.wrap .navbar{ display: none; //將側(cè)邊欄隱藏 width: 100vw; width: 100%; height: calc(100% - 60px); position: absolute; z-index: 999; //將側(cè)邊欄的層級設(shè)置為最頂層 background-color: rgba(213, 204, 204, 0.92);}
或者是
.wrap .navbar{ visibility: hidden; position: absolute; z-index: -999; //將側(cè)邊欄的層級設(shè)置為最底層 width: 100vw; width: 100%; height: calc(100% - 60px); background-color: rgba(213, 204, 204, 0.92); }
效果圖:
到這里我們已經(jīng)完成了網(wǎng)頁的整體布局
為了實現(xiàn)復(fù)選框操縱側(cè)邊欄的顯示,我們要對第一步驟中的html代碼進行小小的修改
在網(wǎng)頁中添加復(fù)選框按鈕
將span標簽替換成label標簽,添加input標簽
效果圖
接下來我們對復(fù)選框進行設(shè)置,隱藏復(fù)選框
#controller{ position: absolute; z-index: -999; opacity: 0;/*visibility: hidden; */ }
效果圖:
下一步就是實現(xiàn)單擊復(fù)選框操控側(cè)邊欄的顯示與隱藏
我們在css中添加以下代碼
#controller:checked + .navbar{ display: block; }
這樣就可以實現(xiàn)側(cè)邊欄的顯示與隱藏
接下來,為側(cè)邊欄添加過渡效果
側(cè)邊欄過渡效果
到這里,利用復(fù)選框操控側(cè)邊欄就已經(jīng)制作完成了。
第一次寫,可能有寫得不好地方。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。