CameraContent-1-3-2.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. <template>
  2. <div
  3. class="camera-content-1-3-2"
  4. >
  5. <button
  6. class="return"
  7. @click="emit('close')"
  8. />
  9. <h1>{{ title }}</h1>
  10. <div class="content-wrap">
  11. <div
  12. class="map-wrap"
  13. >
  14. <button
  15. v-for="(item, idx) in layoutDataList.slice(1)"
  16. :key="item.title"
  17. class="hotspot"
  18. :class="{
  19. active: hotspotIdx === (idx + 1)
  20. }"
  21. @mouseenter="displayingHotspotIdx = idx + 1"
  22. @mouseleave="displayingHotspotIdx = 0"
  23. @click="() => {
  24. if (idx + 1 === checkedHotspotIdx) {
  25. checkedHotspotIdx = 0
  26. } else {
  27. checkedHotspotIdx = idx + 1
  28. }
  29. }"
  30. >
  31. <div class="label">
  32. {{ item.title }}
  33. </div>
  34. <img
  35. class="area"
  36. src="@/assets/images/camera-content-1-3-2-hotspot-area.png"
  37. alt=""
  38. draggable="false"
  39. >
  40. </button>
  41. <div
  42. class="desc"
  43. >
  44. <h3>{{ layoutDataList[hotspotIdx].title }}</h3>
  45. <div class="hotspot-detail">
  46. <p
  47. v-for="(item, idx) in layoutDataList[hotspotIdx].detail.split('\n')"
  48. :key="idx"
  49. class="text-indent"
  50. >
  51. {{ item }}
  52. </p>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. </div>
  58. </template>
  59. <script setup>
  60. import { ref, computed } from "vue"
  61. const {
  62. windowSizeInCssForRef,
  63. windowSizeWhenDesignForRef,
  64. } = useSizeAdapt(1920, 968)
  65. const emit = defineEmits(['close'])
  66. const title = computed(() => {
  67. return '大都城内的官署机构'
  68. })
  69. const layoutDataList = [
  70. {
  71. title: '官署机构',
  72. detail: '元朝的中央统治机构最重要的有三个,即负责一切行政事物的中书省,管理军政的枢密院和负责监察的御史台。元大都城内的官署并未集中布置在一起,中书省、枢密院和御史台就分散在城内各地。学者们通过研究还发现,元大都是按照官署等级来规划它们的占地面积的,上述三个级别最高的中央官署就是城内官署中占地面积最大的。元代中书省是“典领百官,会决庶务”的全国最高行政机构。',
  73. },
  74. {
  75. title: '中书省',
  76. detail: '中书省最初在皇城的丽正门内,千步廊之东,地址是刘秉忠选择的。阿合马当政时,一度迁到钟楼之西,后来又迁回原址,而新址则成了翰林国史院(北中书省)所在地。旧址位置在南,当时习惯称为南省(南中书省),新址则称为北省(北中书省)。'
  77. },
  78. {
  79. title: '枢密院',
  80. detail: '枢密院在皇城东侧。“中书帝前,六官禀焉。枢府帝旁,六师听焉。”这两个官署都紧靠宫廷,便于随时接受统治者的命令。'
  81. },
  82. {
  83. title: '御史台',
  84. detail: '负责监察的御史台,则在文明门内,皇城以东不远的地方。'
  85. },
  86. {
  87. title: '警巡院',
  88. detail: '负责大都城治安的警巡院,在全城的中央,中心阁以东,便于控制四方。'
  89. },
  90. {
  91. title: '大都路总管府',
  92. detail: '大都路总管府作为大都的管理机构,是大都路地方行政系统的最高衙署,原在中书省内,至大初年在元大都灵椿坊兴建大都路总管府署,后为明清顺天府署所沿用。'
  93. },
  94. ]
  95. const displayingHotspotIdx = ref(0)
  96. const checkedHotspotIdx = ref(0)
  97. const hotspotIdx = computed(() => displayingHotspotIdx.value !== 0 ? displayingHotspotIdx.value : checkedHotspotIdx.value)
  98. </script>
  99. <style lang="less" scoped>
  100. @page-height-design-px: 970;
  101. .camera-content-1-3-2{
  102. position: absolute;
  103. left: 0;
  104. top: 0;
  105. width: 100%;
  106. height: 100%;
  107. background: rgba(0,0,0,0.45);
  108. backdrop-filter: blur(60px);
  109. >button.return{
  110. position: absolute;
  111. width: 58px;
  112. height: 58px;
  113. left: 42px;
  114. top: 68px;
  115. background-image: url(@/assets/images/btn-return.png);
  116. background-size: contain;
  117. background-repeat: no-repeat;
  118. background-position: center center;
  119. z-index: 10;
  120. }
  121. >h1{
  122. position: absolute;
  123. left: 0;
  124. top: calc(100 / @page-height-design-px * 100vh);
  125. width: 100%;
  126. height: calc(120 / @page-height-design-px * 100vh);
  127. background-image: url(@/assets/images/camera-content-1-1-1-title-bg.png);
  128. background-size: auto 100%;
  129. background-repeat: no-repeat;
  130. background-position: center center;
  131. font-size: calc(32 / @page-height-design-px * 100vh);
  132. font-family: "Source Han Serif CN Heavy";
  133. color: #FFFFFF;
  134. line-height: calc(38 / @page-height-design-px * 100vh);
  135. display: flex;
  136. justify-content: center;
  137. align-items: center;
  138. z-index: 1;
  139. }
  140. >.content-wrap{
  141. position: absolute;
  142. left: 50%;
  143. top: 54%;
  144. width: calc(1920 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  145. height: calc(723 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  146. transform: translate(-50%, -50%);
  147. >.map-wrap{
  148. position: absolute;
  149. left: 0;
  150. top: 0;
  151. width: 100%;
  152. height: 100%;
  153. background-image: url(@/assets/images/camera-content-1-1-1-layout-bg.png);
  154. background-size: 100% 100%;
  155. background-repeat: no-repeat;
  156. background-position: center center;
  157. >button.hotspot{
  158. position: absolute;
  159. width: calc(123 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  160. // top: calc(100 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  161. // left: calc(50 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  162. >.label{
  163. position: absolute;
  164. left: 50%;
  165. bottom: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  166. transform: translate(-50%, 0);
  167. width: calc(73 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  168. min-height: calc(239 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  169. background-image: url(@/assets/images/camera-content-1-3-2-hotspot-label.png);
  170. background-size: contain;
  171. background-repeat: no-repeat;
  172. background-position: center center;
  173. justify-content: center;
  174. display: flex;
  175. flex-direction: column;
  176. align-items: center;
  177. writing-mode: vertical-lr;
  178. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  179. font-family: "Source Han Serif CN Heavy";
  180. color: #F4D085;
  181. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  182. letter-spacing: 0.5em;
  183. padding-right: calc(1 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  184. padding-bottom: calc(35 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  185. z-index: 5;
  186. }
  187. >.area{
  188. width: 100%;
  189. }
  190. }
  191. >button.hotspot.active{
  192. >.label{
  193. width: calc(77 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  194. height: calc(275 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  195. background-image: url(@/assets/images/camera-content-1-3-2-hotspot-label-active.png);
  196. transform: translate(-52.5%, 0);
  197. padding-right: calc(0 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  198. padding-left: calc(3 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  199. padding-bottom: initial;
  200. color: #724B26;
  201. }
  202. }
  203. >button.hotspot:nth-of-type(1){
  204. left: calc(531 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  205. top: calc(520 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  206. }
  207. >button.hotspot:nth-of-type(2){
  208. left: calc(694 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  209. top: calc(396 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  210. }
  211. >button.hotspot:nth-of-type(3){
  212. left: calc(828 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  213. top: calc(499 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  214. }
  215. >button.hotspot:nth-of-type(4){
  216. left: calc(575 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  217. top: calc(176 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  218. }
  219. >button.hotspot:nth-of-type(5){
  220. left: calc(621 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  221. top: calc(176 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  222. }
  223. >.desc{
  224. position: absolute;
  225. left: calc(1180 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  226. top: calc(110 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  227. width: calc(686 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  228. height: calc(461 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  229. background-image: url(@/assets/images/camera-content-1-1-1-desc-bg.png);
  230. background-size: contain;
  231. background-repeat: no-repeat;
  232. background-position: center center;
  233. display: flex;
  234. justify-content: center;
  235. align-items: center;
  236. padding-top: calc(80 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  237. padding-bottom: calc(80 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  238. padding-left: calc(100 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  239. padding-right: calc(60 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  240. >h3{
  241. position: absolute;
  242. left: calc(-24 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  243. top: calc(50 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  244. width: calc(76 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  245. height: calc(241 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  246. background-image: url(@/assets/images/camera-content-1-1-1-desc-title-bg.png);
  247. background-size: contain;
  248. background-repeat: no-repeat;
  249. background-position: center center;
  250. display: flex;
  251. justify-content: center;
  252. align-items: center;
  253. writing-mode: vertical-lr;
  254. font-size: calc(24 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  255. font-family: "Source Han Serif CN Heavy";
  256. color: #43310E;
  257. line-height: calc(28 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  258. letter-spacing: calc(2 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  259. padding-right: calc(4 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  260. }
  261. >div.hotspot-detail{
  262. max-height: 100%;
  263. overflow: auto;
  264. padding-right: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  265. >p{
  266. margin-bottom: 1em;
  267. font-size: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  268. font-family: Source Han Sans SC, Source Han Sans SC;
  269. font-weight: 300;
  270. color: #000000;
  271. line-height: calc(30 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  272. // letter-spacing: calc(4 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  273. }
  274. }
  275. }
  276. }
  277. }
  278. }
  279. @media screen and (max-height: 740px) {
  280. .camera-content-1-3-2 {
  281. > h1 {
  282. top: 0;
  283. font-size: 36px;
  284. }
  285. > .content-wrap {
  286. top: 50%;
  287. width: 100%;
  288. height: 100%;
  289. .map-wrap {
  290. button.hotspot {
  291. width: calc(163 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  292. &.active {
  293. .label {
  294. width: calc(117 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  295. height: calc(418 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  296. }
  297. }
  298. .label {
  299. font-size: 28px;
  300. width: calc(143 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  301. min-height: calc(353 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  302. }
  303. &:nth-of-type(1){
  304. left: calc(641 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  305. top: calc(690 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  306. }
  307. &:nth-of-type(2){
  308. left: calc(828 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  309. top: calc(510 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  310. }
  311. &:nth-of-type(3){
  312. left: calc(1000 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  313. top: calc(660 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  314. }
  315. &:nth-of-type(4){
  316. left: calc(605 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  317. top: calc(226 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  318. }
  319. &:nth-of-type(5){
  320. left: calc(721 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  321. top: calc(226 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  322. .label {
  323. letter-spacing: 0.2em;
  324. padding-bottom: calc(80 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  325. }
  326. }
  327. }
  328. .desc {
  329. top: calc(120 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  330. left: unset;
  331. right: calc(50 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  332. width: calc(986 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  333. height: calc(761 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  334. h3 {
  335. top: calc(150 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  336. left: calc(-34 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  337. font-size: 28px;
  338. width: calc(106 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  339. height: calc(336 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  340. }
  341. }
  342. }
  343. }
  344. }
  345. }
  346. </style>