Skip to content

Latest commit

 

History

History
582 lines (455 loc) · 16.8 KB

前端零散笔记.md

File metadata and controls

582 lines (455 loc) · 16.8 KB

前端零散笔记

年度色

2023
#AB2542		#6768A7		#939597		#F3DD69		#214E7E		#EF7A68		#5A4F87		#8FB058

JSP笔记

网页logo

<link rel="icon" type="image/x-icon" href="./favicon.ico" /> 引入css文件

<link rel="stylesheet" type="text/css" href="./css/shop.css"> 表单

<form action="login2.jsp" method=post>
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="passwd" placeholder="密码">
    <button type="submit">登录</button>
</form>

发光:

box-shadow: 0 0 5px #03e9f4,
0 0 25px #03e9f4,
0 0 50px #03e9f4,
0 0 100px #03e9f4;

内凹阴影 box-shadow: inset 0.2rem 0.2rem 0.5rem #c8d0e7, inset -0.2rem -0.2rem 0.5rem #FFFFFF; 外凸阴影box-shadow: 0.3rem 0.3rem 0.6rem #c8d0e7, -0.2rem -0.2rem 0.5rem #FFFFFF; logo悬浮效果:margin:0.5px;opacity:0.5; 3D盒子翻转父亲: transition: all 0.3s;transform-style: preserve-3d;底部: transform: translateY(17.5px) rotateX(-90deg); 表单输入框效果:.login-box .user-box input:focus ~ label,.login-box .user-box input:valid ~ label { top: -20px; left: 0;color: #03e9f4; font-size: 12px;}

外凸 box-shadow: 0 10px 10px -10px rgba(0, 0, 0, 0.5);

内凹阴影:box-shadow: inset 2px 2px 4px #d1d9e6, inset -2px -2px 4px #f9f9f9; 内凹聚焦(更凹):box-shadow: inset 4px 4px 4px #d1d9e6, inset -4px -4px 4px #f9f9f9; 圆形外凸box-shadow: 0.3rem 0.3rem 0.6rem #c8d0e7, -0.2rem -0.2rem 0.5rem #FFFFFF; 页面重定向 response.sendRedirect("error.jsp"); 重写地址 <% String str =response.encodeRedirectURL("shop.jsp"); %> 防盗链 if (!mess.startsWith("http://127.0.0.1:8080/ch4_practice2")){response.sendRedirect("error.jsp");} request接受值的编码格式 request.setCharacterEncoding("utf-8"); 未登录不能访问 <% if(session.getAttribute("flag")==null){response.sendRedirect("error.jsp");}%>

颜色:root { --primary-light: #8abdff; --primary: #6d5dfc; --primary-dark: #5b0eeb; --white: #FFFFFF; --greyLight-1: #E4EBF5; --greyLight-2: #c8d0e7; --greyLight-3: #bec8e4; --greyDark: #9baacf; }

CSS

输入框去掉边框

input{
    outline: none;
    border: none;
}

禁止文字元素被选中

user-select:none;   

去掉ul样式

list-style-type: none;

文字超出div用省略号表示

.d-elip {
    text-overflow: ellipsis;
    overflow: hidden;
    white-space: nowrap
}

鼠标悬浮前后阴影

box-shadow: 0 0 1px rgba(0, 0, 0, 0);

box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);

div太长或太宽添加滚动条

overflow: auto;

隐藏滚动条
::-webkit-scrollbar{width:0;}

滚轮触底

// 添加监听滚轮触发事件,当滚轮滚动时触发
window.addEventListener('scroll', bindHandleScroll);

bindHandleScroll() {
  // document.documentElement指向同一个容器元素,此处为body
  const scrollTop = document.documentElement.scrollTop; //滚动条顶端距离所在滚动框顶的距离
  const clientHeight= document.documentElement.clientHeight; //当前滚轮所在的可视窗口高度
  const scrollHeight= document.documentElement.scrollHeight; //滚动条所在滚动框的高度
  // 触底条件
  console.log(scrollTop + clientHeight >= scrollHeight); // 触底为true
}

window.onunload() {
  // 清除事件监听
  removeEventListener('scroll', bindHandleScroll);
}

flex 布局父项常见属性

flex-direction

