2024-08-21



// 引入tram-one,它是一个小型的,模块化的库,可以用于创建和管理Web动画
import { css, transform, transition } from 'tram-one';
 
// 定义一个元素,并添加一个过渡效果
const element = document.createElement('div');
element.textContent = 'Hello, world!';
element.style.marginTop = '20px';
element.style.width = '100px';
element.style.height = '100px';
element.style.background = 'blue';
 
// 应用CSS样式和过渡效果
css(element, `
  transition: ${transition(transform, { duration: 2000 })}, background-color 1s;
  ${transform} : translateX(100px);
  background-color: red;
`);
 
// 触发过渡效果
setTimeout(() => {
  css(element, `${transform}: translateX(200px);`);
}, 1000);
 
// 在页面上显示元素
document.body.appendChild(element);

这段代码使用了tram-one库来创建一个具有过渡效果的元素。首先,创建了一个div元素,并对它应用了CSS样式和过渡效果。然后,通过setTimeout在指定的时间后触发了一个位置的变化,从而启动了定义好的过渡效果。最后,将元素添加到页面的body中进行显示。这个例子展示了如何使用tram-one库来简化CSS过渡的创建和管理。

2024-08-21

CSS3是CSS(层叠样式表)的最新版本,于2011年被公布并推出,它包含许多新特性,如阴影、渐变、变换等。

  1. 圆角:border-radius属性用于创建圆角。



div {
  border: 2px solid;
  border-radius: 50px; /* 或者可以用百分比 */
}
  1. 阴影:box-shadow属性用于添加阴影。



div {
  box-shadow: 10px 10px 5px grey; /* 水平偏移 垂直偏移 模糊距离 颜色 */
}
  1. 文字阴影:text-shadow属性用于在文字上添加阴影。



p {
  text-shadow: 2px 2px 2px grey;
}
  1. 线性渐变:background-image属性与linear-gradient函数一起使用来创建线性渐变。



div {
  background-image: linear-gradient(to right, red , yellow);
}
  1. 旋转:transform属性的rotate函数用于旋转元素。



div {
  transform: rotate(45deg); /* 旋转45度 */
}
  1. 自定义动画:使用@keyframes创建动画,并使用animation属性应用到元素上。



@keyframes example {
  from {background-color: red;}
  to {background-color: yellow;}
}
 
div {
  animation-name: example;
  animation-duration: 4s;
}
  1. 多列布局:column-width和column-count属性用于创建多列布局。



div {
  column-width: 100px;
  column-count: 4;
}
  1. 用户界面样式:CSS3提供了一些用于更改界面元素默认样式的属性,如resize、outline-offset等。



input {
  resize: none; /* 禁止调整输入字段的大小 */
  outline-offset: -2px; /* 移动轮廓线 */
}
  1. 多背景:background-image属性可以接受多个图像值,从而创建多重背景。



div {
  background-image: url(image1.jpg), url(image2.jpg);
}
  1. 渐进增强:一些新的CSS3特性可以让老版本的浏览器“逐步”增强体验,而不是一下子跳到全新体验,保障了向后兼容性。

以上是CSS3的一些基本知识点和示例,CSS3还有许多其他的特性和用法,需要开发者在实践中逐渐掌握。

2024-08-21

CSS3的transition属性用于设置元素的过渡效果,让属性的变化过程变得平滑。

解法1:基本用法




div {
  transition: width 1s;
  -webkit-transition: width 1s; /* Safari */
}
 
div:hover {
  width: 200px;
}

在上面的例子中,当鼠标悬停在div元素上时,它的宽度会在1秒钟内从当前宽度平滑过渡到200像素。

解法2:设置多个属性的过渡效果




div {
  transition: width 1s, height 1s, transform 1s;
  -webkit-transition: width 1s, height 1s, -webkit-transform 1s;
}
 
div:hover {
  width: 200px;
  height: 200px;
  transform: rotate(180deg);
}

在这个例子中,当鼠标悬停在div元素上时,它的宽度、高度和旋转效果会在1秒内从当前值平滑过渡到指定的值。

解法3:设置延迟时间




div {
  transition: width 1s, height 1s, transform 1s;
  transition-delay: 0.5s;
  -webkit-transition: width 1s, height 1s, -webkit-transform 1s;
  -webkit-transition-delay: 0.5s; /* Safari */
}
 
div:hover {
  width: 200px;
  height: 200px;
  transform: rotate(180deg);
}

在这个例子中,过渡效果在元素值改变后0.5秒开始。

解法4:设置过渡的时间函数




div {
  transition: width 1s, height 1s, transform 1s;
  transition-timing-function: ease-in-out;
  -webkit-transition: width 1s, height 1s, -webkit-transform 1s;
  -webkit-transition-timing-function: ease-in-out; /* Safari */
}
 
div:hover {
  width: 200px;
  height: 200px;
  transform: rotate(180deg);
}

在这个例子中,过渡效果使用"ease-in-out"时间函数,这意味着开始和结束时速度较慢,中间时速度较快。

