阅读视图

发现新文章,点击刷新页面。

必和必拓预计年度铜产量将处于预期区间上半部

必和必拓集团周三表示,预计其年度铜产量将处于预期区间的上半部,且其位于智利的大型Escondida铜矿的生产成本可能低于此前预期。这家总部位于澳大利亚的矿商将Escondida铜矿的单位成本预期从之前的每磅1.20美元至1.50美元下调至每磅1.00美元至1.20美元。该公司表示,这反映了副产品抵免贡献的增加和强劲的运营表现。必和必拓集团对截至6月份财年的铜产量预期在190万至200万吨之间。(新浪财经)

Adobe宣布250亿美元股票回购计划,此前AI颠覆担忧拖累股价

Adobe未来四年内将回购多达250亿美元股票,此前人工智能颠覆担忧导致该股股价下跌。这项新的授权“直接体现了我们对强劲现金流以及为投资者创造长期价值的信心,”公司首席财务官Dan Durn周二在声明中表示。此次回购授权距离公司2024年3月宣布另一项250亿美元回购计划仅两年时间,该计划目前已接近完成。(新浪财经)

2026款乐道L90正式上市

36氪获悉,4月21日,乐道L90智能焕新发布会在杭州举行,2026款乐道L90正式上市,官方指导价26.58万元起,采用BaaS电池租用方式购买,起售价17.98万元。

法拉利首款电动车定价约55万欧元

法拉利为其首款纯电动超跑设定了约55万欧元的初步售价,这款代号或命名为“Luce”的车型将于下月在罗马正式首发亮相。这一价格尚未包含个性化选配费用,最终落地价格可能在此基础上浮动约10%。作为参考,法拉利目前在售的燃油V12旗舰车型价格约在25万至35万欧元之间,纯电车型定价直接跃升至全新高度。(新浪财经)

报道:Meta拟在美国员工电脑上安装追踪软件,以训练人工智能模型

报道援引该媒体看到的一份内部备忘录报道,Meta计划在美国员工的电脑上安装新的追踪软件,以捕捉鼠标移动、点击和击键操作,用于训练其人工智能模型。 该工具将在一系列与工作相关的应用程序和网站上运行。备忘录指出,该工具还会不时截取员工屏幕内容的快照,以提供上下文。这一举措的目的是帮助公司在仍存在不足的领域改进模型,例如从下拉菜单中进行选择和使用键盘快捷键。Meta发言人Andy Stone表示,收集的数据不会用于绩效评估或除模型训练之外的任何其他用途,并且已采取安全措施保护敏感内容。(新浪财经)

亚马逊推出GLP-1减重项目,承诺"快速、便捷"获取药物

亚马逊正加速进军蓬勃发展的减重市场,于周二推出了一项旨在简化热门GLP-1类药物获取流程的新项目。该公司表示,其初级保健业务部门Amazon One Medical将推出GLP-1管理项目,将肥胖治疗整合至日常医疗服务中。该项目融合虚拟问诊与线下就诊、处方管理及药房配送服务,将体重管理定位为一种长期慢性疾病而非一次性处方。(财联社)

德国电信据报正探索与T-Mobile US全面合并

德国电信正考虑与其美国子公司T-Mobile US进行全面合并,若交易达成,有望成为史上规模最大的公开收购案之一。据知情人士报道,德国电信已就相关方案展开内部讨论。根据初步设想,新成立的一家控股公司将同时向德国电信和T-Mobile US的股东发出基于股票的收购要约,从而将两家公司整合为一家统一的跨国电信巨头。德国电信目前已持有T-Mobile US约53%的股份。(新浪财经)

苹果推进CEO交接,整合硬件团队优化产品开发

随着约翰·特努斯准备接任首席执行官、蒂姆·库克转任董事长,苹果公司正在进行领导层过渡,管理层释放出更加聚焦硬件整合的信号。在一份致员工的备忘录中,新任命的首席硬件官约翰尼·斯鲁吉概述了将公司硬件工程与硬件技术团队合并为单一组织的计划,此举有望简化iPhone、iPad和Apple Watch等主要产品线的决策流程。(新浪财经)

美股三大指数集体收跌,热门中概股普跌

36氪获悉,4月21日收盘,美股三大指数集体下跌,道指跌0.59%,纳指跌0.59%,标普500指数跌0.63%。大型科技股多数下跌,苹果、奈飞跌超2%,特斯拉、谷歌、英伟达跌超1%,Meta小幅下跌;微软涨超1%,英特尔、亚马逊小幅上涨。热门中概股普跌,哔哩哔哩跌超6%,爱奇艺跌超5%,阿里巴巴、百度、蔚来、小鹏集团跌超3%,京东跌超2%,富途控股、理想汽车跌超1%。

