10 个 CSS 1 行代码技巧
在前端开发过程中,利用 CSS 一行代码技巧可以解决一些常见问题,提高编码效率,使样式设置更加简洁。本文将分享 10 个 CSS 一行代码技巧。
1. 居中对齐
居中对 齐是 CSS 中的常见需求。通过一行 CSS 代码,可以实现元素的水平垂直居中。
display: grid; place-items: center;
冒泡排序是最简单的,也是效率最差的一种排序算法。我们学习冒泡排序一般都是为了练习编程语言中的双层循环,虽然没有什么实际的意义,但是有时候面试中可能还会考到,另外对于一些数据量比较小的数组排序,也可以使用它。
冒泡排序的原理是,两两对比数组中的每个元素,如果后面的一个元素比前面的大,那么就交换它们的顺序,直到所有的元素都比对一遍。
因为在每次遍历后,都能找到最大的元素,并放到最右边,就像是冒泡,所以就有了冒泡排序这个名字。
例如,一个数组,它的元素是 [3, 1, 5, 9, 6, 2 ]。那么第一遍循环:
这样第一遍最大的元素就找出来了,放到了最后一位,数组变成了 [1, 3, 5, 6, 2, 9]。
然后第 2 遍,
这样我们的结果就变成了,135269。 好,按照这个顺序对比下去,我们下一次会得到 132569,再下一次得到 123569,这样全部遍历完成之后,排序的结果就是 123569。 我们来看一下代码:
function bubbleSort(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
这里我定义了 bubbleSort
函数:
[arr[j+1], arr[j]]
,把后面元素的值作为第一个元素,前面元素的值作为第 2 个元素,而前面的解构赋值语法因为就和变量赋值一样,那么这里的意思 就是说,把 arr[j] 的值改成 arr[j+1] 的值,把 arr[j+1] 的值改成 arr[j] 的值。因为后面的这个数组,是我们创建的新的数组,所以说它不会改变原数组的值,只有前边的这一部分会改变,这样就完成了数组的交换。如果你对这个语法不熟悉或者是想系统的学习 JavaScript 的语法,可以看我编写的《JavaScript 基础语法详解》一书,各大电商平台都有销售,并且经常会有满 100 减 50、或者半价活动。
好,最后排序完之后我们返回这个数组,我们用 315962 这个数组来测试一下,打印一下调用 bubbleSort 的函数之后,数组的排序结果,我们执行一下这个文件:
node bubble_sort.js
可以看到它打印出来了排序好后的数组,123569,
上边的代码还可以继续优化一下:
function bubbleSort(arr) {
let swapped;
for (let i = 0; i < arr.length; i++) {
swapped = false;
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
swapped = true;
}
}
if (!swapped) break;
}
return arr;
}
现在,我们的算法,如果内层循环已经排好序了,但是因为外层循环仍然需要遍历完所有次数,那么最后几次循环其实什么都没操作,所以我们可以在内部循环排好序之后,就停止外层的循环。判断是否排好序的依据是,内层循环没有发生元素交换。那么这样,我们可以先定义一个指示变量,swapped,在外层循环中,把它设置为 false,在内层循环中,如果发生了交换就把它设置为 true,当内层没有发生交换时,那么 swapped 就保持为 false,这样就可以中断外层循环了。
这时,我们在旧的排序算法函数中,外层循环的最后,打印一下 i 的值,可以看到它执行了 6 次:
function bubbleSort(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
console.log(i);
}
return arr;
}
0;
1;
2;
3;
4;
(5)[(1, 2, 3, 5, 6, 9)];
在优化后的算法中,我们也打印一下 i 的值,可以看到它执行了 5 次:
function bubbleSort(arr) {
let swapped;
for (let i = 0; i < arr.length; i++) {
swapped = false;
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
swapped = true;
}
}
console.log(i);
if (!swapped) break;
}
return arr;
}
0;
1;
2;
3;
(4)[(1, 2, 3, 5, 6, 9)];
冒泡排序在最坏情况下,时间复杂度是 O(n2),也就是说,当原数组完全是反向排序的,从大到小排列的,那么算法需要对每个元素都过一遍并且交换一次,第 1 遍需要比对和交换 n 个元素,第 2 遍是 n-1 第三遍是 n-2,以此类推一直到 0,加起来就是 n(n-1)/2,大 O 取得是近似值,所以算法复杂度就是 O(n2)。
好了这个就是冒泡排序的简介和实现方式,你学会了吗?如果有帮助请三连,想学更多的前端开发知识,请关注峰华前端工程师,感谢观看!
在前端开发过程中,利用 CSS 一行代码技巧可以解决一些常见问题,提高编码效率,使样式设置更加简洁。本文将分享 10 个 CSS 一行代码技巧。
居中对 齐是 CSS 中的常见需求。通过一行 CSS 代码,可以实现元素的水平垂直居中。
display: grid; place-items: center;
JavaScript 是一种功能强大的编程语言,我们可以通过使用一行代码实现很多功能。在日常开发中,我们经常会遇到需要快速实现某些功能的情况。下面让我们一起看看 12个有用的 JavaScript 一行代码技巧。
JavaScript 中可以通过以下方式快速生成一个随机颜色:
let randomColor = "#" + Math.floor(Math.random()*16777215).toString(16);
这行代码会生成一个六位的十六进制数,可以用作 CSS 颜色值。
如果你想获取 URL 参数,可以通过以下一行代码实现:
在现代前端开发中,打包工具已经成为不可或缺的一部分。它们可以将多个文件合并为一个或多个文件,使前端应用的加载和运行速度更快。目前,Vite 和 Webpack 是最受欢迎的打包工具之一。本文将介绍它们之间的比较和区别,以帮助你选择适合自己项目的工具。
Vite 是一种新型的前端构建工具,旨在提高开发过程中 的开发体验和构建速度。它支持所有的现代前端框架,如 Vue、React、Angular等,以及原生的 HTML/CSS/JS 应用。
Vite 的核心理念是“快速开发”。它采用了一种新的开发方式,即在开发过程中不需要事先打包应用程序,而是在应用程序运行时即时编译和构建。这种方式使得开发者可以更快地编写代码,而无需等待长时间的编译和构建过程。
Webpack 是一个广泛使用的打包工具,为现代 Web 应用程序提供了强大的静态资源管理功能。Webpack 可以将多个文件打包成一个或多个文件,并使它们在浏览器中快速加载。Webpack 是一个高度可配置的工具,因此可以根据项目的需要进行定制。
Webpack 的核心理念是“模块化”。它支持使用各种语言和框架编写模块,并将它们打包成可在浏览器中使用的 JavaScript 文件。Webpack 还提供了强大的插件系统,可以扩展其功能。
在 React 中,我们通常使用 JSX 来编写组件。JSX 是一种类似 HTML 的语法,它可以帮助我们更方便地编写组件,并且可以使代码更加易读和易于维护。在本文中,我们将介绍如何使用 JSX 编写 React 组件,并且将介绍 JSX 与 HTML 的区别、渲染列表、条件渲染、注册事件和传递 Props 相关知识。
React 是一个由 Facebook 开发的用于构建用户界面的 JavaScript 库。它采用组件化的开发模式,使得开发者可以将一个 Web 应用程序拆分成多个组件,每个组件负责不同的功能,从而使得开发、测试和维护变得更加容易。
React 的主要特点是高效、可重用和灵活。它采用了 Virtual DOM 技术,可以最小化 DOM 操作,从而提高性能。另外,React 还拥有丰富的生态系统,包括 React Router、Redux、React Native 等等,可以帮助开发者更加高效地构建 Web 应用程序、移动应用程序和桌面应用程序等等。
我们在前端开发中,经常会有居中某个元素的需求。因为 CSS 对于居中的方式有多种多样,在不同场景下有不同的效果,需要特别记住它们的应用场景才能够正常的居中元素。那么这篇文章,我们就看一下在 CSS 中,水平居中一个元素的不同方法和技巧,帮助你在前端开发中更加游刃有余。
text-align
不仅可以居中文本,还可以居中行内元素(如文本或图片)。把父元素的 'text-align' 设置为 center
,然后把子元素的 display
属性设置为 inline
就可以了。
.parent-element {
text-align: center;
}
在开发大型 Vue 项目的时候,有的组件会嵌套的很深,如果需要引入外层其他目录的组件,需要编写很长一段相对路径。假如有如下组件目录结构:
/Layout/Header/NavBar.vue
/Base/BaseLink.vue
如果在 NavBar 中引入 BaseLink 组件,需要使用下面的路径进行导入:
NavBar.vue
<script>
import BaseLink from '../../Base/BaseLink.vue';
</script>
这里使用了两个 ../
才访问到 Base 目录,如果这个时候,我们给 ../../
设置一个别名,例如 @
,那么就可以使导入路径更简洁,变成:
@/Base/BaseLink.vue
Vite 支持设置路径别名,来支持这种形式的导入。
这篇文章我们看一下对于表单整体的提交事件应该如何处理,并引入一个事件修饰符的概念。 我们继续使用上篇文章的项目示例,这里我把 html 中,class 为 form 的 div 改成了 form 元素,CSS 的样式也作了对应的调整。
<div class="form">
->
<form></form>
</div>
现在,我们在 form 元素的结束标签之前,添加一个 button 按钮元素,作为表单的提交按钮,点击它表单就会提交。
<textarea id="intro" rows="10" v-model="intro"></textarea>
<!-- 在这里添加 -->
<button type="submit">提交</button>
上篇文章我们学习了如何使用 v-model 绑定 input 输入框和 data 中的属性,这篇文章我们来看一下其它表单控件的绑定方法。
这里示例大体的样式和结构我已经写好了,你可以从视频里附带的源代码示例里,直接编写代码。用户名这个我们上篇文章介绍了,这个就先不管它了。
我们先看一下单选框的数据绑定。假如我们让用户选择一下性别,男和女。我们在 HTML 模板中:
在 Vue 中处理表单输入数据处理有两种方式,一种是使用传统的事件监听方式,另一种是使用 v-model,这篇文章我们看一下如何使用事件监听的方式处理表单输入数据。
要监听 input 输入框的事件,我们使用 @input 事件,在用户输入每个字符的时候,都会触发这个事件。
<input id="username" type="text" @input="handleInput" />
我们可以在事件处理函数中,直接访问到 event 这个 javascript 原生事件对象,这样可以像普通 js 一样,使用 event.target.value 来访问输入框的值:
这篇文章我们看一下方法和 watch 监听器之间的区别。
Methods 和 Watch 之间其实并没有什么太大的可比性,只是当 methods 方法作为 computed 计算属性那样使用时,那么它和 Watch 监听器之间的区别和计算属性跟监听器中间的区别就很类似了,当在 HTML 模板中调用方法时,会把方法的返回值计算出来并显示:
<ul>
<li v-for="vueBlog in getVueBlogs()">{{ vueBlog }}</li>
</ul>
methods: {
getVueBlogs() {
return this.blogPosts.filter((blog) => blog.includes("Vue"));
},
},