解法5:设置过渡效果的持续时间




div {
  transition: width 1s, height 1s, transform 1s;
  transition-duration: 2s;
  -webkit-transition: width 1s, height 1s, -webkit-transform 1s;
  -webkit-transition-duration: 2s; /* Safari */
}
 
div:hover {
  width: 200px;
  height: 200px;
  transform: rotate(180deg);
}

在这个例子中,过渡效果的持续时间被设置为2秒。

解法6:使用all代替具体属性




div {
  transition: all 1s;
  -webkit-transition: all 1s; /* Safari */
}
 
div:hover {
  width: 200px;
  height: 200px;
  transform: rotate(180deg);
}

在这个例子中,所有属性的变化都将有1秒的过渡效果。

2024-08-21

CSS3 3D 转换允许你改变元素在三维空间中的位置或旋转。它们可以通过改变 translateX(x), translateY(y) 和 translateZ(z) 的值来移动元素,或者通过改变 rotateX(x), rotateY(y) 和 rotateZ(z) 的值来旋转元素。

以下是一些基本的 3D 转换的例子:




/* 移动元素 */
.element {
  transform: translateX(50px) translateY(100px) translateZ(50px);
}
 
/* 旋转元素 */
.element {
  transform: rotateX(45deg) rotateY(90deg) rotateZ(135deg);
}
 
/* 缩放元素 */
.element {
  transform: scaleX(1.5) scaleY(2) scaleZ(2);
}
 
/* 3D 转换的应用 */
.flip-card {
  perspective: 1000px; /* 创建3D效果 */
}
 
.flip-card-inner {
  transition: transform 0.6s;
  transform-style: preserve-3d;
}
 
.flip-card:hover .flip-card-inner {
  transform: rotateY(180deg);
}

这个例子展示了如何创建一个简单的翻转卡片效果,当鼠标悬停时卡片翻转。

2024-08-21

CSS有三种主要的引入方式:

  1. 外部样式表:使用<link>标签在HTML文件的<head>部分引入一个外部的CSS文件。



<head>
  <link rel="stylesheet" type="text/css" href="styles.css">
</head>
  1. 内部样式表:在HTML文件的<head>部分使用<style>标签直接写CSS规则。



<head>
  <style>
    body {
      background-color: #f3f3f3;
    }
  </style>
</head>
  1. 行内样式:直接在元素的style属性中写CSS规则。



<p style="color: blue;">这是一个蓝色的段落。</p>

这三种方式可以混合使用,服务于不同的场景和需求。通常,外部样式表用于大型项目,便于样式的管理和复用;内部样式表用于单页面的样式定义;行内样式主要用于临时的或者特定的样式改变,优先级最高,但不利于样式的复用和维护。

2024-08-21

CSS盒子模型由四个部分组成:margin(外边距)、border(边框)、padding(内边距)和content(内容)。盒子的总尺寸是这四个部分的总和。

设置元素的宽度和高度通常是针对content设置的。如果设置了padding或border,实际渲染的盒子会变大,影响布局。

以下是CSS盒子模型各部分尺寸的计算公式:

  • 元素的宽度:width + padding-left + padding-right + border-left + border-right
  • 元素的高度:height + padding-top + padding-bottom + border-top + border-bottom

实例代码:




/* 设置元素的宽度和高度 */
.box {
  width: 300px;
  height: 200px;
  
  /* 内边距 */
  padding: 10px;
  
  /* 边框 */
  border: 5px solid black;
  
  /* 外边距 */
  margin: 20px;
}

在这个例子中,元素的实际渲染宽度将是 300px + 10px + 10px + 5px + 5px = 330px,高度将是 200px + 10px + 10px + 5px + 5px = 230px

2024-08-21