timedatectl Cheatsheet

Basic Status

Check the current time, date, time zone, and sync state.

Command Description
timedatectl Show current time, time zone, and NTP status
timedatectl status Show the same formatted status explicitly
timedatectl show Show status in key-value format
timedatectl show --property=Timezone --value Print the current time zone only
timedatectl show --property=NTPSynchronized --value Print whether the clock is synchronized

Time Zones

List and change time zone settings.

Command Description
timedatectl list-timezones List all available time zones
timedatectl list-timezones | grep -i berlin Filter the time zone list
sudo timedatectl set-timezone Europe/Berlin Set the system time zone
sudo timedatectl set-timezone Etc/UTC Switch the system back to UTC
timedatectl show --property=Timezone --value Confirm the current time zone in scripts

NTP Synchronization

Enable, disable, and inspect time synchronization.

Command Description
sudo timedatectl set-ntp true Enable automatic time sync
sudo timedatectl set-ntp false Disable automatic time sync
timedatectl timesync-status Show the current NTP server, offset, and poll interval
timedatectl show-timesync Show timesync details in key-value format
timedatectl show --property=NTP --value Show whether NTP is enabled

Set Time and Date

Disable NTP first when setting the clock manually.

Command Description
sudo timedatectl set-ntp false Turn off NTP before manual changes
sudo timedatectl set-time '2026-04-21 14:30:00' Set both date and time
sudo timedatectl set-time '14:30:00' Set the time only
sudo timedatectl set-time '2026-04-21' Set the date only
sudo timedatectl set-ntp true Re-enable NTP after manual changes

RTC and Hardware Clock

Control whether the RTC uses UTC or local time.

Command Description
timedatectl show --property=LocalRTC --value Check whether the RTC uses local time
sudo timedatectl set-local-rtc 0 Set the RTC to UTC
sudo timedatectl set-local-rtc 1 Set the RTC to local time
sudo timedatectl set-local-rtc 1 --adjust-system-clock Switch RTC mode and adjust the system clock
timedatectl Confirm the RTC in local TZ status line

Script-Friendly Output

Extract single values for shell scripts and automation.

Command Description
timedatectl show --property=Timezone --value Get the current time zone
timedatectl show --property=LocalRTC --value Get the RTC mode
timedatectl show --property=CanNTP --value Check whether NTP is supported
timedatectl show --property=NTP --value Check whether NTP is enabled
timedatectl show --property=NTPSynchronized --value Check whether the clock is synchronized

Remote and Container Use

Run timedatectl against another host or a local container.

Command Description
timedatectl -H user@server status Check time settings on a remote host over SSH
timedatectl -H root@server set-timezone UTC Change the remote host time zone
timedatectl -M mycontainer status Check time settings in a local container
timedatectl -M mycontainer show --property=Timezone --value Print the container time zone only

Quick Fixes

Use these when timedatectl does not behave as expected.

Command Description
sudo timedatectl set-ntp false Fix Automatic time synchronization is enabled before set-time
timedatectl timesync-status Check which server is syncing the clock
timedatectl --no-pager Print directly without opening a pager
sudo date -s '2026-04-21 14:30:00' Set the clock on non-systemd systems where timedatectl does not work

Related Guides

Use these articles for deeper explanations and step-by-step instructions.

Guide Description
How to Set or Change the Time Zone in Linux Change the system time zone with timedatectl, tzdata, or /etc/localtime
date Command in Linux Read and set the system clock with the traditional date command
journalctl Cheatsheet Inspect time sync and service logs from the systemd journal

每日一题-距离字典两次编辑以内的单词🟡

给你两个字符串数组 queries 和 dictionary 。数组中所有单词都只包含小写英文字母,且长度都相同。

一次 编辑 中,你可以从 queries 中选择一个单词,将任意一个字母修改成任何其他字母。从 queries 中找到所有满足以下条件的字符串:不超过 两次编辑内,字符串与 dictionary 中某个字符串相同。

请你返回 queries 中的单词列表,这些单词距离 dictionary 中的单词 编辑次数 不超过 两次 。单词返回的顺序需要与 queries 中原本顺序相同。

 

示例 1:

