前端入门:margin居中、border、box-radius、transform、box-shadow、mouse事件、preventDefault()

289 阅读6分钟

前端开发基础技巧详解:从 margin 到 preventDefault

本文不追求华丽的介绍,而是从实际开发角度,讲解一些常见但容易忽略的前端知识点,帮助你更高效地写出高质量、可维护的代码。

1. margin 进行居中的场景

介绍

margin: auto 是实现元素水平居中的常用方式,适用于块级元素(如 divsection 等)。

使用场景

  • 页面内容居中:将页面内容区域设置为居中布局。
  • 图片或卡片居中:在容器中使用 margin: auto 实现图片的横向居中。
  • 在 flex 或 grid 布局中:作为非布局方案的补充,适合对兼容性有要求的场景。

示例代码

/* 水平居中 */
.container {
    width: 50%;
    margin: 0 auto;
}
/* 结合 transform 垂直居中 */
.centered-el {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

2. border 属性

介绍

border 是用于设置元素边框的属性,可以控制边框宽度、样式、颜色,甚至可用 border-radius 来加圆角。

使用场景

  • 简单边框样式:用于表格、卡片、按钮等组件的边框装饰。
  • 创建图形:如制作不规则的三角形、箭头等。设置宽高为 0,搭配特定边框,可实现三角形效果。
  • 分隔元素:作为内容块之间的边框分割线。

示例代码

/* 基础边框 */
.box {
    border: 2px solid #ccc;
}
/* 制作三角形 */
.triangle {
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 100px solid red;
}

3. box-radius 属性

介绍

border-radius 用于控制元素角的圆润程度,可以设置单边或多边的圆角。

使用场景

  • 按钮美化:使按钮边角变圆,提升视觉效果。
  • 卡片圆角处理:让内容区域看起来更柔和,iPhone、Windows 系统风格常见。
  • 圆形头像:设置 border-radius: 50% 实现圆形效果。

示例代码

/* 普通圆角按钮 */
.round-button {
    border-radius: 8px;
}
/* 圆形头像 */
.avatar {
    border-radius: 50%;
}
/* 不同方向圆角 */
.custom_border {
    border-radius: 10px 20px 30px 40px;
}

4. transform 的使用场景

介绍

transform 属性可以对元素进行移动、旋转、缩放等操作,并且性能较好,常用于动画和布局。

使用场景

  • 动画提升:如按钮点击后的缩放反馈、图片悬停后的移动效果。
  • 快速居中:配合 position: absolute 和 transform:translate(-50%, -50%) 实现绝对居中。
  • 设备适配:在移动端或视窗变化时,对元素进行位移调整。

示例代码

/* 悬停动画 */
.card:hover {
    transform: scale(1.1);
}
/* 将一个元素绝对居中 */
.center-elm {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

5. box-shadow 属性

介绍

box-shadow 属性为一个元素添加阴影效果,提升层次感和立体感。

使用场景

  • 按钮或卡片阴影:模拟真实按钮的立体效果,增强视觉反馈。
  • 组件“悬空”效果:如浮动面板、菜单项等。
  • 设计风格适配:现代 UI 中常用来营造深浅对比。

示例代码

/* 基础阴影 */
.button {
    box-shadow: 0 2px 6px rgba(0,0,0,0.1);
}
/* 内阴影(inset) */
.inset-button {
    box-shadow: inset 0 2px 6px rgba(0,0,0,0.1);
}

backdrop-filter: blur(10px); 是一个CSS属性,用于对元素后面的区域应用图形效果(如模糊或颜色偏移),同时保持元素内容本身清晰可见。这个属性会创建一种"磨砂玻璃"效果,让元素背景内容变得模糊,同时保持前景内容清晰。


6. mousedown / mousemove / mouseup 事件与 clientX

介绍

这是三个鼠标事件,mousedown 开始拖拽,mousemove 持续移动,mouseup 结束操作。clientX 表示鼠标在视窗中的水平坐标,与 clientY 一起用于获取坐标差。

使用场景

  • 拖拽交互(如拖拽排序) :监听这三个事件动态改变元素位置。
  • 绘画功能:在网页上根据鼠标移动路径绘制线条或图形。
  • 自定义交互反馈:如制作“手风琴”动画、拖拽时的定位提示效果。

示例代码

let isDragging = false;
let offsetX, offsetY;
document.addEventListener('mousedown', (e) => {
    isDragging = true;
    offsetX = e.clientX;//鼠标指针相对于浏览器可视区域左侧的水平距离
    offsetY = e.clientY;
});
document.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    // 假设目标元素的定位是 absolute 或 relative
    const x = e.clientX - offsetX;
    const y = e.clientY - offsetY;
    element.style.transform = `translate(${x}px, ${y}px)`;
});
document.addEventListener('mouseup', () => {
    isDragging = false;
});