/* 设置一个盒子的背景、倒角和阴影 */
.box {
  background: linear-gradient(to right, #FF5252, #FF5252); /* 线性渐变背景 */
  border-radius: 20px; /* 盒子的边框倒角 */
  box-shadow: 0px 5px 5px rgba(0, 0, 0, 0.5); /* 盒子的阴影 */
  width: 200px; /* 盒子的宽度 */
  height: 200px; /* 盒子的高度 */
  margin: 20px; /* 盒子的外边距 */
}

这段代码为一个类名为.box的元素设置了一个线性渐变背景、边框倒角以及盒子阴影。它展示了如何使用CSS3的渐变、边角圆角和盒子阴影来增强盒子的视觉效果。

2024-08-21

以下是使用CSS创建一个简单程序猿图形的代码示例:




<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cutey Programmer</title>
<style>
  .programmer {
    position: relative;
    width: 200px;
    height: 300px;
    background: #29b6f6;
    border-radius: 50% 50%;
    margin: 50px auto;
  }
  .programmer::before, .programmer::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
  .programmer::before {
    width: 60px;
    height: 100px;
    background: #29b6f6;
    border-radius: 50%;
  }
  .programmer::after {
    width: 80px;
    height: 120px;
    background: #29b6f6;
    border-radius: 50%;
    z-index: -1;
  }
  .programmer-body::before, .programmer-body::after {
    content: '';
    position: absolute;
    width: 100px;
    height: 180px;
    background: #29b6f6;
    border-radius: 50%;
  }
  .programmer-body::before {
    top: -50px;
    left: 20px;
    z-index: -1;
  }
  .programmer-body::after {
    bottom: -50px;
    right: 20px;
    z-index: -1;
  }
  .programmer-head {
    position: absolute;
    top: -60px;
    left: 60px;
    width: 60px;
    height: 60px;
    background: #29b6f6;
    border-radius: 50%;
    z-index: 1;
  }
  .programmer-ear {
    position: absolute;
    width: 40px;
    height: 40px;
    background: #29b6f6;
    border-radius: 50%;
    z-index: 1;
  }
  .programmer-ear.left {
    top: -10px;
    left: 30px;
  }
  .programmer-ear.right {
    top: -10px;
    right: 30px;
  }
  .programmer-eye {
    position: absolute;
    width: 16px;
    height: 28px;
    background: white;
    border-radius: 50%;
    z-index: 1;
  }
  .programmer-eye.left {
    top: 40px;
    left: 40px;
  }
  .programmer-eye.right {
    top: 40px;
    right: 40px;
  }
  .programmer-eyebrow {
    position: absolute;
    width: 80px;
    height: 12px;
    background: #29b6f6;
    border-radius: 50%;
    z-index: 1;
  }
  .programmer-eyebrow.left {
    top: 32px;
    left: 32px;
    transform: rotate(-20deg);
  }
  .programmer-eyebrow.right {
    top: 32px;
    right: 32px;
    transform: rotate(20deg);
  }
  .programmer-nose {
    position: absolute;
    width: 24px;
    he
2024-08-21

在CSS中,@media规则用于创建媒体查询,这可以根据不同的屏幕和设备特性(如屏幕宽度、分辨率、设备方向等)应用不同的样式规则。

以下是一些常见的@media使用方法:

  1. 响应式网页设计:



@media screen and (max-width: 599px) {
  body {
    background: blue;
  }
}
@media screen and (min-width: 600px) {
  body {
    background: red;
  }
}
  1. 为打印设置特定样式:



@media print {
  body {
    color: black;
    background: white;
  }
}
  1. 为移动设备设置样式:



@media screen and (max-width: 480px) {
  body {
    font-size: 12px;
  }
}
  1. 使用媒体功能查询:



@media (max-width: 600px) and (orientation: landscape) {
  body {
    background: green;
  }
}
  1. 使用not关键字排除某些媒体特性:



@media not print {
  body {
    background: yellow;
  }
}
  1. 使用all关键字选择所有媒体类型:



@media all and (min-width: 500px) {
  body {
    background: purple;
  }
}
  1. 使用媒体查询组合多个媒体类型和多个媒体特性:



@media screen, print and (orientation: landscape) {
  body {
    background: orange;
  }
}

这些是@media规则的基本用法,可以根据实际需求进行扩展和应用。

2024-08-21

在Java Web应用中,表单验证是一个常见的需求。以下是一个使用Servlet和JSP进行简单表单验证的例子:

  1. 创建一个Servlet来处理表单提交:



@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 接收表单数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email = request.getParameter("email");
 
        // 验证数据
        if (username == null || username.trim().isEmpty()) {
            request.setAttribute("error", "用户名不能为空");
        } else if (password == null || password.trim().isEmpty()) {
            request.setAttribute("error", "密码不能为空");
        } else if (email == null || email.trim().isEmpty() || !email.matches("^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$")) {
            request.setAttribute("error", "邮箱格式不正确");
        } else {
            // 数据验证通过,处理其他逻辑
            // ...
            // 跳转到成功页面
            response.sendRedirect("success.jsp");
            return;
        }
 
        // 数据验证失败,保留表单数据,跳转回注册页面
        request.setAttribute("username", username);
        request.setAttribute("password", password);
        request.setAttribute("email", email);
        request.getRequestDispatcher("register.jsp").forward(request, response);
    }
}
  1. 创建一个JSP文件用于显示表单和显示错误信息:



<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<% if (request.getAttribute("error") != null) { %>
    <div style="color: red;">
        <%= request.getAttribute("error") %>
    </div>
<% } %>
 
<form action="RegisterServlet" method="post">
    用户名: <input type="text" name="username" value="${username}">
    密码: <input type="password" name="password" value="${password}">
    邮箱: <input type="text" name="email" value="${email}">
    <input type="submit" value="注册">
</form>
</body>
</html>

在这个例子中,当Servlet接收到表单提交时,它会检查用户名、密码和邮箱是否为空以及邮箱格式是否正确。如果任何一项验证失败,它会将错误信息存储在request属性中,并将表单数据以及错误信息回传至JSP页面,让用户能够修正错误。如果所有验证都通过,可以在这里添加进一步的逻辑处理,比如将数据保存到数据库中,并重定向到一个成功页面。