输入:queries = ["word","note","ants","wood"], dictionary = ["wood","joke","moat"]
输出:["word","note","wood"]
解释:
- 将 "word" 中的 'r' 换成 'o' ,得到 dictionary 中的单词 "wood" 。
- 将 "note" 中的 'n' 换成 'j' 且将 't' 换成 'k' ,得到 "joke" 。
- "ants" 需要超过 2 次编辑才能得到 dictionary 中的单词。
- "wood" 不需要修改(0 次编辑),就得到 dictionary 中相同的单词。
所以我们返回 ["word","note","wood"] 。

示例 2:

输入:queries = ["yes"], dictionary = ["not"]
输出:[]
解释:
"yes" 需要超过 2 次编辑才能得到 "not" 。
所以我们返回空数组。

 

提示:

  • 1 <= queries.length, dictionary.length <= 100
  • n == queries[i].length == dictionary[j].length
  • 1 <= n <= 100
  • 所有 queries[i] 和 dictionary[j] 都只包含小写英文字母。

智界要打翻盘仗:V9给了年均12万辆指引|36氪独家

智界,这个华为与奇瑞联合打造的汽车品牌,将翻身的希望押注在了智界V9。

36氪获悉,智界V9给供应商下达了年均约12万辆的生产量纲,这一销量指引接近去年MPV市场“常青树”别克GL8全年的销量。

据36氪了解,目前宁德时代与中创新航两家电池供应商,共计为智界V9准备了过万套月产能,也有供应商按1.5万辆/月的峰值产能去备件。从供应链的备件情况来看,供应商初步认可了智界V9的销量指引。

另有接近智界的行业人士告诉36氪,智界正规划一款轿跑车型,计划达到一个较为极限的性能目标。这款车或将被送往纽北赛道,挑战一众国外豪华超跑车型。显然,智界此举与小米等主打性能的汽车品牌策略一致,意在通过纽北赛道的成绩,在消费者心中构建性能和高端的认知标签。

智界是华为与奇瑞通过智选车模式合作打造的整车品牌。智选车模式又称鸿蒙智行模式,在这种合作模式下,华为深度参与整车的产品定义、营销与渠道。

智界V9是智界品牌的第三款车型,也是鸿蒙智行品牌的首款MPV,搭载了华为乾崑 ADS 4高阶辅助驾驶系统,以及896线双光路激光雷达,将于今年5月正式发布。

在智界V9之前,智界品牌已有R7、S7两款车型。但根据奇瑞集团产销快报,2025年,智界品牌累计销量不到10万辆。因而智界V9无疑肩负着,带领智界销量突围、品牌向上的重任;但于鸿蒙智行体系而言,如何在最大程度上,避免智界V9与即将发布的尊界MPV之间的博弈,这考验着鸿蒙智行的产品节奏把控能力。

押注智界V9,智界寻觅销量支点

去年8月,华为与奇瑞在深圳举行签约仪式,宣布智界品牌进入2.0时代。根据协议,双方将在智界品牌投入超过100亿元资金,组建5000人规模的研发团队。

这场签约仪式的背景是,华为奇瑞联合打造的智界品牌,在销量上迟迟未有重大突破。相较尊界、问界等品牌,智界在它所处的生态位中,无疑还有较大的市场潜力待挖掘。2025年,奇瑞集团产销快报显示,智界品牌全年累计销量不到10万辆,因而智界品牌急需找到一个销量支点。

而智界V9正是智界进入2.0时代后的第一款全新车型,智界为了打赢V9这场翻身仗不可谓不煞费苦心。

首先是人事上的一系列调整。今年年初,智界品牌宣布,前腾势汽车总经理赵长江加入智界任执行董事,负责品牌、渠道等;今年4月,智界品牌又宣布前荣耀CMO郭锐担任智界CEO。赵长江曾操盘过同为MPV车型的腾势D9,2025年腾势D9累计销量约10万辆,仅次于别克GL8;而郭锐曾在荣耀主导构建了,覆盖全球100多个国家和地区的品牌营销体系。

与人事变动相伴随的,是智界在渠道和产线上的投入。赵长江曾告诉36氪,今年智界计划建成超200家专属智界的销售网络;郭锐也曾在接受媒体采访时表示:“为了确保V9的品质达到旗舰‘9系’的标准,智界投入10亿元,专门建造了一条全新的焊装生产线”。

除了带动品牌销量,智界V9还肩负着引领智界品牌向上的使命。华为常务董事长余承东曾公开表示:“V9将定位30万级市场,但配置水平超越百万级豪车”。

