Use CSS Grid on photo.html, resolve some Chrome/FF differences.
- In Firefox, the image under flex would be full-res height instead of staying screen height. In this new Grid-based layout the image is the correct size. Left toolbox still uses flex, no problems with it. - Redid the classing of the photo_viewer and eliminated photo_img_holder so that all media types follow the same markup. - Added a CSS variable for tracking narrow mode instead of relying on coincidental properties like flex settings.
This commit is contained in:
		
							parent
							
								
									b864397242
								
							
						
					
					
						commit
						9b72b3dff0
					
				
					 1 changed files with 85 additions and 97 deletions
				
			
		|  | @ -14,38 +14,35 @@ | ||||||
|     <script src="/static/js/tag_autocomplete.js"></script> |     <script src="/static/js/tag_autocomplete.js"></script> | ||||||
| 
 | 
 | ||||||
| <style> | <style> | ||||||
| body |  | ||||||
| { |  | ||||||
|     display: flex; |  | ||||||
|     flex-direction: column; |  | ||||||
| } |  | ||||||
| #content_body | #content_body | ||||||
| { | { | ||||||
|     /* Override common.css */ |     --narrow:0; | ||||||
|     display: flex; |  | ||||||
|     flex: 1; |     flex: 1; | ||||||
|     flex-direction: row; |     grid-template: | ||||||
|  |         "left right" 1fr | ||||||
|  |         / 310px 1fr; | ||||||
| } | } | ||||||
| #left | #left | ||||||
| { | { | ||||||
|  |     grid-area: left; | ||||||
|  | 
 | ||||||
|     display: flex; |     display: flex; | ||||||
|     flex-direction: column; |     flex-direction: column; | ||||||
| 
 | 
 | ||||||
|     min-height: min-content; |     min-height: min-content; | ||||||
|     max-width: 300px; |  | ||||||
|     /*padding: 8px;*/ |  | ||||||
| 
 | 
 | ||||||
|     background-color: var(--color_site_transparency); |     background-color: var(--color_site_transparency); | ||||||
| } | } | ||||||
| #right | #right | ||||||
| { | { | ||||||
|     flex: 1; |     grid-area: right; | ||||||
|     display: flex; | 
 | ||||||
|  |     display: grid; | ||||||
|  |     grid-template: "viewer" 1fr / 1fr; | ||||||
| } | } | ||||||
| #editor_area | #editor_area | ||||||
| { | { | ||||||
|     padding: 8px; |     padding: 8px; | ||||||
| 
 |  | ||||||
|     word-wrap: break-word; |     word-wrap: break-word; | ||||||
| } | } | ||||||
| #refresh_metadata_button | #refresh_metadata_button | ||||||
|  | @ -65,63 +62,55 @@ body | ||||||
|     max-height: none; |     max-height: none; | ||||||
|     margin: 8px; |     margin: 8px; | ||||||
| } | } | ||||||
| .photo_viewer | #photo_viewer | ||||||
| { | { | ||||||
|     display: flex; |     grid-area: viewer; | ||||||
|     flex: 1; |     display: grid; | ||||||
|     flex-direction: column; | } | ||||||
|     justify-content: center; | .photo_viewer_audio, | ||||||
|  | .photo_viewer_video, | ||||||
|  | .photo_viewer_application, | ||||||
|  | .photo_viewer_text | ||||||
|  | { | ||||||
|  |     justify-items: center; | ||||||
|     align-items: center; |     align-items: center; | ||||||
| } | } | ||||||
| .photo_viewer a | #photo_viewer audio, | ||||||
|  | #photo_viewer video | ||||||
| { | { | ||||||
|     display: flex; |  | ||||||
|     justify-content: center; |  | ||||||
|     align-items: center; |  | ||||||
| } |  | ||||||
| #photo_img_holder |  | ||||||
| { |  | ||||||
|     display: flex; |  | ||||||
|     justify-content: center; |  | ||||||
|     align-items: center; |  | ||||||
| 
 |  | ||||||
|     height: 100%; |  | ||||||
|     width: 100%; |     width: 100%; | ||||||
|  |     max-width: 100%; | ||||||
|  |     max-height: 100%; | ||||||
|  | } | ||||||
|  | .photo_viewer_image | ||||||
|  | { | ||||||
|  |     display: grid; | ||||||
|  |     justify-items: center; | ||||||
|  |     align-items: center; | ||||||
| 
 | 
 | ||||||
|  |     max-height: 100%; | ||||||
|     background-repeat: no-repeat; |     background-repeat: no-repeat; | ||||||
| } | } | ||||||
| #photo_img_holder img | .photo_viewer_image img | ||||||
| { | { | ||||||
|     max-height: 100%; |     max-height: 100%; | ||||||
|     max-width: 100%; |     max-width: 100%; | ||||||
| } | } | ||||||
| .photo_viewer audio | 
 | ||||||