1.flex-direction:column;将主轴改为y轴,纵轴 2.flex-direction:row; 将主轴改为x轴,横轴 3.flex-direction:row- reverse;主轴为x轴,并且翻转 4.flex-direction:column- reverse;主轴为y轴,并且翻转

Justify-content设置主轴子元素排列

值为flex-start 所有子元素在主轴头部显示 值为flex-end 所有子元素在主轴尾部显示 值为flex-center 所有子元素在主轴居中对齐 值为space-around 所有子元素平分剩余空间 值为space-between 所有子元素先两边贴边在平分剩余空间

flex-wrap子元素是否换行

开启flex布局后默认为不换行 如果想要换行效果设置flex-wrapwrap

align-items设置侧轴子元素排列

利用align-items能够设置侧轴元素对齐的方式在子项为单项(单行) 的时候使用 align-items的值为flex-start 表示从头开始 align-items的值为flex-end 表示从结尾开始 align-items的值为center 表示居中显示 align-items的值为stretch 会将子元素拉伸

align-content设置侧轴子元素排列

Align-content适应于换行(多行)的情况下(单行情况下无效), 可以设置 上对齐、 下对齐、居中、拉伸以及平均分配剩余空间等属 性值 Align-item和align-content的区别单行找 align-items 多行找 align-content

flex-flow以及总结

flex-flow就是flex-direction和flex-wrap的合写 如:flex-flow:row wrap;

flex 布局子项常见属性

一,子项flex属性使用 Flex用来设置分配剩余空间的比列的 剩余空间是指父盒子的宽度减去没有设置flex的盒子的宽度 在将剩余空间按占比分配给各个子盒子 比列计算:当前子盒子的flex数值/所有flex的总和 二,align-self和order align-self单独的设置某一个盒子的排列方式 order order:-1;

Grid

原文链接    https://blog.csdn.net/weixin_43183219/article/details/122278840

display:grid;

grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;

grid-template-columns: repeat(3,100px);
grid-template-rows: repeat(3,100px);

grid-template-columns:auto 100px  auto;

grid-template-rows: repeat(3,minmax(150px,300px));

(5)min-content;max-content
min-content:以网格项的最大的最小内容来占据网格轨道
max-content:以网格项的最大的内容来占据网格轨道

fr关键字:这个单位用来表示分配剩余的空间,例如:grid-template-columns: 100px 4fr 1fr,表示第一列宽100px,剩余的空间分为5份,第二列宽是第三列的四倍。
grid-template-columns: 100px 4fr 1fr;

auto-fit的最后一步是,折叠空轨道,将空轨道的空间全部平均分配给已有元素的轨道
auto-fill的最后一步时保留空轨道留白,不会折叠空轨道
注意:auto-fit 和 auto-fill 只有在容器宽度大于子元素的最小宽度总和时才有显示区别
grid-template-columns: repeat(auto-fill,minmax(90px, 1fr));
grid-template-rows: repeat(auto,100px);

grid-row-gap,grid-column-gap ;grid-gap
grid-row-gap:设置行间距
grid-column-gap:设置列间距
grid-gap:是grid-row-gap和grid-column-gap的简写形式,
书写格式:grid-gap: < grid-row-gap> < grid-column-gap>;

grid-template-columns: repeat(3,150px);
grid-template-rows: repeat(3,150px);
grid-gap: 20px 20px;

start:将网格对齐到网格容器的起始边缘:
justify-content:start;
align-content:start;

justify-content:end;
align-content:end;

justify-content:center;
align-content:center;

space-evenly:项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔
justify-content:space-evenly;
align-content:space-evenly;
space-between :项目与项目的间隔相等,项目与容器边框之间没有间隔:
space-around:每个项目两侧的间隔相等,项目之间的间隔比项目与容器边框的间隔大一倍:

grid-column-start 属性:单元格左边框所在的垂直网格线
grid-column-end 属性:单元格右边框所在的垂直网格线
grid-row-start 属性:单元格上边框所在的水平网格线
grid-row-end 属性:单元格下边框所在的水平网格线
比如:现在我们希望上图包含“a”的div占满第一行三个格子,高度不变,我们就需要设置div1的左边框在第一根网格线,右边框在第四根网格线:
.div1{
    background-color: hotpink;
    grid-column-start:1;
    grid-column-end:4;
}

