2025年5月24日
Qwen3 网页开发:仿一个 推特 X!
初始提示词:
开一个 X(推特)网站
改进提示词:
不错,添加一个左侧菜单, 包含 探索 通知 私信 Grok 书签 工作 社群 Premium 认证组织 个人资料 更多 等菜单,以及发布按钮和用户头像。 其他布局和风格不变。
非常不错,但是这里还有一个小问题:左侧菜单中,图标看不见。因为主题是暗色的,图标也是暗色的。需要修改一下,图标的颜色和文字一致。
是不是这个 svg 本身有问题啊,虽然样式都是白色了,但是实际上还是显示成黑色。你仔细分析一下,并解决这个问题
最终效果:

在线预览:
https://chat.qwen.ai/s/deploy/2495f6a8-3b6c-4ad8-aaba-052a18a74e73
最终代码:
import React, { useState } from 'react'; const App = () => { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [activeTab, setActiveTab] = useState('For You'); const [newPost, setNewPost] = useState(''); const [posts, setPosts] = useState([ { id: 1, user: 'Sarah Chen', username: '@sarahchen', avatar: 'https://picsum.photos/200/301 ', content: 'Just launched my new design portfolio! 🎨 Check it out and let me know what you think.', time: '2h', likes: 245, comments: 32, retweets: 18 }, { id: 2, user: 'Alex Johnson', username: '@alexj', avatar: 'https://picsum.photos/200/302 ', content: 'Excited to announce our Series A funding round! 💼 Thanks to all our investors and team.', time: '5h', likes: 189, comments: 27, retweets: 41 }, { id: 3, user: 'Tech Insights', username: '@techinsights', avatar: 'https://picsum.photos/200/303 ', content: 'Breaking: Major tech conference announces new AI partnerships today. Stay tuned for more updates.', time: '7h', likes: 312, comments: 19, retweets: 89 } ]); const handlePostSubmit = (e) => { e.preventDefault(); if (newPost.trim()) { const newPostObj = { id: Date.now(), user: 'User Name', username: '@username', avatar: 'https://picsum.photos/200/304 ', content: newPost, time: 'Now', likes: 0, comments: 0, retweets: 0 }; setPosts([newPostObj, ...posts]); setNewPost(''); } }; return ( <div className="bg-black text-white min-h-screen flex"> {/* Left Sidebar */} <aside className="w-20 md:w-72 bg-black border-r border-gray-800 p-4 flex-shrink-0"> <div className="flex items-center mb-6"> <svg viewBox="0 0 24 24" className="w-7 h-7 text-blue-400"> <path d="M23.643 4.937c-.835.37-1.732.62-2.675.733.962-.576 1.7-1.49 2.048-2.578-.9.534-1.897.922-2.958 1.13-.85-.904-2.06-1.47-3.4-1.47-2.572 0-4.658 2.086-4.658 4.66 0 .364.042.718.12 1.06-3.873-.195-7.304-2.05-9.602-4.868-.4.69-.63 1.49-.63 2.342 0 1.616.823 3.043 2.072 3.878-.764-.025-1.482-.234-2.11-.583v.06c0 2.257 1.605 4.14 3.737 4.568-.392.106-.803.162-1.227.162-.3 0-.593-.028-.877-.082.593 1.85 2.313 3.198 4.352 3.234-1.595 1.25-3.604 1.995-5.786 1.995-.376 0-.747-.022-1.112-.065 2.062 1.323 4.51 2.103 7.14 2.103 8.57 0 13.255-7.098 13.255-13.254 0-.206 0-.41-.015-.614.91-.658 1.7-1.477 2.323-2.41z" /> </svg> <span className="ml-3 font-bold text-xl hidden md:block">X</span> </div> <nav className="space-y-2"> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M22 23l-9.17-9.168 2.828-2.828L22 17.172zM4 16.086a7.93 7.93 0 010-12.172l2.828 2.828A4.93 4.93 0 004 9.543a4.93 4.93 0 002.828 4.3L4 16.086zm6.364-3.535a7.93 7.93 0 010-12.172l2.828 2.828A4.93 4.93 0 0010.364 9.543a4.93 4.93 0 002.828 4.3l-2.828 2.828z"/> </svg> <span className="font-medium hidden md:block">Home</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/> </svg> <span className="font-medium hidden md:block">Explore</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/> </svg> <span className="font-medium hidden md:block">Notifications</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/> </svg> <span className="font-medium hidden md:block">Messages</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/> </svg> <span className="font-medium hidden md:block">Grok</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M17 3H7c-1.1 0-2 .9-2 2v16l7-3 7 3V5c0-1.1-.9-2-2-2z"/> </svg> <span className="font-medium hidden md:block">Bookmarks</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/> </svg> <span className="font-medium hidden md:block">Jobs</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6z"/> </svg> <span className="font-medium hidden md:block">Communities</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6z"/> </svg> <span className="font-medium hidden md:block">Premium</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6z"/> </svg> <span className="font-medium hidden md:block">Verified Orgs</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/> </svg> <span className="font-medium hidden md:block">Profile</span> </a> <a href="#" className="flex items-center space-x-4 p-3 rounded-full hover:bg-gray-900 transition-colors"> <svg viewBox="0 0 24 24" className="w-6 h-6 text-white" fill="currentColor"> <path d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/> </svg> <span className="font-medium hidden md:block">More</span> </a> </nav> <div className="mt-auto pt-6"> <button className="w-full bg-blue-500 hover:bg-blue-600 text-white py-3 px-4 rounded-full font-bold transition-colors"> Post </button> <div className="flex items-center mt-4 space-x-3"> <img src="https://picsum.photos/200/304 " alt="Profile" className="w-10 h-10 rounded-full" /> <div className="hidden md:block"> <div className="font-bold">User Name</div> <div className="text-sm text-gray-500">@username</div> </div> </div> </div> </aside> {/* Main Content */} <main className="flex-1 border-l border-r border-gray-800 max-w-2xl overflow-y-auto"> {/* Top Bar */} <header className="sticky top-0 z-10 bg-black border-b border-gray-800 px-4 py-2 flex items-center justify-between"> <div className="flex items-center"> <button onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)} className="md:hidden mr-4" > <svg viewBox="0 0 24 24" className="w-6 h-6"> <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/> </svg> </button> <h1 className="text-xl font-bold">Home</h1> </div> <div className="relative"> <input type="text" placeholder="Search X" className="bg-gray-900 rounded-full py-2 pl-10 pr-4 focus:outline-none focus:ring-2 focus:ring-blue-500 w-48 md:w-64" /> <svg viewBox="0 0 24 24" className="w-5 h-5 absolute left-3 top-2.5 text-gray-500"> <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/> </svg> </div> </header> {/* Tabs */} <div className="flex border-b border-gray-800"> <button onClick={() => setActiveTab('For You')} className={`px-4 py-3 font-bold ${activeTab === 'For You' ? 'border-b-2 border-blue-500 text-blue-500' : 'text-gray-500'}`} > For You </button> <button onClick={() => setActiveTab('Following')} className={`px-4 py-3 font-bold ${activeTab === 'Following' ? 'border-b-2 border-blue-500 text-blue-500' : 'text-gray-500'}`} > Following </button> </div> {/* Post Input */} <div className="p-4 flex space-x-3 border-b border-gray-800"> <img src="https://picsum.photos/200/304 " alt="Profile" className="w-12 h-12 rounded-full" /> <form onSubmit={handlePostSubmit} className="flex-1"> <textarea value={newPost} onChange={(e) => setNewPost(e.target.value)} placeholder="What's happening?" className="w-full bg-transparent resize-none focus:outline-none text-lg" rows="3" /> <div className="flex justify-between mt-3"> <div className="flex space-x-2 text-blue-500"> <button type="button"> <svg viewBox="0 0 24 24" className="w-6 h-6"> <path d="M17 14.08V6c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v12c0 2.21 1.79 4 4 4h12c2.21 0 4-1.79 4-4v-8h-2v8c0 1.1-.9 2-2 2H7c-.55 0-1-.45-1-1s.45-1 1-1h12c.55 0 1-.45 1-1v-8c0-1.1-.9-2-2-2h-8c-.55 0-1 .45-1 1s.45 1 1 1h1v2.08l4 4 4-4z"/> </svg> </button> </div> <button type="submit" disabled={!newPost.trim()} className={`bg-blue-500 hover:bg-blue-600 text-white px-6 py-2 rounded-full font-bold transition-colors ${ !newPost.trim() ? 'opacity-50 cursor-not-allowed' : '' }`} > Post </button> </div> </form> </div> {/* Posts */} <div> {posts.map(post => ( <div key={post.id} className="border-b border-gray-800 p-4 hover:bg-gray-900 transition-colors"> <div className="flex space-x-3"> <img src={post.avatar} alt={post.user} className="w-12 h-12 rounded-full" /> <div className="flex-1"> <div className="flex items-center"> <span className="font-bold">{post.user}</span> <span className="text-gray-500 ml-1">{post.username} · {post.time}</span> </div> <p className="mt-1 whitespace-pre-wrap">{post.content}</p> <div className="flex justify-between mt-3 text-gray-500 max-w-md"> <button className="flex items-center space-x-1 hover:text-blue-500 transition-colors"> <svg viewBox="0 0 24 24" className="w-5 h-5"> <path d="M20 2H4c-1.1 0-2 .9-2 2v16l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z"/> </svg> <span>{post.comments}</span> </button> <button className="flex items-center space-x-1 hover:text-green-500 transition-colors"> <svg viewBox="0 0 24 24" className="w-5 h-5"> <path d="M12 5.6c-2.34 0-4.31 1.48-5 3.55C5.41 7.26 2.73 6 0 6v2c2.73 0 5.6 1.48 6.27 3.55-.66 2.07-2.63 3.55-5 3.55v2c4.42 0 8-3.58 8-8s-3.58-8-8-8v2c2.34 0 4.31 1.48 5 3.55zm13 0c-2.34 0-4.31 1.48-5 3.55 1.59-1.89 4.27-3.15 7-3.15v2c-2.73 0-5.6 1.48-6.27 3.55.66 2.07 2.63 3.55 5 3.55v2c-4.42 0-8-3.58-8-8s3.58-8 8-8v2c-2.34 0-4.31 1.48-5 3.55zm-1-13h-2v5l-1-.67l-1 .67V3H6v2h4v3l1-.67L9 8.67V6h4v5h2V3z"/> </svg> <span>{post.retweets}</span> </button> <button className="flex items-center space-x-1 hover:text-red-500 transition-colors"> <svg viewBox="0 0 24 24" className="w-5 h-5"> <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/> </svg> <span>{post.likes}</span> </button> <button className="hover:text-blue-500 transition-colors"> <svg viewBox="0 0 24 24" className="w-5 h-5"> <path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92-1.31-2.92-2.92-2.92z"/> </svg> </button> </div> </div> </div> </div> ))} </div> </main> {/* Right Sidebar - Trending & Who to follow */} <aside className="hidden lg:flex flex-col w-80 p-4 bg-black"> <div className="relative mb-4"> <input type="text" placeholder="Search X" className="bg-gray-900 rounded-full py-2 pl-10 pr-4 focus:outline-none focus:ring-2 focus:ring-blue-500 w-full" /> <svg viewBox="0 0 24 24" className="w-5 h-5 absolute left-3 top-2.5 text-gray-500"> <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5z"/> </svg> </div> <div className="bg-gray-900 rounded-xl p-4 mb-4"> <h2 className="font-bold text-xl mb-4">Trending</h2> <div className="space-y-3"> <div className="hover:bg-gray-800 p-3 rounded-lg transition-colors"> <div className="text-sm text-gray-500">Worldwide · Trending</div> <div className="font-bold">#ReactJS</div> <div className="text-sm text-gray-500">12.5K posts</div> </div> <div className="hover:bg-gray-800 p-3 rounded-lg transition-colors"> <div className="text-sm text-gray-500">Technology · Trending</div> <div className="font-bold">#AI</div> <div className="text-sm text-gray-500">23.8K posts</div> </div> </div> </div> <div className="bg-gray-900 rounded-xl p-4"> <h2 className="font-bold text-xl mb-4">Who to follow</h2> <div className="space-y-3"> <div className="flex items-center justify-between hover:bg-gray-800 p-2 rounded-lg transition-colors"> <div className="flex items-center"> <img src="https://picsum.photos/200/305 " alt="User" className="w-12 h-12 rounded-full" /> <div className="ml-3"> <div className="font-bold">Jane Doe</div> <div className="text-sm text-gray-500">@janedoe</div> </div> </div> <button className="bg-white text-black px-4 py-1 rounded-full text-sm font-bold hover:bg-gray-200 transition-colors"> Follow </button> </div> </div> </div> </aside> {/* Mobile Bottom Navigation */} <nav className="fixed bottom-0 left-0 right-0 md:hidden bg-black border-t border-gray-800 flex justify-around py-3"> <button className="text-white"> <svg viewBox="0 0 24 24" className="w-6 h-6"> <path d="M22 23l-9.17-9.168 2.828-2.828L22 17.172zM4 16.086a7.93 7.93 0 010-12.172l2.828 2.828A4.93 4.93 0 004 9.543a4.93 4.93 0 002.828 4.3L4 16.086z"/> </svg> </button> <button className="text-gray-500"> <svg viewBox="0 0 24 24" className="w-6 h-6"> <path d="M20 3H4c-1.1 0-2 .9-2 2v14l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z"/> </svg> </button> <button className="text-gray-500"> <svg viewBox="0 0 24 24" className="w-6 h-6"> <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/> </svg> </button> </nav> </div> ); }; export default App;