智界的前两款车型R7与S7,均定位30万元以下市场。但无论从华为造手机的过往,还是高端汽车品牌问界、豪华汽车品牌尊界的市场表现来看,高端市场才是华为的舒适区。靠着科技内核与奢华外壳,华为能够轻松获取品牌溢价和高端市场份额。

因而当智界寻求销量突破,仰攻华为更熟悉的高端市场似乎是理所必然。

此外,36氪还从接近智界的行业人士处了解到,智界正规划一款轿跑车型,并有想法将这款车送往纽北赛道。这款轿跑的推出或将加速智界品牌的高端化。

智界V9想成为MPV界黑马,优势与挑战并存

智界V9给供应商下达了年均约12万辆的量纲,这意味着这款车平均每月要实现约1万辆的交付。若再考虑到V9刚上市时的新车效应,智界给V9定下的峰值销量目标约1.5万辆。

宁德时代与中创新航两家电池供应商,共计为智界V9准备了过万套月产能,部分供应商为智界V9准备了1.5万套/月的产能。 就供应链备件情况来看,智界V9的供应商初步认可了智界下达的销量指引。

若智界V9真的实现了年均12万辆的销量,这是什么概念? 去年,MPV市场的标杆车型别克GL8,全年销量约为12.24万辆,月均约1万辆。

从智界给供应商的销量指引来看,智界V9显然有撼动MPV市场现有格局的野心,余承东也曾在去年广州车展期间公开称,这款车会“超越市面上所有旗舰MPV”。

要想成为MPV界的黑马,拥有华为深度赋能的智界V9固然有其优势。但值得注意的是,在车市竞争更为残酷的2026年,智界V9也处在与一系列MPV车型激烈角逐的状态。

2026年,别克MPV家族迎来全产品线焕新。其中,按上汽通用官方数据,今年4月初,别克GL8陆尊燃油版上市第一周,大定已突破8200台。

在中国市场暂时沉寂的上汽通用,不会让别克GL8轻易折戟。有公开信息显示,今年年初,上汽通用总经理卢晓曾在内部表示,要“保持GL8在MPV市场的销量总量第一。MPV作为上汽通用的立身之本,公司必将持续投入,不遗余力”。

除了别克GL8,同在鸿蒙智行体系的多款MPV如何定位,也是企业需要思考的问题。今年尊界将推出标轴版和长轴版两款MPV,其中标轴版MPV侧重侧重家用取向,长轴版MPV侧重商用旗舰取向。目前来看,在华为与江淮的初步规划中,这两版MPV的市场价格,将大幅高于家用及商用MPV市场现有的代表车型。

同为鸿蒙智行品牌旗下车型,同样定位MPV这一细分市场,智界V9和尊界MPV这两款车,难免会被市场拿来比较。而一年发布两款MPV的鸿蒙智行,如何做好这两款车的区隔,使它们能合力收割更多MPV市场的份额,这对鸿蒙智行提出了考验。

可尽管MPV赛道竞品林立,优质产品的供给依然稀缺。而且在豪华新能源MPV市场,集齐科技、智能和空间场景体验的产品确实不多,而这或许正是智界V9试图改写MPV市场格局的底气。

4月21日,赵长江在社交媒体平台发文暗示,智界V9将弥补苹果汽车的遗憾。对于这款新车的市场表现,智界似乎已信心十足。

作者微信:luckg17305264638

暴力(Python/Java/C++/C/Go/JS/Rust)

对于每个 $q = \textit{queries}[i]$,遍历 $\textit{dictionary}$ 中的字符串 $s$,判断 $q$ 和 $s$ 是否至多有两个位置上的字母不同。

class Solution:
    def twoEditWords(self, queries: List[str], dictionary: List[str]) -> List[str]:
        ans = []
        for q in queries:
            for s in dictionary:
                if sum(x != y for x, y in zip(q, s)) <= 2:
                    ans.append(q)
                    break
        return ans
