如何用Java模拟登录网页系统 Java表单登录请求示例

java模拟登录网页系统的核心思路是使用http客户端库(如apache httpclient)发送包含登录凭据的post请求,并处理服务器返回的会话cookie。1.首先通过浏览器开发者工具分析登录页面url、表单参数、请求头等信息;2.在java代码中创建httpclient实例并配置cookiestore用于维持会话;3.发送get请求访问登录页面,获取可能存在的csrf token或初始化cookie;4.构造post请求,携带用户名、密码及其他必要参数,并设置合适的content-type和user-agent;5.执行post请求后检查响应状态码及内容,判断是否登录成功;6.使用相同的上下文发送后续get请求访问登录后页面,验证是否维持登录状态。此外,还需注意处理复杂的登录机制如csrf令牌、重定向及验证码等挑战。

如何用Java模拟登录网页系统 Java表单登录请求示例

用Java模拟登录网页系统,核心思路就是模拟浏览器发送HTTP请求的行为。这通常意味着你需要通过编程方式发送一个包含登录凭据(比如用户名和密码)的POST请求到目标网站的登录接口,并妥善处理服务器返回的会话信息(通常是Cookie),以便后续的请求能够维持登录状态。

如何用Java模拟登录网页系统 Java表单登录请求示例

模拟网页登录,本质上就是用代码来扮演一个用户,向服务器发送一个携带了身份信息的HTTP POST请求。这听起来可能有点复杂,但只要我们理解了浏览器背后做了什么,并用Java代码去复现这些步骤,事情就会变得清晰起来。在我看来,这不仅仅是技术实现的问题,更是一种对HTTP协议、会话管理以及前端与后端交互模式的深入理解。

解决方案

要实现Java模拟登录,我们通常会用到一些成熟的HTTP客户端库,比如Apache HttpComponents HttpClient或者OkHttp。这里我以Apache HttpClient为例,因为它功能强大且广泛使用。

立即学习“Java免费学习笔记(深入)”;

如何用Java模拟登录网页系统 Java表单登录请求示例

首先,你需要像一个侦探一样,用浏览器的开发者工具(F12)去分析目标网站的登录过程。重点关注以下几点:

登录页面的URL:这是你发送POST请求的目标地址。请求方法:绝大多数登录都是POST请求。表单参数:当你在登录框输入用户名和密码并点击登录时,浏览器会发送哪些参数?通常是usernamepassword,可能还有csrf_tokenremember_me等。这些参数的名称和值都至关重要。请求头:特别是Content-Type(通常是application/x-www-form-urlencoded)和User-Agent(模拟一个真实的浏览器User-Agent可以避免一些网站的简单反爬策略)。响应:登录成功后服务器会返回什么?是重定向到另一个页面,还是直接返回一个包含用户信息的JSON/HTML?最重要的是,服务器会设置哪些Cookie来维护会话?

有了这些信息,我们就可以开始编写Java代码了。一个基本的登录流程会是这样:

如何用Java模拟登录网页系统 Java表单登录请求示例