现在,我们想让a占到bcef的位置,我们可以设置左边框在第1根网格线,右边框在第3根网格线,上边框在第2根网格线,下边框在第4根网格线:
.div1{
    background-color: hotpink;
    grid-column-start:1;
    grid-column-end:3;
    grid-row-start: 2;
    grid-row-end: 4;
}
这四个属性的值除了直接指定网格线之外,还可以使用“span”直接跨越单元格,比如,我们希望a可以跨越第一行和第二行的前两个方格,那么我们就可以直接使用“span”:
.div1{
    background-color: hotpink;
    grid-column-start:span 2;
    grid-row-start:span 2;
}

grid-column 属性:是grid-column-start和grid-column-end的缩写
grid-column: < start-line> / < end-line>;
grid-row 属性:grid-row-start属性和grid-row-end的缩写
grid-column:grid-row: < start-line> / < end-line>;
比如说现在a想跨越第一行和第二行的前三个格子:
.div1{
    background-color: hotpink;
    grid-column:1/4;
    grid-row:1/4;
}

grid-area:指定内容放在哪个区域,可使用grid-row-start、grid-column-start、grid-row-end、 grid-column-end的合并简写形式,直接指定项目的位置,
书写格式: grid-area: < row-start> / < column-start> / < row-end> /
< column-end>;
比如说,现在我们想将a放在,正中间的格子里,我们可以在div1里面设置grid-area:
.div1{
    background-color: hotpink;
    grid-area: 2/2/3/3;
}

place-self:属性是align-self属性和justify-self属性的合并简写形式
书写格式:place-self:center center;

grid-auto-flow:划分网格之后元素会自动放入格子里,默认值是“row”,即是“先行后列”,这个属性可以设置元素放入格子的顺序是"先行后列"还是"先列后行"。column表示"先列后行"

复制内容到剪贴板

内容在可编辑区域,如input,textarea

<input id="demoInput" value="hello world">
<button id="btn">点我复制</button>
const btn = document.querySelector('#btn');
btn.addEventListener('click', () => {
    const input = document.querySelector('#demoInput');
    input.select();
    if (document.execCommand('copy')) {
        document.execCommand('copy');
        console.log('复制成功');
    }
})

不在可编辑区域,如div

<button id="btn">点我复制</button>

const btn = document.querySelector('#btn');
btn.addEventListener('click',() => {
    const input = document.createElement('input');
    document.body.appendChild(input);
    input.setAttribute('value', '听说你想复制我');
    input.select();
    if (document.execCommand('copy')) {
        document.execCommand('copy');
        console.log('复制成功');
    }
 document.body.removeChild(input);
})

点击下载图片

var download = function (href, name) {
    let eleLink = document.createElement('a')
    eleLink.download = name
    eleLink.href = href
    eleLink.click()
    eleLink.remove()
}

var downloadByBlob = function (url) {
    var name=url.split('/').slice(-1)
    var type=url.split('.').slice(-1)
    if (type == 'zip') {
        window.open(url)
    } else {
        let image = new Image()
        image.setAttribute('crossOrigin', 'anonymous')
        image.src = url
        image.onload = () => {
            let canvas = document.createElement('canvas')
            canvas.width = image.width
            canvas.height = image.height
            let ctx = canvas.getContext('2d')
            ctx.drawImage(image, 0, 0, image.width, image.height)
            canvas.toBlob((blob) => {
                let url = URL.createObjectURL(blob)
                download(url, name)
                // 用完释放URL对象
                URL.revokeObjectURL(url)
            })
        }
    }
}

//  调用函数
var url;
if(this.$store.state.isBgImage) {
    url=this.$store.state.bgImageUrl
}else{
    url=this.$store.state.bgVideoUrl
}
downloadByBlob(url)

一个搜索框

 .a{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
            background-color: #2f3640;
            height: 40px;
            border-radius: 40px;
            padding: 10px;
        }
        .a:hover .b{
            width: 200px;
            padding: 0 6px;
        }
        .a:hover .c{
            background-color: wheat;
        }
        .b{
            border: none;
            background: none;
            /* 取消选中搜索框时的外边框 */
            outline: none;
            width: 0;
            padding: 0;
            transition: .4s;
            line-height: 40px;
            font-size: 20px;
            color: wheat;
        }
        .c{
            color: #e94118;
            float: right;
            width: 40px;
            height: 40px;
            border-radius: 50%;
            background-color: #2f3640;
            display: flex;
            justify-content: center;
            align-items: center;
            transition: .4s;
        }

