- 右击首页,打开快捷入口的时候,也会触发放大和毛玻璃效果;
部分代码如下:
另外,这里还有一个骨架屏的效果,就是当背景图还没有被加载的时候,整个背景图处于灰色,并且有一个从左往右的动效,代表正在加载中,骨架屏效果代码如下:
.threeS-loading {
background-color: #f2f2f2;
background: linear-gradient(
100deg,
rgba(255, 255, 255, 0) 40%,
rgba(255, 255, 255, 0.5) 50%,
rgba(255, 255, 255, 0) 60%
)
#f6f6f6;
background-size: 200% 100%;
background-position-x: 120%;
animation: 1s loading ease-in-out infinite;
}
@keyframes loading {
to {
background-position-x: -20%;
}
}
这个组件的难点在于实现电子数字的格式,这个是最复杂的,而时间的获取就是基于浏览器Date对象,这个很简单,获取时间的方法部分如下:
/**
-
获得时间
-
@returns {String} 当前时间
*/
function getTime(): string {
const date = new Date();
const hour = date.getHours();
const minute = date.getMinutes();
return (
(hour >= 10 ? hour : “0” + hour) +
“:” +
(minute >= 10 ? minute : “0” + minute)
);
}
当获取到时间以后,需要将转成电子格式的,这部分的原理就是先拼出一个电子格式的8,然后,不同的数字只是去掉8中的某一个笔划,这样就达到了0-9的数字,这里我挑一部分CSS代码
.digits div span {
opacity: 0;
position: absolute;
-webkit-transition: 0.25s;
-moz-transition: 0.25s;
transition: 0.25s;
}
.digits div span:before,
.digits div span:after {
content: “”;
position: absolute;
width: 0;
height: 0;
border: @fontSize solid transparent;
}
.digits .d1 {
height: @fontSize;
width: 16px;
top: 0;
left: 6px;
}
.digits .d1:before {
border-width: 0 @fontSize @fontSize 0;
border-right-color: inherit;
left: -@fontSize;
}
.digits .d1:after {
border-width: 0 0 @fontSize @fontSize;
border-left-color: inherit;
right: -@fontSize;
}
.digits .d2 {
height: @fontSize;
width: 16px;
top: 24px;
left: 6px;
}
.digits .d2:before {
border-width: 3px 4px 2px;
border-right-color: inherit;
left: -8px;
}
.digits .d2:after {
border-width: 3px 4px 2px;
border-left-color: inherit;
right: -8px;
}
这里是1和2的组成,通过类似的方法将0-9的CSS都写完,之后获取到时间,在填入的时候判断需要填入的是哪个数字就行:
/**
-
填入时间
-
@param {String} time - 时间
-
@param {HTMLElement} timerClock - 填入时间的DOM
-
@returns 无
*/
function clocknum(time: string, timerClock: HTMLElement): void {
timerClock.innerHTML = “”;
var html = “”;
var strarr: any[] = time.toString().split(“”);
var digit_to_name = “zero one two three four five six seven eight nine”.split(
" "
);
for (var i = 0; i < strarr.length; i++) {
if (strarr[i] == “:”) {
html += ‘
’;} else {
var clasname = digit_to_name[strarr[i]];
html +=
‘<div class="’ +
clasname +
‘">’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
‘’ +
“”;
}
}
timerClock.innerHTML = html;
}
这样时间组件就算基本完成了,使用的时候只需要引入主页,放在对应的位置就可以了;
搜索组件一共分为两部分,需要单独实现,分别为:搜索框,搜索历史(热门搜索);
搜索框
这个其实简单,其实就是一个输入框,并且在其上附加了一个聚焦事件,用于和背景组件的联动,确认搜索的时候根据搜索类型打开对应的页签就可以了,并且确认搜索的时候,将该条搜索条件作为记录存储到本地缓存中,所谓历史记录的一部分,部分实现代码如下:
:class="[
‘threeS-search-container’,
{ ‘threeS-search-hover’: mouseEnter },
{ ‘threeS-search-active’: glass },
]"
@mouseenter=“handleMouseEvent”
@mouseleave=“handleMouseEvent”
<input
class=“threeS-search-input”
type=“text”
:placeholder=“glass ? ‘’ : ‘搜索内容’”
@focus=“handleFocus”
v-model=“searchValue”
@keyup.enter=“handleSearch”
/>
<button
v-if=“glass”
class=“icon iconfont icon-magnifier search-icon”
@click=“handleSearch”
:class="[
‘threeS-search-type-container’,
{ ‘threeS-type-focus’: glass },
]"
class=“threeS-search-type”
:class=“[{ ‘is-active’: item.id === searchType }]”
v-for=“item in searchTypeList”
:key=“item.id”
@click=“handleSearchType(item)”
{{ item.name }}
这个是HTML部分,从结构上看没有什么复杂的,只是搜索的按钮需要融入搜索框的背景之中,不显突兀;
const searchTypeList: searchType[] = [
{
name: “百度”,
id: “baidu”,
url: “https://www.baidu.com/s?wd=”,
},
{
name: “谷歌”,
id: “google”,
url: “https://www.google.com/search?q=”,
},
{
name: “必应”,
id: “bing”,
url: “https://cn.bing.com/search?q=”,
},
{
name: “淘宝”,
id: “taobao”,
url: “https://s.taobao.com/search?q=”,
},
];
const searchType: Ref = ref(searchTypeList[0].id);
const searchUrl: Ref = ref(searchTypeList[0].url);
function handleSearchType(item: searchType): void {
searchType.value = item.id;
searchUrl.value = item.url;
}
这个一部分搜索类型时的代码,这部分也不复杂,但是这部分又很关键,因为每个平台的搜索地址前缀到底是什么样的,网络上查了很久都没查到合理的答案,只能自己试,试了好久才发现;
历史记录
历史记录这一块主要的知识点在Vue部分其实就是一个for循环,通过对数据的便利将其展示出来,对了,还有有一个,就是数据的来源,这里的一部分是来自于后台接口,一部分是来自于本地的localstage,这里存在一个数据合并的问题以及清除历史记录时需要对本地的localstage进行同步清理,下面是部分代码
// ---------- 历史信息 start ----------
const getHistoryInfo: any = computed(
() => store.getters[“basic/basic/getHistory”]
);
watch(
() => getHistoryInfo.value,
(value) => {
historyList.value = value;
}
);
const updateHistory: ActionMethod = (history: urlInterface[]) =>
store.dispatch(“basic/basic/updateHistoryInfo”, history);
/**
-
清除历史记录
-
@param {Object} item 待清除的项
*/
function handleClearHistory(item: urlInterface): void {
const newHistoryInfo: urlInterface[] = getHistoryInfo.value.filter(
(el: urlInterface) => {
return el.url !== item.url;
}
);
// 更新
updateHistory(newHistoryInfo);
}
function goHistoryUrl(item: urlInterface): void {
window.open(item.url);
}
/**
- 清除全部历史记录
*/
function clearHistory() {
// 更新
updateHistory([]);
}
// ---------- 历史信息 end ----------
快捷入口的难点其实在于ICON的展示,至于关于Vue的知识点其实也同样跟上面一样是一个v-for的循环,将数据遍历并展示出来,并为其增加点击事件,点击后直接打开新窗口;
至于ICON的难点在于一开始使用的是iconfont的Font class模式,但是后来发现Font class模式有一个最大的缺点:无法展示多色,因此整个icon都是一个个单色的方块,后来通过仔细了解字体模式,发现了它SVG的用法,使用SVG可以将其展示成多色,当然这个模式也有一个缺点,就是对浏览器的兼容没那么好,但是,IE什么的本来就不再考虑了,以下是部分代码:
- {{ item.name }}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
资料过多,篇幅有限,需要文中全部资料可以点击这里获取前端面试资料PDF完整版!
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。
),
};
},
});
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-HLVmdu7t-1712553279522)]
[外链图片转存中…(img-d1xKyKia-1712553279523)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-wRwLeBjx-1712553279523)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
[外链图片转存中…(img-S0InFQUY-1712553279523)]
[外链图片转存中…(img-k2hjLtou-1712553279524)]
资料过多,篇幅有限,需要文中全部资料可以点击这里获取前端面试资料PDF完整版!
自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。