查漏补缺(十)

这篇文章展示了几个JavaScript编程中的实用技巧,包括将十六进制颜色转换为RGB,实现数组的扁平化,获取多个数组的并集,创建倒计时函数,以及数组去重的方法。同时,还提到了一些CSS相关知识,如元素的margin和padding,以及如何实现斑马线表格和九宫格布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查漏补缺(十)

颜色十六进制转换为rgb

使用match匹配出所有符合正则的内容

function transform(color){
	let reg = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/g
	let match = color.match(reg)
	return match ? 'rgb('+parseInt(match[1], 16)+','+parseInt(match[2], 16)+','+parseInt(match[3], 16)+')': color
}
扁平化数组
let list = [1,[[2],3,4],5]
list.flat(Infinity)
function myFlat(list){
	let arr = []
	list.forEach(item=>{
		if(Array.isArray(item)) arr = arr.concat(myFlat(item))
		arr.push(item)
	})
	return arr
}
function myFlat(list){
	list.reduce((prev, cur)=>{
		return prev.concat(Array.isArray(cur) ? myFlat(cur) : cur)
	},[])
}
function myFlat(list){
	while(list.some((item)=>Array.isArray(item))){
		list = [].concat(...list)
	}
	return list
}
function myFlat(list){
	return list.toString().split(',')
}
获取数组的并集
//思路是先将所有传入的参数都扁平化放到一个数组里面,然后对这个数组进行去重
function union(){
	let arr = []
	for(let i=0; i<arguments.length; i++){
		if(Array.isArray(arguments[i])) return
	}
//扁平化
	for(let i=0; i<arguments.length;i++){
		arr = arr.concat(arguments[i].flat(Infinity))
	}
//数组去重
	return arr.reduce((prev, cur)=>{
		prev.indexOf(cur) == -1 && prev.push(cur)
		return prev
	},[])
}
倒计时

window.onload = function(){
	countDown()
	let timer = null
	function countDown(){
		let nowTime = new Date()
		let endTime = new Date('2023-03-12,00:00:00')
	//得到相减的时间戳,除以1000是把毫秒变成秒
		let distance = parseInt((endTime.getTime() - nowTime.getTime()) / 1000)
		let day = addZero(distance / (24*60*60))
		let hours = addZero(distance / 60 / 60 % 60)
		let mins = addZero(distance / 60 % 60)
		let seconds = addZero(distance % 60)
		if(distance<=0){
			clearInterval(timer)
			console.log('倒计时已结束')
			return
		}
		console.log('倒计时:', `${day}${hours}小时${mins}分钟${seconds}`);
	}
	function addZero(time){
		return time<10 ? '0' + time : time
	}
	timer = setInterval(()=>{countDown()}, 1000)
}
数组去重,相同value的只保留最后一个
function unique(list){
    for(let i=0; i<list.length;i++){
        if(list.indexOf(list[i]) !== list.lastIndexOf(list[i])){
           list.splice(list.indexOf(list[i]), 1)
           i--
         }
       }
    return list
}
比较
//空数组被隐式转换为0
console.log(0 == []) //true
去掉字符串前后的空字符串
function myTrim(str){
    return str.split('').filter(item=> !(item==' '))
}
function myTrim(str){
	return str.trim()
}
function myTrim(str){
	let reg = /(^\s*)|(\s*$)/g
	return str.replace(reg, '')
}
找出字符串中不含有重复字符的 最长子串 的长度
function maxLength(str){
	let res = 0 //当前无重复子串长度
	let s = '' //无重复子串
	let len = str.length
	for(let i=0; i<len; i++){
		let char = str.charAt(i)
		let idx = s.indexOf(char)
		if(idx == -1){
			s += char
			res = res<s.length ? s.length : res
		}else{
			s = s.substr(idx+1) + char	
		}
	}
	return res
}
行内元素的margin、padding

margin、padding水平方向对行内元素都有效,垂直方向无效。padding的垂直方向虽然有效果,但是不会对周围元素有影响。

设置图片水平垂直居中

可以通过flex布局设置,但是flex布局不支持IE8、9

//table布局
<div class="box1">
	<div class="box2">
		<img src="" alt="" />
	</div>
</div>

.box1{
	width: 300px;
	height: 200px;
	border: 1px solid black;
	display: table;
}
.box2{
	display: table-cell;
	vertical-align: middle;
	text-align: center;
}
img{
	width: 100px;
}
斑马线表格

核心代码就是tbody里的tr标签的子元素的even行设置背景颜色

<table>
  <caption>斑马线表格</caption>
  <tbody>
    <tr>
      <td>zzzz</td>
      <td>xxxx</td>
      <td>cccc</td>
    </tr>
    <tr>
      <td>aaaa</td>
      <td>ssss</td>
      <td>dddd</td>
    </tr>
    <tr>
      <td>rrrr</td>
      <td>ffff</td>
      <td>cccc</td>
    </tr>
    <tr>
    <td>vvvv</td>
    <td>gggg</td>
    <td>tttt</td>
    </tr>
  </tbody>
 </table>

table{
  /*表格的外边距和大小*/
  margin: 10px 0 0 0;
  width: 100%;
  border-spacing: 0;
  border-collapse: collapse;
  /*collapse 表格单元格边框合并 
   border-spacing 表格单元格间距为零
  */
 }
 td{
  width: 32%;
  height: 50px;
  /*单元格大小*/
 }
 tbody td{
   border: 1px solid; /*表格主体的边框*/
 }
 tr:hover{
  background-color: #66D9EF !important;
  cursor: pointer; /*鼠标悬停在表格上时,表格的背景和鼠标的形状*/
 }
 table tbody tr:nth-child(even){
  background-color: gray;
  box-shadow: inset 0 5px rgba(255,255,255,0.5);
  /*even为偶数行 odd为奇数行
    设置表格的主体部分偶数行的样式
    shadow 阴影  inset将外部阴影改为内部阴影
  */
 }
九宫格
//flex版
<div class="content">
    <div class="box">1</div>
    <div class="box">2</div>
    <div class="box">3</div>
    <div class="box">4</div>
    <div class="box">5</div>
    <div class="box">6</div>
    <div class="box">7</div>
    <div class="box">8</div>
    <div class="box">9</div>
 </div>

.content{
    display: flex;
    flex-wrap: wrap;
    width: 150px;
    height: 150px;
    box-sizing: border-box;
 }
 .box{
    width: 30%;
    border: 1px solid red;
 }
//grid版
.content{
    width: 150px;
    height: 150px;
    display: grid;
    grid-template-rows: repeat(3, 50px);
    grid-template-columns: repeat(3, 50px);
 }

 .box{
    border: 1px solid red;
 }
画0.5px的直线
<div class="hr scale-half"></div>
.hr.scale-half {
    height: 1px;
    transform: scaleY(0.5);
    transform-origin: 50% 100%; //scale会导致Chrome变虚
}
.hr.gradient {
    height: 1px;
    background: linear-gradient(0deg, #fff, #000);
}

inear-gradient(0deg, #fff, #000)的意思是:渐变的角度从下往上,从白色#fff渐变到黑色#000,而且是线性的,在高清屏上,1px的逻辑像素代表的物理(设备)像素有2px,由于是线性渐变,所以第1个px只能是#fff,而剩下的那个像素只能是#000,这样就达到了画一半的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值