JQuery笔记

绑定函数

  $(document).on('keydown', function (e) {
          console.log(e.keyCode); }//r 82   g 71   b 66   p 80   y 89

多选框

//需求2:
      $('#j_tb input').click(function () {
          //判断下面的那四个多选框是否都被选中了。
          var numOfAll = $('#j_tb input').length; //获取到下面所有多选框的个数。
          var numOfSelect = $('#j_tb input:checked').length; //获取到下面被选中的多选框的个数。
          console.log(numOfAll + ":" + numOfSelect);
          //判断
          // if(numOfAll == numOfSelect){
          //     //全部被选中。
          //     $('#j_cbAll').prop('checked',true);
          // }else {
          //     //有的有没选中。
          //     $('#j_cbAll').prop('checked',false);
          // }

索引对应元素

​ //上面这个判断其实可以优化。 ​ $('#j_cbAll').prop('checked',numOfAll == numOfSelect); ​ });

      $('#right>li').mouseenter(function () {
          //获取当前鼠标移入的这个li标签的索引.
          var idx = $(this).index();
          idx += 9;//9不要写死,9是左边li标签的个数.
          //让中间索引对应的li显示,其他的li隐藏.
          $('#center>li').eq(idx).show().siblings('li').hide();
      });

是否选中单选框

//3.选中的到右边. $('#btn-sel').click(function () { //找到左边select下拉菜单中,被选中的option项, 把这些option项添加到右边的select下拉菜单中. $('#src-city>option:selected').appendTo($('#tar-city')); });

鼠标悬浮div时,动态贴近效果

var $div=window.$('.admire')
var w=$div.width()/2
var h=$div.height()/2

// 倾斜倍数定义
var multiple=10

$div.on("mousemove", (e) => {
    var x_=(e.offsetX-w)/w*multiple
    var y_=(e.offsetY-h)/h*multiple
    $div.css({'transform':'translate(-50%,-50%) rotateX('+x_+'deg) rotateY('+y_+'deg)'})
});

自动消失弹窗-自制-alert.js

    function ShowTip(msg, type,bgColor,borderColor,fontColor) {
        var $tip = $('.tips');
        var top=$tip.length*45+10
            var $tip = $('<div class="tips" style="position: fixed;right:-200px;padding: 10px 20px;box-shadow: 0 10px 10px -10px rgba(0, 0, 0, 0.5);'+
                        'border-radius:8px;z-index:99;border:1px solid;display: flex;justify-content: center;align-items: center;"></div>');
            $('body').append($tip);
            $tip.stop(false).text(msg).css({ 
                                        'color':fontColor,
                                        'background-color':bgColor,
                                        'border-color':borderColor,
                                        'top':top
                                        }).animate({
                                            right:10
                                        },500).delay(3000).animate({
                                            top:-100
                                        },1000,function(){
                                            this.remove()
                                        });
                                    }



    function PrimaryAlert(msg) {
        ShowTip(msg, 'primary','#cfe2ff','#9ec5fe','#0a58ca');
    }
    function SuccessAlert(msg) {
        ShowTip(msg, 'success','#d1e7dd','#a3cfbb','#146c43');
    }
    function DangerAlert(msg) {
        ShowTip(msg, 'danger','#f8d7da','#f1aeb5','#b02a37');
    }
    function WarningAlert(msg) {
        ShowTip(msg, 'warning','#fff3cd','#ffe69c','#997404');
    }
    function InfoAlert(msg) {
        ShowTip(msg, 'info','#cff4fc','#9eeaf9','#087990');
    }
    function LightAlert(msg) {
        ShowTip(msg, 'light','#fcfcfd','#e9ecef','#6c757d');
    }
    function DarkAlert(msg) {
        ShowTip(msg, 'dark','#ced4da','#adb5bd','#495057');
    }
    export default{
        PrimaryAlert,
        SuccessAlert,
        DangerAlert,
        WarningAlert,
        InfoAlert,
        LightAlert,
        DarkAlert
    }