class Solution {
    public List<String> twoEditWords(String[] queries, String[] dictionary) {
        List<String> ans = new ArrayList<>();
        for (String q : queries) {
            for (String s : dictionary) {
                int cnt = 0;
                for (int i = 0; i < s.length() && cnt <= 2; i++) {
                    if (q.charAt(i) != s.charAt(i)) {
                        cnt++;
                    }
                }
                if (cnt <= 2) {
                    ans.add(q);
                    break;
                }
            }
        }
        return ans;
    }
}
class Solution {
public:
    vector<string> twoEditWords(vector<string>& queries, vector<string>& dictionary) {
        vector<string> ans;
        for (auto& q : queries) {
            for (auto& s : dictionary) {
                int cnt = 0;
                for (int i = 0; i < s.size() && cnt <= 2; i++) {
                    if (q[i] != s[i]) {
                        cnt++;
                    }
                }
                if (cnt <= 2) {
                    ans.push_back(q);
                    break;
                }
            }
        }
        return ans;
    }
};
char** twoEditWords(char** queries, int queriesSize, char** dictionary, int dictionarySize, int* returnSize) {
    char** ans = malloc(queriesSize * sizeof(char*));
    *returnSize = 0;

    for (int i = 0; i < queriesSize; i++) {
        char* q = queries[i];
        for (int j = 0; j < dictionarySize; j++) {
            char* s = dictionary[j];
            int cnt = 0;
            for (int k = 0; s[k] && cnt <= 2; k++) {
                if (q[k] != s[k]) {
                    cnt++;
                }
            }
            if (cnt <= 2) {
                ans[(*returnSize)++] = q;
                break;
            }
        }
    }

    return ans;
}
func twoEditWords(queries, dictionary []string) (ans []string) {
for _, q := range queries {
next:
for _, s := range dictionary {
cnt := 0
for i := range s {
if q[i] != s[i] {
cnt++
if cnt > 2 {
continue next
}
}
}
ans = append(ans, q)
break
}
}
return
}
var twoEditWords = function(queries, dictionary) {
    const ans = [];
    for (const q of queries) {
        for (const s of dictionary) {
            let cnt = 0;
            for (let i = 0; i < s.length && cnt <= 2; i++) {
                if (q[i] !== s[i]) {
                    cnt++;
                }
            }
            if (cnt <= 2) {
                ans.push(q);
                break;
            }
        }
    }
    return ans;
};
impl Solution {
    pub fn two_edit_words(queries: Vec<String>, dictionary: Vec<String>) -> Vec<String> {
        let mut ans = vec![];
        for q in queries {
            for s in &dictionary {
                let mut cnt = 0;
                for (a, b) in q.bytes().zip(s.bytes()) {
                    if a != b {
                        cnt += 1;
                        if cnt > 2 {
                            break;
                        }
                    }
                }
                if cnt <= 2 {
                    ans.push(q);
                    break;
                }
            }
        }
        ans
    }
}

复杂度分析

  • 时间复杂度:$\mathcal{O}(qdn)$,其中 $q$ 是 $\textit{queries}$ 的长度,$d$ 是 $\textit{dictionary}$ 的长度,$n$ 是 $\textit{queries}[i]$ 的长度。题目保证所有字符串长度相等。
  • 空间复杂度:$\mathcal{O}(1)$。返回值不计入。

分类题单

如何科学刷题?

  1. 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环)
  2. 二分算法(二分答案/最小化最大值/最大化最小值/第K小)
  3. 单调栈(基础/矩形面积/贡献法/最小字典序)
  4. 网格图(DFS/BFS/综合应用)
  5. 位运算(基础/性质/拆位/试填/恒等式/思维)
  6. 图论算法(DFS/BFS/拓扑排序/基环树/最短路/最小生成树/网络流)
  7. 动态规划(入门/背包/划分/状态机/区间/状压/数位/数据结构优化/树形/博弈/概率期望)
  8. 常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)
  9. 数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)
  10. 贪心与思维(基本贪心策略/反悔/区间/字典序/数学/思维/脑筋急转弯/构造)
  11. 链表、树与回溯(前后指针/快慢指针/DFS/BFS/直径/LCA)
  12. 字符串(KMP/Z函数/Manacher/字符串哈希/AC自动机/后缀数组/子序列自动机)

我的题解精选(已分类)

欢迎关注 B站@灵茶山艾府

随便做

解题思路

代码

###python3

class Solution:
    def twoEditWords(self, queries: List[str], dictionary: List[str]) -> List[str]:
        def check(x,y):
            t=0
            for i in range(len(x)):
                if x[i]!=y[i]:
                    t+=1
            return t<=2
        covered=set()
        lst=[]
        for i in dictionary:
            for j in range(len(queries)):
                t=queries[j]
                if j not in covered and check(t,i):
                    covered.add(j)
                    lst.append(j)
        lst.sort()
        return [queries[i] for i in lst]

一行不解释

class Solution:
    def twoEditWords(self, Q: List[str], D: List[str], f = lambda w, D: min(sum(a != b for a, b in zip(w, t)) for t in D)) -> List[str]:
        return [w for w in Q if f(w, D) <= 2]

鼠标跟随倾斜动效

前言

