Works.tsx 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. import { css } from "@linaria/core";
  2. import { ArrowRightOutlined } from "@ant-design/icons-vue";
  3. import { TabPane, Tabs } from "ant-design-vue";
  4. import { defineComponent, reactive } from "vue";
  5. export default defineComponent({
  6. setup() {
  7. const tabs = [
  8. {
  9. title: "产品设计",
  10. key: "1",
  11. },
  12. {
  13. title: "视觉传达",
  14. key: "2",
  15. },
  16. {
  17. title: "美术艺术",
  18. key: "3",
  19. },
  20. {
  21. title: "环境设计",
  22. key: "4",
  23. },
  24. {
  25. title: "动画",
  26. key: "5",
  27. },
  28. ];
  29. const state = reactive({
  30. activeKey: "1",
  31. });
  32. return () => (
  33. <div class={[page, "home_lay_item_box"]}>
  34. <div class={"global_w"}>
  35. <Tabs activeKey={state.activeKey} class={"talent_tab"}>
  36. {{
  37. renderTabBar: () => {
  38. return (
  39. <div class={"ant-tabs-nav"}>
  40. <div class={"home_lay_title white"}>
  41. 师生作品<span>/</span>
  42. <span>Works</span>
  43. </div>
  44. <div class={"ant-tabs-nav-wrap justify-end"}>
  45. <div class={"ant-tabs-nav-list"}>
  46. {tabs.map((e) => {
  47. return (
  48. <div
  49. class={`ant-tabs-tab ${
  50. state.activeKey == e.key
  51. ? "ant-tabs-tab-active"
  52. : ""
  53. }`}
  54. key={e.key}
  55. >
  56. <div
  57. class={"ant-tabs-tab-btn"}
  58. onClick={() => {
  59. state.activeKey = e.key;
  60. }}
  61. >
  62. {e.title}
  63. </div>
  64. </div>
  65. );
  66. })}
  67. </div>
  68. </div>
  69. </div>
  70. );
  71. },
  72. default: () => {
  73. return tabs.map((item) => {
  74. return (
  75. <TabPane tab={item.title} key={item.key}>
  76. <div class={"tab_list"}>
  77. <div class={"list_item"}>
  78. <a class={"item_link"}>
  79. <img src={getImageUrl("temp_works_1.png")} />
  80. <div class={"item_txt"}>
  81. <div class={"name"}>骨科手术导航机器人</div>
  82. <div class={"authors"}>作者:张小碗</div>
  83. </div>
  84. </a>
  85. </div>
  86. <div class={"list_item"}>
  87. <div class={"item_lay"}>
  88. <a class={"item_link"}>
  89. <img src={getImageUrl("temp_works_2.png")} />
  90. <div class={"item_txt"}>
  91. <div class={"name"}>骨科手术导航机器人</div>
  92. <div class={"authors"}>作者:张小碗</div>
  93. </div>
  94. </a>
  95. </div>
  96. <div class={"item_lay"}>
  97. <a class={"item_link"}>
  98. <img src={getImageUrl("temp_works_2.png")} />
  99. <div class={"item_txt"}>
  100. <div class={"name"}>骨科手术导航机器人</div>
  101. <div class={"authors"}>作者:张小碗</div>
  102. </div>
  103. </a>
  104. </div>
  105. </div>
  106. <div class={"list_item"}>
  107. {" "}
  108. <div class={"item_lay"}>
  109. <a class={"item_link"}>
  110. <img src={getImageUrl("temp_works_2.png")} />
  111. <div class={"item_txt"}>
  112. <div class={"name"}>骨科手术导航机器人</div>
  113. <div class={"authors"}>作者:张小碗</div>
  114. </div>
  115. </a>
  116. </div>
  117. <div class={"item_lay"}>
  118. <a class={"item_link"}>
  119. <img src={getImageUrl("temp_works_2.png")} />
  120. <div class={"item_txt"}>
  121. <div class={"name"}>骨科手术导航机器人</div>
  122. <div class={"authors"}>作者:张小碗</div>
  123. </div>
  124. </a>
  125. </div>
  126. </div>
  127. <div class={"list_item"}>
  128. <div class={"item_lay"}>
  129. <a class={"item_link"}>
  130. <img src={getImageUrl("temp_works_2.png")} />
  131. <div class={"item_txt"}>
  132. <div class={"name"}>骨科手术导航机器人</div>
  133. <div class={"authors"}>作者:张小碗</div>
  134. </div>
  135. </a>
  136. </div>
  137. <div class={"item_lay"}>
  138. <a class={"item_link"}>
  139. <img src={getImageUrl("temp_works_2.png")} />
  140. <div class={"item_txt"}>
  141. <div class={"name"}>骨科手术导航机器人</div>
  142. <div class={"authors"}>作者:张小碗</div>
  143. </div>
  144. </a>
  145. </div>
  146. </div>
  147. </div>
  148. <div class={"list_more"}>
  149. <a>
  150. 查看更多
  151. <ArrowRightOutlined class={"arrow"} />
  152. </a>
  153. </div>
  154. </TabPane>
  155. );
  156. });
  157. },
  158. }}
  159. </Tabs>
  160. </div>
  161. </div>
  162. );
  163. },
  164. });
  165. const page = css`
  166. position: relative;
  167. background: url("@/assets/bg_works.png") no-repeat center top/100% auto;
  168. .talent_tab {
  169. z-index: 2;
  170. .ant-tabs-nav {
  171. margin-bottom: 40px;
  172. &::before {
  173. display: none;
  174. }
  175. .home_lay_title {
  176. margin-bottom: 0;
  177. }
  178. }
  179. .ant-tabs-tab {
  180. padding: 14px 0;
  181. font-size: 18px;
  182. color: rgba(255, 255, 255, 0.8);
  183. & + .ant-tabs-tab {
  184. margin: 0 0 0 60px;
  185. }
  186. &.ant-tabs-tab-active {
  187. .ant-tabs-tab-btn {
  188. color: #fff;
  189. }
  190. &::after {
  191. position: absolute;
  192. content: "";
  193. bottom: 0;
  194. left: 50%;
  195. transform: translateX(-50%);
  196. width: 28px;
  197. height: 2px;
  198. background-color: #fff;
  199. }
  200. }
  201. }
  202. .tab_list {
  203. display: grid;
  204. grid-template-columns: repeat(4, 1fr);
  205. gap: 24px;
  206. .list_item {
  207. height: 800px;
  208. .item_lay {
  209. height: 388px;
  210. &:first-child {
  211. margin-bottom: 24px;
  212. }
  213. }
  214. .item_link {
  215. display: block;
  216. position: relative;
  217. width: 100%;
  218. height: 100%;
  219. overflow: hidden;
  220. .item_txt {
  221. position: absolute;
  222. left: 0;
  223. bottom: 0;
  224. padding: 30px 40px;
  225. width: 100%;
  226. color: #fff;
  227. background: linear-gradient(
  228. 180deg,
  229. rgba(0, 0, 0, 0) 0%,
  230. #000000 100%
  231. );
  232. opacity: 0;
  233. overflow: hidden;
  234. .name {
  235. font-size: 20px;
  236. font-weight: 600;
  237. width: 100%;
  238. overflow: hidden;
  239. text-overflow: ellipsis;
  240. white-space: nowrap;
  241. }
  242. .authors {
  243. margin-top: 4px;
  244. font-size: 14px;
  245. font-weight: 400;
  246. }
  247. }
  248. &:hover {
  249. img {
  250. transform: scale(1.2);
  251. }
  252. .item_txt {
  253. animation: fadeInUp 0.3s ease-in-out;
  254. animation-fill-mode: forwards;
  255. }
  256. }
  257. }
  258. img {
  259. width: 100%;
  260. height: 100%;
  261. object-fit: cover;
  262. transition: all 0.3s ease-in-out;
  263. }
  264. }
  265. }
  266. }
  267. .list_more {
  268. margin-top: 35px;
  269. text-align: center;
  270. a {
  271. color: var(--vt-c-primary);
  272. }
  273. .arrow {
  274. margin-left: 8px;
  275. padding: 2px;
  276. border: 1px solid var(--vt-c-primary);
  277. font-size: 12px;
  278. border-radius: 50%;
  279. }
  280. }
  281. @keyframes fadeInUp {
  282. from {
  283. opacity: 0;
  284. transform: translate3d(0, 100%, 0);
  285. }
  286. to {
  287. opacity: 1;
  288. transform: translate3d(0, 0, 0);
  289. }
  290. }
  291. `;