import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.CookieStore;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.protocol.HttpClientContext;import org.apache.http.impl.client.BasicCookieStore;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import java.util.ArrayList;import java.util.List;public class WebLoginSimulator {    public static void main(String[] args) throws Exception {        // 1. 创建Cookie存储,用于管理会话Cookie        CookieStore cookieStore = new BasicCookieStore();        // 2. 创建HttpClient上下文,将Cookie存储关联进去        HttpClientContext context = HttpClientContext.create();        context.setCookieStore(cookieStore);        // 3. 创建HttpClient实例,配置重定向策略(可选,但推荐)        CloseableHttpClient httpClient = HttpClients.custom()                .setDefaultCookieStore(cookieStore) // 也可以直接设置到HttpClient中                .build();        try {            // --- 步骤一:访问登录页面,获取可能的CSRF token或初始化Cookie ---            // 有些网站会在登录页面的HTML中嵌入一个CSRF token,或者在访问时设置一个session cookie            String loginPageUrl = "http://your-target-website.com/login"; // 替换为实际的登录页面URL            HttpGet getLoginPage = new HttpGet(loginPageUrl);            getLoginPage.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");            System.out.println("访问登录页面: " + loginPageUrl);            HttpResponse loginPageResponse = httpClient.execute(getLoginPage, context);            HttpEntity loginPageEntity = loginPageResponse.getEntity();            String loginPageContent = EntityUtils.toString(loginPageEntity, "UTF-8");            EntityUtils.consume(loginPageEntity); // 确保关闭输入流            // 这里可以解析 loginPageContent 来提取CSRF token等隐藏字段            // 例如:String csrfToken = extractCsrfToken(loginPageContent);            // 简单示例,我们假设不需要CSRF token或者直接知道其值            // --- 步骤二:构建并发送登录POST请求 ---            String loginPostUrl = "http://your-target-website.com/doLogin"; // 替换为实际的登录处理URL            HttpPost httpPost = new HttpPost(loginPostUrl);            // 设置请求头,模拟浏览器行为            httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");            // 某些网站会检查Referer,可以加上            httpPost.setHeader("Referer", loginPageUrl);            // 准备表单参数            List params = new ArrayList();            params.add(new BasicNameValuePair("username", "your_username")); // 替换为你的用户名            params.add(new BasicNameValuePair("password", "your_password")); // 替换为你的密码            // 如果有CSRF token,也在这里添加:            // params.add(new BasicNameValuePair("csrf_token", csrfToken));            httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));            System.out.println("n发送登录请求到: " + loginPostUrl);            HttpResponse response = httpClient.execute(httpPost, context); // 执行POST请求,上下文会自动处理Cookie            HttpEntity entity = response.getEntity();            System.out.println("登录响应状态码: " + response.getStatusLine().getStatusCode());            String responseBody = EntityUtils.toString(entity, "UTF-8");            System.out.println("登录响应体: n" + responseBody);            EntityUtils.consume(entity); // 确保关闭输入流            // 检查登录是否成功 (通常通过状态码、重定向或响应内容判断)            if (response.getStatusLine().getStatusCode() == 200 || response.getStatusLine().getStatusCode() == 302) {                System.out.println("n登录请求似乎已发送成功。");                // 此时,CookieStore中应该已经包含了服务器返回的会话Cookie                // --- 步骤三:访问登录后的页面,验证是否成功登录 ---                String loggedInPageUrl = "http://your-target-website.com/dashboard"; // 替换为登录后的目标页面URL                HttpGet getLoggedInPage = new HttpGet(loggedInPageUrl);                getLoggedInPage.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");                System.out.println("n尝试访问登录后的页面: " + loggedInPageUrl);                HttpResponse loggedInResponse = httpClient.execute(getLoggedInPage, context); // 再次使用相同的上下文,携带Cookie                HttpEntity loggedInEntity = loggedInResponse.getEntity();                String loggedInContent = EntityUtils.toString(loggedInEntity, "UTF-8");                System.out.println("登录后页面响应状态码: " + loggedInResponse.getStatusLine().getStatusCode());                System.out.println("登录后页面内容摘要 (前500字): n" + loggedInContent.substring(0, Math.min(loggedInContent.length(), 500)) + "...");                EntityUtils.consume(loggedInEntity);                // 根据页面内容判断是否真的登录成功,比如检查是否有“欢迎,[用户名]”字样或特定元素                if (loggedInContent.contains("欢迎") || loggedInContent.contains("Dashboard")) { // 替换为实际的成功标识                    System.out.println("n成功模拟登录并访问了登录后页面!");                } else {                    System.out.println("n登录后页面内容未显示成功标识,可能登录失败或页面内容不同。");                }            } else {                System.err.println("登录请求失败,状态码: " + response.getStatusLine().getStatusCode());            }        } finally {            httpClient.close(); // 确保关闭HttpClient连接        }    }    // 辅助方法,用于从HTML内容中提取CSRF token (这里只是一个占位符,实际需要更健壮的HTML解析)    // private static String extractCsrfToken(String htmlContent) {    //     // 使用Jsoup或其他HTML解析库来查找     //     // 例如:Document doc = Jsoup.parse(htmlContent);    //     //       Element csrfInput = doc.select("input[name=csrf_token]").first();    //     //       return csrfInput != null ? csrfInput.attr("value") : null;    //     return "dummy_csrf_token"; // 实际项目中需要实现    // }}

请注意,上述代码中的http://your-target-website.com/loginhttp://your-target-website.com/doLoginhttp://your-target-website.com/dashboard以及用户名密码都需要替换成你实际要模拟登录的网站信息。

为什么直接访问登录后的页面会失败?会话与Cookie的重要性

这是一个非常常见的问题,很多初学者在尝试模拟登录时都会遇到。答案很简单,却也深刻:HTTP协议本身是无状态的。这意味着服务器在处理每一个独立的HTTP请求时,并不知道这个请求和上一个请求之间有什么关联。你发送一个GET请求获取页面,服务器处理了,然后就“忘记”你了。

那么,我们平时浏览网页时,为什么登录一次后就能在多个页面间跳转而不需要重复登录呢?这就要归功于会话(Session)Cookie机制了。

当你在浏览器中成功登录一个网站时,服务器通常会创建一个会话(Session),并为这个会话生成一个唯一的ID。这个会话ID不会直接暴露给你,而是通过HTTP响应头中的Set-Cookie字段发送给你的浏览器。浏览器收到这个Cookie后,会将其存储起来。在之后你访问该网站的任何页面时,浏览器都会自动将这个Cookie(包含会话ID)添加到请求头中的Cookie字段发送回服务器。服务器接收到请求后,会检查请求中的Cookie,如果找到有效的会话ID,就知道这个请求是来自一个已登录的用户,从而允许你访问受保护的资源。

所以,当你尝试直接用Java访问一个需要登录才能访问的页面时,如果你的请求中没有携带有效的会话Cookie,服务器就会认为你是一个未登录的用户,从而将你重定向到登录页,或者返回一个“未授权”的错误。在Java模拟登录中,HttpClientCookieStore就是用来模拟浏览器存储和发送这些会话Cookie的关键组件。它确保了在登录成功后,后续的所有请求都能自动携带上服务器分配的会话凭证,从而维持登录状态。没有它,你的模拟登录就只是一个“一次性”的请求,无法维持会话。

如何处理复杂的登录流程:CSRF令牌、重定向与验证码?

实际的网页登录流程往往比一个简单的用户名密码表单复杂得多,这确实是模拟登录的难点所在。

CSRF(跨站请求伪造)令牌是一个非常常见的安全机制。为了防止恶意网站伪造用户请求,许多网站会在登录表单中嵌入一个隐藏的随机字符串,这就是CSRF令牌。用户提交表单时,这个令牌也会一并提交。服务器在接收到请求后,会验证这个令牌是否有效。如果无效,请求就会被拒绝。对于模拟登录而言,这意味着你不能直接构造POST请求。你需要先发送一个GET请求到登录页面,解析其HTML内容,从中提取出这个CSRF令牌的值,然后将这个值作为参数包含在你的POST登录请求中。这通常需要借助像Jsoup这样的HTML解析库。

重定向(HTTP 301/302)在登录流程中也司空见惯。登录成功后,服务器通常不会直接返回登录后的页面内容,而是发送一个HTTP 302(Found)或301(Moved Permanently)状态码,并在响应头Location中指示浏览器跳转到新的URL(比如用户仪表盘页面)。Apache HttpClient默认会处理这些重定向,自动跟随跳转。但在某些情况下,你可能需要手动检查重定向的状态码和Location头,以确保登录流程符合预期,或者在重定向链中获取一些特定的Cookie。

验证码(CAPTCHA)无疑是模拟登录的最大挑战之一。无论是图片验证码、滑动验证码还是点选验证码,它们的设计初衷就是为了区分人类用户和自动化程序。纯粹的HTTP请求模拟无法直接“识别”或“操作”这些视觉元素。处理验证码通常有以下几种方式:

人工识别输入:这是最直接但最不自动化的方式,每次遇到验证码都需要人工介入。OCR(光学字符识别)技术:对图片验证码进行识别。但验证码往往经过扭曲、干扰,OCR的识别率很难达到100%,且实现复杂。打码平台/第三方服务:将验证码图片发送给专业的打码平台,由人工或更高级的AI服务识别后返回结果。这需要支付费用,且依赖于外部服务。绕过或跳过:如果网站在某些情况下(例如IP白名单、低频请求)不强制要求验证码,可以尝试寻找这些漏洞。但这是不推荐且通常不可行的。

坦白说,如果一个网站的登录流程强制要求验证码,那么使用纯Java HTTP客户端进行自动化模拟登录会变得非常困难,甚至几乎不可能实现全自动化。在这种情况下,可能需要考虑使用更高级的自动化测试工具,比如Selenium,它能驱动真实的浏览器,从而可以模拟用户与验证码进行交互(虽然识别验证码本身依然是个难题)。

模拟登录可能遇到的技术陷阱与调试技巧

模拟登录并非一帆风顺,过程中你可能会遇到各种“坑”,这需要一些耐心和调试技巧。

一个常见的陷阱是User-Agent和Referer头。有些网站会检查这些HTTP头,如果它们看起来不像一个真实的浏览器,或者Referer头不正确(例如,登录请求的Referer不是登录页面),服务器可能会拒绝请求。所以,在你的代码中设置一个常见的浏览器User-Agent是非常有必要的,比如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36

另外,SSL/TLS证书问题也偶尔会跳出来。如果目标网站使用的是自签名证书,或者你的Java环境对某些CA证书不信任,可能会抛出SSLHandshakeException。通常,你可以通过配置HttpClient来信任所有证书(不推荐用于生产环境,但用于测试或特定场景可以),或者导入相应的证书。

还有一个比较棘手的情况是JavaScript驱动的登录。如果登录表单的提交不是一个简单的HTML表单POST,而是通过JavaScript动态构建请求、加密密码,甚至在客户端完成部分验证逻辑,那么纯粹的HTTP客户端就无能为力了。你无法直接执行这些JavaScript代码。遇到这种情况,你需要更深入地分析JavaScript代码,理解它的逻辑,然后尝试在Java中复现,或者考虑使用像Selenium这样的工具,它能够执行页面上的JavaScript。

调试技巧是解决这些问题的关键:

浏览器开发者工具(F12):这是你的首要工具。在Network(网络)标签页中,你可以看到浏览器发送的所有请求和接收到的所有响应。仔细检查登录请求的:Headers (请求头):特别是Request Headers(请求头)和Form Data(表单数据)。Response (响应):查看服务器返回的状态码、响应头(特别是`

以上就是如何用Java模拟登录网页系统 Java表单登录请求示例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/127305.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月27日 16:39:07
下一篇 2025年11月27日 16:44:51

相关推荐

  • CSS mask属性无法获取图片:为什么我的图片不见了?

    CSS mask属性无法获取图片 在使用CSS mask属性时,可能会遇到无法获取指定照片的情况。这个问题通常表现为: 网络面板中没有请求图片:尽管CSS代码中指定了图片地址,但网络面板中却找不到图片的请求记录。 问题原因: 此问题的可能原因是浏览器的兼容性问题。某些较旧版本的浏览器可能不支持CSS…

    2025年12月24日
    900
  • Uniapp 中如何不拉伸不裁剪地展示图片?

    灵活展示图片:如何不拉伸不裁剪 在界面设计中,常常需要以原尺寸展示用户上传的图片。本文将介绍一种在 uniapp 框架中实现该功能的简单方法。 对于不同尺寸的图片,可以采用以下处理方式: 极端宽高比:撑满屏幕宽度或高度,再等比缩放居中。非极端宽高比:居中显示,若能撑满则撑满。 然而,如果需要不拉伸不…

    2025年12月24日
    400
  • 如何让小说网站控制台显示乱码,同时网页内容正常显示?

    如何在不影响用户界面的情况下实现控制台乱码? 当在小说网站上下载小说时,大家可能会遇到一个问题:网站上的文本在网页内正常显示,但是在控制台中却是乱码。如何实现此类操作,从而在不影响用户界面(UI)的情况下保持控制台乱码呢? 答案在于使用自定义字体。网站可以通过在服务器端配置自定义字体,并通过在客户端…

    2025年12月24日
    800
  • 如何在地图上轻松创建气泡信息框?

    地图上气泡信息框的巧妙生成 地图上气泡信息框是一种常用的交互功能,它简便易用,能够为用户提供额外信息。本文将探讨如何借助地图库的功能轻松创建这一功能。 利用地图库的原生功能 大多数地图库,如高德地图,都提供了现成的信息窗体和右键菜单功能。这些功能可以通过以下途径实现: 高德地图 JS API 参考文…

    2025年12月24日
    400
  • 如何使用 scroll-behavior 属性实现元素scrollLeft变化时的平滑动画?

    如何实现元素scrollleft变化时的平滑动画效果? 在许多网页应用中,滚动容器的水平滚动条(scrollleft)需要频繁使用。为了让滚动动作更加自然,你希望给scrollleft的变化添加动画效果。 解决方案:scroll-behavior 属性 要实现scrollleft变化时的平滑动画效果…

    2025年12月24日
    000
  • 如何为滚动元素添加平滑过渡,使滚动条滑动时更自然流畅?

    给滚动元素平滑过渡 如何在滚动条属性(scrollleft)发生改变时为元素添加平滑的过渡效果? 解决方案:scroll-behavior 属性 为滚动容器设置 scroll-behavior 属性可以实现平滑滚动。 html 代码: click the button to slide right!…

    2025年12月24日
    500
  • 为什么设置 `overflow: hidden` 会导致 `inline-block` 元素错位?

    overflow 导致 inline-block 元素错位解析 当多个 inline-block 元素并列排列时,可能会出现错位显示的问题。这通常是由于其中一个元素设置了 overflow 属性引起的。 问题现象 在不设置 overflow 属性时,元素按预期显示在同一水平线上: 不设置 overf…

    2025年12月24日 好文分享
    400
  • 网页使用本地字体:为什么 CSS 代码中明明指定了“荆南麦圆体”,页面却仍然显示“微软雅黑”?

    网页中使用本地字体 本文将解答如何将本地安装字体应用到网页中,避免使用 src 属性直接引入字体文件。 问题: 想要在网页上使用已安装的“荆南麦圆体”字体,但 css 代码中将其置于第一位的“font-family”属性,页面仍显示“微软雅黑”字体。 立即学习“前端免费学习笔记(深入)”; 答案: …

    2025年12月24日
    000
  • 如何选择元素个数不固定的指定类名子元素?

    灵活选择元素个数不固定的指定类名子元素 在网页布局中,有时需要选择特定类名的子元素,但这些元素的数量并不固定。例如,下面这段 html 代码中,activebar 和 item 元素的数量均不固定: *n *n 如果需要选择第一个 item元素,可以使用 css 选择器 :nth-child()。该…

    2025年12月24日
    200
  • 使用 SVG 如何实现自定义宽度、间距和半径的虚线边框?

    使用 svg 实现自定义虚线边框 如何实现一个具有自定义宽度、间距和半径的虚线边框是一个常见的前端开发问题。传统的解决方案通常涉及使用 border-image 引入切片图片,但是这种方法存在引入外部资源、性能低下的缺点。 为了避免上述问题,可以使用 svg(可缩放矢量图形)来创建纯代码实现。一种方…

    2025年12月24日
    100
  • 如何让“元素跟随文本高度,而不是撑高父容器?

    如何让 元素跟随文本高度,而不是撑高父容器 在页面布局中,经常遇到父容器高度被子元素撑开的问题。在图例所示的案例中,父容器被较高的图片撑开,而文本的高度没有被考虑。本问答将提供纯css解决方案,让图片跟随文本高度,确保父容器的高度不会被图片影响。 解决方法 为了解决这个问题,需要将图片从文档流中脱离…

    2025年12月24日
    000
  • 为什么我的特定 DIV 在 Edge 浏览器中无法显示?

    特定 DIV 无法显示:用户代理样式表的困扰 当你在 Edge 浏览器中打开项目中的某个 div 时,却发现它无法正常显示,仔细检查样式后,发现是由用户代理样式表中的 display none 引起的。但你疑问的是,为什么会出现这样的样式表,而且只针对特定的 div? 背后的原因 用户代理样式表是由…

    2025年12月24日
    200
  • CSS元素设置em和transition后,为何载入页面无放大效果?

    css元素设置em和transition后,为何载入无放大效果 很多开发者在设置了em和transition后,却发现元素载入页面时无放大效果。本文将解答这一问题。 原问题:在视频演示中,将元素设置如下,载入页面会有放大效果。然而,在个人尝试中,并未出现该效果。这是由于macos和windows系统…

    2025年12月24日
    200
  • inline-block元素错位了,是为什么?

    inline-block元素错位背后的原因 inline-block元素是一种特殊类型的块级元素,它可以与其他元素行内排列。但是,在某些情况下,inline-block元素可能会出现错位显示的问题。 错位的原因 当inline-block元素设置了overflow:hidden属性时,它会影响元素的…

    2025年12月24日
    000
  • 为什么 CSS mask 属性未请求指定图片?

    解决 css mask 属性未请求图片的问题 在使用 css mask 属性时,指定了图片地址,但网络面板显示未请求获取该图片,这可能是由于浏览器兼容性问题造成的。 问题 如下代码所示: 立即学习“前端免费学习笔记(深入)”; icon [data-icon=”cloud”] { –icon-cl…

    2025年12月24日
    200
  • 为什么使用 inline-block 元素时会错位?

    inline-block 元素错位成因剖析 在使用 inline-block 元素时,可能会遇到它们错位显示的问题。如代码 demo 所示,当设置了 overflow 属性时,a 标签就会错位下沉,而未设置时却不会。 问题根源: overflow:hidden 属性影响了 inline-block …

    2025年12月24日
    000
  • 如何利用 CSS 选中激活标签并影响相邻元素的样式?

    如何利用 css 选中激活标签并影响相邻元素? 为了实现激活标签影响相邻元素的样式需求,可以通过 :has 选择器来实现。以下是如何具体操作: 对于激活标签相邻后的元素,可以在 css 中使用以下代码进行设置: li:has(+li.active) { border-radius: 0 0 10px…

    2025年12月24日
    100
  • 为什么我的 CSS 元素放大效果无法正常生效?

    css 设置元素放大效果的疑问解答 原提问者在尝试给元素添加 10em 字体大小和过渡效果后,未能在进入页面时看到放大效果。探究发现,原提问者将 CSS 代码直接写在页面中,导致放大效果无法触发。 解决办法如下: 将 CSS 样式写在一个单独的文件中,并使用 标签引入该样式文件。这个操作与原提问者观…

    2025年12月24日
    000
  • 如何模拟Windows 10 设置界面中的鼠标悬浮放大效果?

    win10设置界面的鼠标移动显示周边的样式(探照灯效果)的实现方式 在windows设置界面的鼠标悬浮效果中,光标周围会显示一个放大区域。在前端开发中,可以通过多种方式实现类似的效果。 使用css 使用css的transform和box-shadow属性。通过将transform: scale(1.…

    2025年12月24日
    200
  • 为什么我的 em 和 transition 设置后元素没有放大?

    元素设置 em 和 transition 后不放大 一个 youtube 视频中展示了设置 em 和 transition 的元素在页面加载后会放大,但同样的代码在提问者电脑上没有达到预期效果。 可能原因: 问题在于 css 代码的位置。在视频中,css 被放置在单独的文件中并通过 link 标签引…

    2025年12月24日
    100

发表回复

登录后才能评论
关注微信