最近在 gsap 上看到一个有趣的动效(Cursor-driven perspective tilt),于是决定自己实现一下,下面将介绍实现的过程,希望你能喜欢。

202604111231046.gif

观察动效

  1. 卡片的倾斜角度会随着鼠标的移入在 x 轴和 y 轴上向内进行倾斜。
  2. 卡片上的文字是悬浮在卡片,给人一种悬空在空中的错觉。

技术拆解

要实现这种 3D 的效果,在 css 中你首先想到的是什么?

在 CSS 中有三个属性实现 3D 效果至关重要。它们分别是 perspective、transform-style: preserve-3dtransform: rotateX() rotateY()。下面将详细的介绍他们在 3D 动效中的作用。

  1. perspective (透视/视距):它是 3D 的灵魂,如果没有它,你看到的效果看起来只像是在平面上进行拉伸和缩放。你可以理解它是3维空间中的z轴,定义观察者距离 z = 0平面的距离。通常设定在父容器上,数值越小(如500px),透视畸变越强烈(近大远小极度明显);数值越大(如 2000px),效果越平缓。
  2. transform-style: preserve-3d :它的作用是告诉子元素(文字层)也要保持在 3D 空间中,这样我们看到的容器的内容是有深度的,同时也可以在侧面看到元素与元素之间的距离。当父元素设置了transform-style: preserve-3d 的时候,同时子元素需要设置 transform: translateZ()。
  3. transform: rotateX() rotateY():这个属性相信大家都知道,这也是这次动效能实现的关键。rotateX 控制卡片绕水平轴转动,rotateY 控制卡片绕垂直轴转动。

总结一下

如果把 CSS 3D 比作一场电影:

  • perspective 是摄影机,决定了画面的纵深感。
  • transform-style: preserve-3d 是舞台搭建,决定了演员(元素)能不能在台前幕后来回走动,而不是画在背景板上。
  • transform: rotate / translate 是演员的动作,决定了物体怎么摆放和移动。

效果展示

如果你已经理解了上面属性,相信实现效果只是时间的问题,下面我就提前剧透一下效果吧!同时在浏览器中为你演示各个的属性的具体效果,让你更加深刻的理解上面的属性。

试想一下,如果没有设置 perspective 属性会怎么样呢?

为了更好的演示,我会将卡片绕着它的y轴固定旋转30度。然后对比设置了 perspective 属性和没有设置 perspective 的效果如下。

image.png

在对比了设置 perspective 的作用后,接下来为你演示 transform-style: preserve-3d 的效果,为了更好的演示,接下来调整一下卡片在y轴的旋转角度为-80度,同时对子元素设置 transform: translateZ(50px); 将背景调整为白色,让文字和背景不会重合。对比效果如下:

image.png

从上面的效果可以看出,设置了 transform-style: preserve-3d 的文字和背景卡片是分离的,没有设置 transform-style: preserve-3d 的文字被拍扁在卡片上面。

注意事项: 当容器设置了 transform-style: preserve-3d; 的时候,不能再设置 overflow: hidden; 不然 transform-style: preserve-3d; 不会生效。

经过上面的对比可以帮助我们更好的理解每个属性在具体场景中的使用,下面就使用 vue3 去实现具体的功能。

代码拆解

完整代码

<template>
  <div class="container">
    <div 
      class="card"
      ref="cardRef"
      :style="cardStyle"
      @mousemove="handleMouseMove"
      @mouseleave="handleMouseLeave"
    >
      <div class="content">
        <span>ANIMATION</span>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, reactive, computed } from 'vue';

const cardRef = ref(null);

// 存储旋转角度
const transform = reactive({
  rotateX: 0,
  rotateY: 0
});

// 计算最终的 CSS 样式
const cardStyle = computed(() => {
  const scale = 1;
  return {
    transform: `rotateX(${transform.rotateX}deg) rotateY(${transform.rotateY}deg)`,
    transition: 'transform 0.5s ease-out'
  };
});

const handleMouseMove = (e) => {
  if (!cardRef.value) return;

  const rect = cardRef.value.getBoundingClientRect();
  const centerX = rect.left + rect.width / 2;
  const centerY = rect.top + rect.height / 2;
  
  // 计算鼠标距离中心点的偏移量 (-1 到 1)
  const percentX = (e.clientX - centerX) / (rect.width / 2);
  const percentY = (e.clientY - centerY) / (rect.height / 2);

  const deg = 25; // 最大旋转角度
  transform.rotateY = percentX * deg;
  transform.rotateX = -percentY * deg; // 取反是因为鼠标向上移动时图片应向下倾斜
};