1. pageX 和 clientX一样吗 使用场景

  • 需要相对于视口定位时用 clientX/clientY
  • 需要相对于整个文档定位时用 pageX/pageY

7. getBoundingClientRect() 方法

介绍

getBoundingClientRect() 方法返回元素相对于视口的尺寸和位置信息,包括 lefttopwidthheight 等。

使用场景

  • 判断元素是否在可视区域内:例如图片懒加载或滚动时触发某些操作。
  • 相对坐标计算:获取两个元素之间的相对位置,用于拖拽、碰撞检测等。
  • 定位弹窗或提示框:动态计算元素位置后,将弹窗显示在靠近目标的位置。

示例代码

const element = document.querySelector('.target');
function isElementInViewport(el) {
    const rect = el.getBoundingClientRect();
    return (
        rect.top >= 0 &&
        rect.left >= 0 &&
        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)
    );
}
console.log(isElementInViewport(element));

8. preventDefault() 方法

介绍

preventDefault() 用于阻止某个事件的默认行为,如表单提交、点击链接、上下文菜单弹出等。

使用场景

  • 表单提交拦截:使用 AJAX 表单提交,避免页面刷新。
  • 点击事件拦截:如防止链接跳转,触发自定义逻辑。
  • 上下文菜单控制:在某些组件上阻止浏览器默认右键菜单弹出。

示例代码

document.querySelector('a').addEventListener('click', (e) => {
    e.preventDefault();
    alert('点击被阻止');
});

9.Animation

动画声明:

animation: sk-scaleout 1.0s infinite ease-in-out;

分解解释:

  • sk-scaleout:引用的@keyframes名称
  • 1.0s:动画完成一个周期需要1秒
  • infinite:无限循环播放
  • ease-in-out:缓动函数(开始和结束慢,中间快)

@keyframes 原理:

@keyframes sk-scaleout {
    0% {
        transform: scale(0);    /* 开始时缩小到0 */
        opacity: 1;             /* 开始时完全不透明 */
    }
    100% {
        transform: scale(1);    /* 结束时放大到原始大小 */
        opacity: 0;             /* 结束时完全透明 */
    }
}

动画效果描述:

  1. 元素从完全缩小(scale(0))的状态开始
  2. 逐渐放大到原始大小(scale(1))
  3. 同时从不透明(opacity: 1)逐渐变为完全透明(opacity: 0)
  4. 由于是无限循环,动画结束后会重新开始

视觉表现: 创建一个从中心向外扩散并逐渐消失的"脉冲"效果。

小结

这些技术点看似基础,但在实际开发中经常遇见、也非常重要:

技术点简介使用场景
margin: auto实现水平居中的常用方式元素居中、卡片居中
border设置边框的样式和颜色按钮装饰、三角形制作
border-radius控制元素的圆角程度按钮、卡片、头像美化
transform用于设置元素的变换方式动画效果、定位居中、布局调整
box-shadow为元素添加阴影,提升立体感按钮、卡片、弹窗等的视觉增强
clientX获取鼠标指针在视口中的水平坐标拖拽、绘图、点击反馈
getBoundingClientRect()获取元素在视口中的位置、尺寸信息判断元素是否可见、相对定位、碰撞检测
preventDefault阻止事件的默认行为表单提交、点击链接、右键菜单控制