| { |  | ||||||
|     width: 100%; |  | ||||||
| } |  | ||||||
| .photo_viewer video |  | ||||||
| { |  | ||||||
|     max-width: 100%; |  | ||||||
|     max-height: 100%; |  | ||||||
|     width: 100%; |  | ||||||
|     overflow: hidden; |  | ||||||
| } |  | ||||||
| @media screen and (max-width: 800px) | @media screen and (max-width: 800px) | ||||||
| { | { | ||||||
|     #content_body |     #content_body | ||||||
|     { |     { | ||||||
|         /* |         --narrow:1; | ||||||
|         When flexing, it tries to contain itself entirely in the screen, |         grid-template: | ||||||
|         forcing #left and #right to squish together. |             "right" 1fr | ||||||
|         */ |             "left" 1fr; | ||||||
|         flex: none; |  | ||||||
|         flex-direction: column-reverse; |  | ||||||
|     } |     } | ||||||
|     #left |     #left | ||||||
|     { |     { | ||||||
|         /* |         /* | ||||||
|         Display: None will be overridden as soon as the page detects that the |         Display: none will be returned back to flex as soon as the page detects | ||||||
|         screen is in narrow mode and turns off the tag box's autofocus |         that the screen is in narrow mode and turns off the tag box's autofocus. | ||||||
|         */ |         */ | ||||||
|         display: none; |         display: none; | ||||||
|         width: initial; |         width: initial; | ||||||
|  | @ -130,10 +119,7 @@ body | ||||||
|     } |     } | ||||||
|     #right |     #right | ||||||
|     { |     { | ||||||
|         flex: none; |         height: calc(100vh - 40px); | ||||||
|         flex-direction: row; |  | ||||||
|         max-width: none; |  | ||||||
|         height: calc(100% - 20px); |  | ||||||
|     } |     } | ||||||
|     #message_area |     #message_area | ||||||
|     { |     { | ||||||
|  | @ -220,22 +206,24 @@ body | ||||||
| 
 | 
 | ||||||
| <div id="right"> | <div id="right"> | ||||||
|     <!-- THE PHOTO ITSELF --> |     <!-- THE PHOTO ITSELF --> | ||||||
|     <div class="photo_viewer"> |     <div id="photo_viewer" class="photo_viewer_{{photo.simple_mimetype}}" {%if photo.simple_mimetype == "image"%}onclick="toggle_hoverzoom(event)"{%endif%}> | ||||||
|         {% if photo.simple_mimetype == "image" %} |         {% if photo.simple_mimetype == "image" %} | ||||||
|         <div id="photo_img_holder" onclick="toggle_hoverzoom(event)"> |         <img src="{{photo|file_link}}" alt="{{photo.basename}}" onload="this.style.opacity=0.99"> | ||||||
|             <img | 
 | ||||||
|             id="photo_img" |  | ||||||
|             src="{{photo|file_link}}" |  | ||||||
|             alt="{{photo.basename}}" |  | ||||||
|             onload="this.style.opacity=0.99" |  | ||||||
|             > |  | ||||||
|         </div> |  | ||||||
|         {% elif photo.simple_mimetype == "video" %} |         {% elif photo.simple_mimetype == "video" %} | ||||||
|         <video src="{{photo|file_link}}" controls preload=none {%if photo.thumbnail%}poster="/thumbnail/{{photo.id}}.jpg"{%endif%}></video> |         <video | ||||||
|  |         src="{{photo|file_link}}" | ||||||
|  |         controls | ||||||
|  |         preload=none | ||||||
|  |         {%if photo.thumbnail%}poster="/thumbnail/{{photo.id}}.jpg"{%endif%} | ||||||
|  |         ></video> | ||||||
|  | 
 | ||||||
|         {% elif photo.simple_mimetype == "audio" %} |         {% elif photo.simple_mimetype == "audio" %} | ||||||
|         <audio src="{{photo|file_link}}" controls></audio> |         <audio src="{{photo|file_link}}" controls></audio> | ||||||
|  | 
 | ||||||
|         {% else %} |         {% else %} | ||||||
|         <a href="{{photo|file_link}}">View {{photo.basename}}</a> |         <a href="{{photo|file_link}}">View {{photo.basename}}</a> | ||||||
|  | 
 | ||||||
|         {% endif %} |         {% endif %} | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
|  | @ -306,38 +294,38 @@ var ZOOM_BG_URL = "url('{{photo|file_link}}')"; | ||||||
| function enable_hoverzoom(event) | function enable_hoverzoom(event) | ||||||
| { | { | ||||||
|     //console.log("enable zoom"); |     //console.log("enable zoom"); | ||||||
|     var photo_img_holder = document.getElementById("photo_img_holder"); |     var photo_viewer = document.getElementById("photo_viewer"); | ||||||
|     var photo_img = document.getElementById("photo_img"); |     var photo_img = photo_viewer.children[0]; | ||||||
|     if ( |     if ( | ||||||
|         photo_img.naturalWidth < photo_img_holder.offsetWidth && |         photo_img.naturalWidth < photo_viewer.offsetWidth && | ||||||
|         photo_img.naturalHeight < photo_img_holder.offsetHeight |         photo_img.naturalHeight < photo_viewer.offsetHeight | ||||||
|     ) |     ) | ||||||
|     { |     { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     photo_img.style.opacity = "0"; |     photo_img.style.opacity = "0"; | ||||||
|     photo_img.style.display = "none"; |     photo_img.style.display = "none"; | ||||||
|     photo_img_holder.style.cursor = "zoom-out"; |     photo_viewer.style.cursor = "zoom-out"; | ||||||
|     photo_img_holder.style.backgroundImage = ZOOM_BG_URL; |     photo_viewer.style.backgroundImage = ZOOM_BG_URL; | ||||||
|     photo_img_holder.onmousemove = move_hoverzoom; |     photo_viewer.onmousemove = move_hoverzoom; | ||||||
|     move_hoverzoom(event) |     move_hoverzoom(event) | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| function disable_hoverzoom() | function disable_hoverzoom() | ||||||
| { | { | ||||||
|     //console.log("disable zoom"); |     //console.log("disable zoom"); | ||||||
|     var photo_img_holder = document.getElementById("photo_img_holder"); |     var photo_viewer = document.getElementById("photo_viewer"); | ||||||
|     var photo_img = document.getElementById("photo_img"); |     var photo_img = photo_viewer.children[0]; | ||||||
| 
 | 
 | ||||||
|     photo_img.style.opacity = "100"; |     photo_img.style.opacity = "100"; | ||||||
|     photo_img_holder.style.cursor = ""; |     photo_viewer.style.cursor = ""; | ||||||
|     photo_img.style.display = ""; |     photo_img.style.display = ""; | ||||||
|     photo_img_holder.style.backgroundImage = "none"; |     photo_viewer.style.backgroundImage = "none"; | ||||||
|     photo_img_holder.onmousemove = null; |     photo_viewer.onmousemove = null; | ||||||
| } | } | ||||||
| function toggle_hoverzoom(event) | function toggle_hoverzoom(event) | ||||||
| { | { | ||||||
|     var photo_img = document.getElementById("photo_img"); |     var photo_img = document.getElementById("photo_viewer").children[0]; | ||||||
|     if (photo_img.style.opacity === "0") |     if (photo_img.style.opacity === "0") | ||||||
|     { |     { | ||||||
|         disable_hoverzoom(); |         disable_hoverzoom(); | ||||||
|  | @ -347,7 +335,7 @@ function toggle_hoverzoom(event) | ||||||
|         enable_hoverzoom(event); |         enable_hoverzoom(event); | ||||||
|     } |     } | ||||||
|     var content_body = document.getElementById('content_body'); |     var content_body = document.getElementById('content_body'); | ||||||
|     if (getComputedStyle(content_body).flexDirection != "column-reverse") |     if (getComputedStyle(content_body).getPropertyValue("--narrow") == 0) | ||||||
|     { |     { | ||||||
|         add_tag_box.focus(); |         add_tag_box.focus(); | ||||||
|     } |     } | ||||||
|  | @ -355,8 +343,8 @@ function toggle_hoverzoom(event) | ||||||
| 
 | 
 | ||||||
| function move_hoverzoom(event) | function move_hoverzoom(event) | ||||||
| { | { | ||||||
|     var photo_img_holder = document.getElementById("photo_img_holder"); |     var photo_viewer = document.getElementById("photo_viewer"); | ||||||
|     var photo_img = document.getElementById("photo_img"); |     var photo_img = photo_viewer.children[0]; | ||||||
|     var x; |     var x; | ||||||
|     var y; |     var y; | ||||||
| 
 | 
 | ||||||
|  | @ -371,10 +359,10 @@ function move_hoverzoom(event) | ||||||
|     */ |     */ | ||||||
|     var mouse_x = event.offsetX; |     var mouse_x = event.offsetX; | ||||||
|     var mouse_y = event.offsetY; |     var mouse_y = event.offsetY; | ||||||
|     if (event.target !== photo_img_holder) |     if (event.target !== photo_viewer) | ||||||
|     { |     { | ||||||
|         mouse_x -= photo_img_holder.offsetLeft; |         mouse_x -= photo_viewer.offsetLeft; | ||||||
|         mouse_y -= photo_img_holder.offsetTop; |         mouse_y -= photo_viewer.offsetTop; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* |     /* | ||||||
|  | @ -384,36 +372,36 @@ function move_hoverzoom(event) | ||||||
|     to both left and right. Otherwise 105% of 0 is still 0 which doesn't |     to both left and right. Otherwise 105% of 0 is still 0 which doesn't | ||||||
|     apply padding on the left. |     apply padding on the left. | ||||||
|     */ |     */ | ||||||
|     mouse_x -= (photo_img_holder.offsetWidth / 2); |     mouse_x -= (photo_viewer.offsetWidth / 2); | ||||||
|     mouse_x *= 1.05; |     mouse_x *= 1.05; | ||||||
|     mouse_x += (photo_img_holder.offsetWidth / 2); |     mouse_x += (photo_viewer.offsetWidth / 2); | ||||||
| 
 | 
 | ||||||
|     mouse_y -= (photo_img_holder.offsetHeight / 2); |     mouse_y -= (photo_viewer.offsetHeight / 2); | ||||||
|     mouse_y *= 1.05; |     mouse_y *= 1.05; | ||||||
|     mouse_y += (photo_img_holder.offsetHeight / 2); |     mouse_y += (photo_viewer.offsetHeight / 2); | ||||||
| 
 | 
 | ||||||
|     if (photo_img.naturalWidth < photo_img_holder.offsetWidth) |     if (photo_img.naturalWidth < photo_viewer.offsetWidth) | ||||||
|     { |     { | ||||||
|         // If the image is smaller than the frame, just center it |         // If the image is smaller than the frame, just center it | ||||||
|         x = (photo_img.naturalWidth - photo_img_holder.offsetWidth) / 2; |         x = (photo_img.naturalWidth - photo_viewer.offsetWidth) / 2; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         // Take the amount of movement necessary (frame width - image width) |         // Take the amount of movement necessary (frame width - image width) | ||||||
|         // times our distance across the image as a percentage. |         // times our distance across the image as a percentage. | ||||||
|         x = (photo_img.naturalWidth - photo_img_holder.offsetWidth) * (mouse_x / photo_img_holder.offsetWidth); |         x = (photo_img.naturalWidth - photo_viewer.offsetWidth) * (mouse_x / photo_viewer.offsetWidth); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (photo_img.naturalHeight < photo_img_holder.offsetHeight) |     if (photo_img.naturalHeight < photo_viewer.offsetHeight) | ||||||
|     { |     { | ||||||
|         y = (photo_img.naturalHeight - photo_img_holder.offsetHeight) / 2; |         y = (photo_img.naturalHeight - photo_viewer.offsetHeight) / 2; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         y = (photo_img.naturalHeight - photo_img_holder.offsetHeight) * (mouse_y / photo_img_holder.offsetHeight); |         y = (photo_img.naturalHeight - photo_viewer.offsetHeight) * (mouse_y / photo_viewer.offsetHeight); | ||||||
|     } |     } | ||||||
|     //console.log(x); |     //console.log(x); | ||||||
|     photo_img_holder.style.backgroundPosition=(-x)+"px "+(-y)+"px"; |     photo_viewer.style.backgroundPosition=(-x)+"px "+(-y)+"px"; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| tag_autocomplete.init_datalist(); | tag_autocomplete.init_datalist(); | ||||||
|  | @ -426,12 +414,12 @@ setTimeout( | ||||||
|     */ |     */ | ||||||
|     function() |     function() | ||||||
|     { |     { | ||||||
|         var left = document.getElementById("left"); |         var content_body = document.getElementById("content_body"); | ||||||
|         if (getComputedStyle(content_body).flexDirection == "column-reverse") |         if (getComputedStyle(content_body).getPropertyValue("--narrow") == 1) | ||||||
|         { |         { | ||||||
|             add_tag_box.autofocus = false; |             add_tag_box.autofocus = false; | ||||||
|         } |         } | ||||||
|         left.style.display = "flex"; |         document.getElementById("left").style.display = "flex"; | ||||||
|     }, |     }, | ||||||
|     0 |     0 | ||||||
| ); | ); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue