文通过js代码实现了按住键盘的SHIFT键,通过鼠标点击网页复现框实现区间选中的功能,还是比较实用的。 完整的代码实现例子如下:
<!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代码实现按住shift键完成复选框的区间选中</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入门容易,但是其内容太多,好多属性看了似是而非,觉得自己看懂了,到自己用的时候又很犯难了,看到漂亮的效果还是无从下手,这主要还是自己对新属性实践太少了,不能进行灵活应用,CSS总让一些人找不到感觉。其实学好CSS真的没有太多捷径,和JS编程一样,要重视对待,要多看和多练,因为现在的CSS不再是以前的CSS啦。
比如这两本书《 CSS 权威指南第四版》,1000多页,买了好几个月我到现在还没看完,文字实在太枯燥了,看完了忘,忘了继续看,实在看不下去,不知道大家有没有同样的感受呢?
好了,废话不多说,今天我们要做的一个案例就是做一个常见的例子:在不少网站右侧都有一个固定浮动的留言图标,我们点击这个图标,就会侧滑显示留言内容面板。你也许会说这个不简单吗,使用JQ就能轻松实现,但是我想说的,为了网站的性能,能用CSS实现的尽量不要用JS,因为现在CSS已足够强大。
今天这个例子,我们将使用纯CSS实现这个效果,这里我们将用到” CSS checkbox hack“的技术,效果如下图所示:
基于上面的效果图,我们要创建三个元素,一个 checkbox 元素以及对应的 label 标记,和一个表单面板元素。
这里用到了一个 CSS 特性值得大家关注下:<label> 标签的 for 属性用于指定与哪个表单元素进行关联,扩大表单元素的点击区域,我们点击 label 元素标记,其对应的表单元素将会被聚焦选中。
这个特性是我们实现这个案例的技巧之一,再结合 CSS checkbox 的伪类选择器进行留言面板的显示与隐藏,这样我们就可以摆脱 JS 来实现这个案例。
基于以上思路 ,我们开始动手吧,首先我们先放置 checkbox,和其对应的 label,最后添加表单面板和相关的表单元素。
我们将通过表单的 id 属性与表单中label元素的 for 值与其关联,最终我们完成了 HTML 结构如下段代码所示:
<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>
完成后的效果图如下:
现在我们开始添加一些基础的CSS的式,这里我们用到了CSS自定义变量,方便我们全局修改,还有一些 reset 规则,和表单的基础规则样式,示例代码如下:
: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 这个元素在案例中无需显示,我们只是用其的伪类特性结合 label 控制留言面板的显示与隐藏,因此我们需要将其移出可视区域,记住这里不能用隐藏属性(display:none)。示例代码如下:
[type="checkbox"] {
position: absolute;
left: -9999px;
}
2、接下来,我们需要添加这些CSS操作:
对应的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、这里需要强调的是 feedback-label 样式,在其垂直变换时,我们先逆时针进行了旋转,其 x ,y 轴的方向也是随着旋转的,所以是translate(50%, -100%),将其垂直居中。
2、在 form 样式里,我们使用 transform 方法,translate(100%, -50%) 将其移出页面显示区域
3、我们继续,大家不要着急,马上就快完成了,我们需要将页面弄的漂亮些,添加一些样式,示例代码如下:
/*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() 线性渐变,实现了一个漂亮的颜色渐变背景。还有一个 CSS3 语法需要关注下:hue-rotate,色调旋转滤镜,方便我们改变当前的颜色。
我们通过点击 checkbox 对应的 label 标签进行切换和显示留言面板,这里我们用到了 :checked 伪类,以及 ~(后续同胞选择器)和 +(紧邻同胞选择器),辅助元素的选择进行样式变换,示例代码如下:
[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;
}
这里有几个样式规则我们需要聊一下:
最后,特别重点提示下我们做页面要考虑页面响应式适配的问题,这里我们需要针对手机设备做一些样式的调整,比如更改表单面板的宽度由原来的 500px 调整到 320px,以及初始字体的大小,调整成16px。
最终添加的响应式代码如下:
/*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));
}
}
好了,到这里,我们的案例就全部完成了,你可以欣赏下自己完成的杰作啦,实现起来是不是很简单呢,最后我还是建议大家还是亲自动手实践一遍,这样才能加深对本案例用到的CSS属性的理解。
最终完成的效果,大家可以点击以下网址进行在线体验:
https://www.qianduandaren.com/demo/feedback/
今天的内容就和大家分享到这里,感谢你的阅读,如果你喜欢我的分享,麻烦给个关注、点赞加转发哦,你的支持,就是我分享的动力,后续会持续分享 CSS 常用案例和技巧,欢迎持续关注。
基础章节:这30个CSS选择器,你必须熟记(上)
基础章节:这30个CSS选择器,你必须熟记(中)
基础章节:这30个CSS选择器,你必须熟记(下)
使用 CSS Checkbox Hack 技术制作一个手风琴组件
计思路:利用复选框的是否选中来控制侧边栏的显示与隐藏
主要知识点:label标签 、
.class:checked伪类 、
"+" 选择器
实现步骤:
html:
<div class="wrap"> <header class="header"> <span><img src="./bars.svg" alt="导航栏"></span> <span>小白开始学前端</span> </header> <aside class="navbar"> <p>侧边栏</p> </aside> <article class="main"> <<p>主要内容</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; }
效果图:
设置侧边栏 display:none或者是visibility:hidden;
.wrap .navbar{ display: none; //将侧边栏隐藏 width: 100vw; width: 100%; height: calc(100% - 60px); position: absolute; z-index: 999; //将侧边栏的层级设置为最顶层 background-color: rgba(213, 204, 204, 0.92);}
或者是
.wrap .navbar{ visibility: hidden; position: absolute; z-index: -999; //将侧边栏的层级设置为最底层 width: 100vw; width: 100%; height: calc(100% - 60px); background-color: rgba(213, 204, 204, 0.92); }
效果图:
到这里我们已经完成了网页的整体布局
为了实现复选框操纵侧边栏的显示,我们要对第一步骤中的html代码进行小小的修改
在网页中添加复选框按钮
将span标签替换成label标签,添加input标签
效果图
接下来我们对复选框进行设置,隐藏复选框
#controller{ position: absolute; z-index: -999; opacity: 0;/*visibility: hidden; */ }
效果图:
下一步就是实现单击复选框操控侧边栏的显示与隐藏
我们在css中添加以下代码
#controller:checked + .navbar{ display: block; }
这样就可以实现侧边栏的显示与隐藏
接下来,为侧边栏添加过渡效果
侧边栏过渡效果
到这里,利用复选框操控侧边栏就已经制作完成了。
第一次写,可能有写得不好地方。
*请认真填写需求信息,我们会在24小时内与您取得联系。