const handleMouseLeave = () => {
  transform.rotateX = 0;
  transform.rotateY = 0;
};
</script>

<style scoped>
.container {
  /* 3D 透视的关键 */
  perspective: 1000px; 
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100vh;
  background-color: #0f0f0f;
}

.card {
  position: relative;
  width: 320px;
  height: 200px;
  background: linear-gradient(135deg, #6ee7b7, #3b82f6);
  border-radius: 20px;
  transform-style: preserve-3d;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
  /* overflow: hidden; */
}

.content {
  font-family: 'Arial Black', sans-serif;
  font-size: 2.5rem;
  color: #000;
  /* 让文字在 3D 空间悬浮 */
  transform: translateZ(50px); 
  pointer-events: none;
}
</style>

简要分析:

  1. 绑定事件:鼠标移入卡片触发 mousemove 事件,设置卡片旋转。鼠标移除触发 mouseleave 事件将旋转的角度置为0。
  2. 样式动态计算:动态绑定 style,通过计算属性实时更新旋转的角度。
  3. 计算偏移量: 这里主要利用鼠标当前的位置减去卡片中心点计算出偏移距离,然后再除以卡片宽高的一半,等到一个-1到1的偏移值。
  4. 角度映射:通过得到的偏移值乘以 deg (25度),刚好可以映射到对应的角度,比如鼠标移动到最左边,卡片正好偏转 -25度。

优化补充

下面是一些优化的建议,有兴趣的同学可以自己实现一下:

  1. 增加光影变化,跟随鼠标移动的卡片增加渐变层的光影,让整体更加真实。
  2. mousemove 在移动端不支持,增加移动端的支持。

租电 17.98 万元起,补齐智驾短板的乐道 L90,变得更能打了

如果要给蔚来从 ICU 走向 KTV 的过程找一个转折点的话,那一定是乐道 L90。

截止到今年 4 月 3 日,乐道 L90 共交付了 5 万台,是 30 万级别大型 SUV 的销量冠军。

这份成绩单的背后,其实是蔚来多年来在电驱等底层技术上坚持自研所释放的长期复利。

依托扎实的三电基础,配合极其宽裕的座舱布局和同级罕见的巨大前备箱,L90 在应对真实的家庭多人出行场景时,产品力本就已经十分能打。

而今天的年款升级,通过智驾系统的全面升级,以及多项实用配置的落地,又进一步补齐了短板,拉长了长板。

新款乐道 L90 的价格也未做调整,依旧是:

六座版 Pro,整车购买售价为 26.58 万元,采用 BaaS 电池租用方案的售价则为 17.98 万元;

六座版 Max+,整车购买售价为 27.98 万元,BaaS 方案售价为 19.38 万元;

六座四驱 Ultra+ 版 ,整车购买售价为 29.98 万元,BaaS 方案售价为 21.38 万元。

七座的价格则是:

Max+ 版,整车购买售价为 28.58 万元,采用 BaaS 电池租用方案的售价则为 19.98 万元;

Ultra+ 版,整车购买售价为 29.98 万元,BaaS 方案售价为 21.38 万元。

神玑上车

2026 款 L90 换装了蔚来自研旗舰芯片神玑 NX9031。

从数据来看,这枚芯片的存储带宽达到了每秒 546GB,是目前行业顶尖智驾芯片的两倍,能够从容支持世界模型的长时序推理。

它为车辆的感知数据融合、智能驾驶逻辑推理以及车载高清影像处理,提供了一个统一且庞大的算力底座。过去因为算力瓶颈需要分别交给不同模块处理的任务,现在可以在同一个硬件平台上并行处理,大幅提升了系统的响应效率和协同能力。

伴随算力提升,感知硬件也得到了扩充。2026 款不仅标配了 7 颗 800 万像素高清摄像头和 4 颗高感光环视摄像头,还新增了高精度激光雷达和智驾小蓝灯。

激光雷达配合最远探测距离达 370 米的 4D 毫米波雷达,极大地拉长了夜间面对远距离障碍物识别的时间窗口,在夜间无照明的路况下,激光雷达可以在人眼勉强辨认出路面散落树枝的大约二十秒前,就已经完成识别并向系统预警。

同时,高像素摄像头实现了功能整合,除了辅助驾驶,还能同步兼顾开门预警、盲区影像和内后视镜显示,做到了硬件复用。

在日常停车时,守卫模式对夜间风险场景的识别准确率比上一代提升了百分之五十,能够精准识别二十四种不同类型的风险,而每日耗电量不足一度。

好用、实用的辅助驾驶

感知硬件的升级也提升了新车在驾驶辅助中的表现。

得益于新系统,2026 款 L90 可以实现全程不中断的点到点全域领航辅助。从出发到抵达,系统能自主应对路口变道、避让行人、窄路会车等复杂路况。

为了提升人机交互的自然度,新车增加了人机共驾功能。

在领航辅助开启状态下,如果驾驶员轻拨方向盘,系统会立即识别出驾驶员的主动驾驶意图,并自动打转向灯配合变道;当驾驶员完成操作、方向盘回正后,领航辅助系统会丝滑地重新接管车辆,全程无需退出再重新开启。

在高速公路出行时,系统还可以实时识别前方收费站多条车道的排队情况,自动为驾驶员选择队列最短的 ETC 车道行驶,提升通行效率。

为了进一步保障行车底线安全,新车增加了紧急自主靠边停车功能。当驾驶员因突发状况无法正常操作时,车辆会主动在高速车流中靠边停稳、打开双闪并呼叫救援。

在日常高频使用的泊车场景中,新车新增了泊车偏移侧选择功能。驾驶员可以根据停车位的实际空间情况,在屏幕上指定泊入后车身偏向左侧或右侧,从而为某侧车门留出更宽裕的开启空间,改善老人或儿童上下车的便利性。

此外,随心智行功能基于蔚来世界模型对多模态信息的全量理解,使得车辆能够在那些没有高精地图标注的复杂迷宫式地下停车场内,完全按照驾驶员的语音指令自主导航行驶,寻找车位或出口。

由于激光雷达的加入,新款乐道 L90 新增了 4D 全域舒适领航功能。

在车辆行驶时,系统会提前读取前方路面的起伏坑洼情况,并实时向空气悬架发送调节指令。当车辆压过减速带或凹陷的井盖时,悬架已经提前调整了阻尼和高度,从而大幅减少了路面冲击向车内乘员的传递,提升了乘坐平稳性。

面对雨雪湿滑路面,车辆能通过云端更新的路况数据和传感器信息,提前调整动力和制动分配,语音助手也会适时建议驾驶员切换湿地模式。

针对地下车库常见的环氧地坪,车辆进行了防滑控速的专项标定,在湿滑的库内地坪上行驶时,不仅能有效缩短紧急制动时的刹车距离,还能在转弯时稳定车辆的操控轨迹。

而在续航表现上,2026 款 L90 标配的 85 度电池包为后驱版提供了 600 公里的综合续航。这也要得益于 L90 的轻量化车身,其 2300 公斤的整备质量比同级车型普遍轻约 300 公斤,配合高效的电驱系统,不仅保证了较快的加速响应,也维持了较低的能耗水平。

乐道 L90 还将智驾能力延伸到了补能环节,推出了领航换电功能。配合系统对剩余续航的估算,车辆可以自动下单预约,并全程自主开进换电站完成换电,驾驶员无需下车或手动操作,让长途补能变得更加轻松。

家庭出行神器

L90 原本就具备优势的座舱空间,在这次升级中变得更加灵活多变。

新车引入了四座空间尊享模式,用户只需通过简单的语音指令或者物理按键,就能一键将第二排座椅向后滑动至最远位置,并将靠背角度调节至极为舒展的 128 度,瞬间将车内转换为宽敞的四座行政级空间。如果需要全家出行,同样只需一键开启全车规整模式,座椅便会自动恢复到标准的六人乘坐布局。

同时为了为了满足家庭出行的食材保鲜需求,新车在后备箱位置配备了一台容量达到 30 升的智能冰柜。这台冰柜的制温范围非常宽泛,可以在零下 18 度到零上 10 度之间自由调节,并且支持手机远程控制以及离车后持续不断电工作。

在人机交互方面,座舱内升级后的语音助手小乐,其底层技术已经全面切换至蔚来自研的 Nomi Intelligence 4.0 架构。

升级后的小乐能精准识别多位家人的面部特征,并在说话人就近的屏幕弹出快捷面板,减少语音沟通的繁琐程度。在交互逻辑上,小乐更加注重行车安全,遇到关闭大灯或开启前备箱等涉及安全的指令时,会主动拦截或要求二次确认。

最后,不只是 2026 款 L90,乐道全系车型都将在今年 7 月迎来 Coconut 系统的重大 OTA 更新。

这次升级不仅会明显降低车机系统的资源占用率,还会同步改善市区和高速路段的辅助驾驶体验,让全系用户都能享受到系统优化的成果。

#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。

❌