โมดูลจะถูกปิดการใช้งานตามขนาดอุปกรณ์หรือวิวพอร์ตใน Joomla 3 เพื่อเพิ่มประสิทธิภาพสำหรับอุปกรณ์พกพาได้อย่างไร


14

ฉันเป็นผู้สนับสนุน Responsive Web Design ร่วมกับ Adaptive Web Design (เช่น - การออกแบบหนึ่งที่ปรับการแสดงผลสำหรับอุปกรณ์ทั้งหมดและให้เนื้อหาตามขนาดพอร์ตมุมมอง) เมื่อเทียบกับการออกแบบไซต์ 'มือถือ' ที่แยกต่างหาก

ตัวอย่างเช่นมีข้อเสียบางประการบนหน้าจอขนาดใหญ่ฉันต้องการรวมบางโมดูลซึ่งจะถูกซ่อนไว้สำหรับขนาดวิวพอร์ตที่เล็กลง อย่างไรก็ตามในกรณีที่โมดูลถูกซ่อนอยู่ตามขนาดวิวพอร์ตการโหลดและการดำเนินการโมดูลนั้นทำให้เกิดการทำงานที่ไม่จำเป็นเมื่อทราบว่าโมดูลที่ระบุจะไม่แสดงที่ขนาดวิวพอร์ตที่เล็กลง

ฉันจะใช้ขนาดวิวพอร์ตเพื่อปิดการใช้งานโมดูลได้อย่างมีประสิทธิภาพ (เช่นหยุดมันจากการดำเนินการ) เพื่อเร่งประสิทธิภาพได้อย่างไร

คำตอบ:


15

Advanced Module Manager ( http://www.nonumber.nl/extensions/advancedmodulemanager ) ช่วยให้คุณสามารถกำหนดโมดูลตามเบราว์เซอร์ TYPE ดังนั้นคุณสามารถเลือกมือถือเดสก์ท็อปหรืออุปกรณ์เฉพาะ อย่างไรก็ตามมันไม่อนุญาตให้คุณเลือกตามขนาดดังนั้นมันจึงมีประโยชน์ในระดับหนึ่งเท่านั้น

อาจเป็นไปได้ด้วยการรวมกันของ php และ javascript ฉันจะส่งคำถามนี้ไปให้เพื่อนเขาเขาอาจมีความคิด


ช่างเป็นความคิดที่ดีฉันไม่เคยคิดที่จะใช้ AMM ด้วยวิธีนี้
jackJoe

ปีเตอร์ใส่ฟังก์ชั่นที่ยอดเยี่ยมมากมายไว้ใน AMM มันเป็นสิ่งที่ต้องมีในความคิดของฉัน
Faye

ฉันเห็นด้วยกับสิ่งนี้ ถ้าฉันติดกับชุดรูปแบบที่ไม่มีในตัว (ตัวอย่างเช่นชุดรูปแบบ warp 7) แล้วฉันจะใช้ AMM
Brian Peat

@BrianPeat - คุณสามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานกับ WARP7 ได้หรือไม่
NivF007

3
Warp 7 มีแผงควบคุมในเทมเพลตผู้ดูแลระบบที่ให้คุณคลิกปุ่มสำหรับเดสก์ท็อป / แท็บเล็ต / โทรศัพท์และเปิดและปิดโมดูลตามการตั้งค่าเหล่านั้น ชุดรูปแบบ Rocket ทำสิ่งที่คล้ายกับคลาสพิเศษ สิ่งที่ฉันไม่ทราบก็คือถ้าโมดูลถูกโหลดออกมาหรือถ้าทุกอย่างถูกโหลดแล้วซ่อนไว้ ฉันสงสัยว่ามันเป็นรุ่นหลังเนื่องจากคุณสามารถเห็นการเปลี่ยนแปลงในขณะที่คุณปรับขนาดเบราว์เซอร์ หากคุณลดขนาดของสิ่งต่างๆตามขนาดอย่างสมบูรณ์แล้วจะทำอย่างไรถ้าคุณปรับขนาดหน้าต่างอย่างแข็งขัน
Brian Peat

10

ฉันไม่คิดว่าคุณควรปิดใช้งานโมดูลเช่นนั้นและยังเรียกมันว่าการออกแบบที่ตอบสนองได้ ส่วนหนึ่งของจุดที่ตอบสนองคือมันจะตอบสนองต่อการเปลี่ยนแปลงของวิวพอร์ตและไม่ใช่เพียงแค่พิมพ์เค้าโครงที่แตกต่างกันสำหรับขนาดหน้าจอที่แตกต่างกัน

ขึ้นอยู่กับขนาดหน้าจอตัวอย่างเป็นไปได้ว่าแท็บเล็ตในโหมดแนวตั้งจะทำให้โมดูลไม่โหลด แต่จากนั้นแท็บเล็ตเดียวกันอาจต้องใช้เนื้อหาครั้งเดียวในโหมดแนวนอน


3
แม้ว่ามันจะเป็นจริง แต่ก็ไม่ได้ผลในทางปฏิบัติ ความหมายของผู้ใช้ iPhone จะไม่มีความละเอียดหน้าจอ 1440x900 และจะไม่มีความสามารถในการปรับขนาดวิวพอร์ตของพวกเขา การออกแบบที่ตอบสนองต่อผู้คนที่มีลักษณะเหมือน "โอ้วดูว่าสิ่งต่าง ๆ เปลี่ยนแปลงไปอย่างไรเมื่อฉันปรับขนาดหน้าต่างเบราว์เซอร์" มีผลเฉพาะกับนักออกแบบที่ต้องการแสดง ในทางปฏิบัติมันเป็นเรื่องที่สมบูรณ์แบบที่จะใช้วิธีปิดโมดูลและเปลี่ยนเอาต์พุตสำหรับขนาดหน้าจอที่แตกต่างกัน
Don Gilbert

3
@ Don ขออภัยมันไม่ได้ตอบสนองต่อการออกแบบและมีผู้คนมากมายบนเดสก์ท็อปที่ใช้ประโยชน์จากคุณสมบัติการปรับขนาดเมื่อทำงานใน windows การออกแบบที่ตอบสนองต่อการตอบสนองต่อวิวพอร์ตเปลี่ยนแปลงไม่ว่าจะมาจากอุปกรณ์บางอย่างหรือไม่
Spunkie

2
ฉันเห็นด้วย. แต่ฉันไม่เห็นด้วยกับเป้าหมายของ "การออกแบบที่ตอบสนอง" อย่างที่ฉันพูดมันเป็นความฝันของนักออกแบบที่จะอวด พวกเขาลืมความจริงที่ว่า iPhone จะไม่มีความละเอียดมากนัก tl; dr - การออกแบบที่ตอบสนองได้ไม่สำคัญกับอุปกรณ์พกพา ฉันต้องการประหยัดแบนด์วิดท์เครือข่ายมากกว่ามี "การออกแบบที่ตอบสนองอย่างแท้จริง"
Don Gilbert

2
@ DonGilbert และที่ Spunkie - IMO - คุณทั้งคู่พูดถูก คำจำกัดความ 'เข้มงวด' ของ Responsive Web Design ไม่รวมการแก้ไข 'เนื้อหา' - ฉันจะแก้ไขคำถามเพื่อรวม RWD / AWD - การออกแบบเว็บที่ตอบสนองและ Adaptive Web Delivery en.wikipedia.org/wiki/Responsive_web_design
NivF007

8

นี่คือคลาส JS ที่ฉันทำเมื่อไม่นานมานี้ที่สามารถใช้จาวาสคริปต์เพื่อตรวจจับวิวพอร์ตมันไม่เคยผ่านการทดสอบอย่างเข้มงวด แต่ใช้งานได้

function ResJS(){
    this.min = 0;
    this.max = 0;
    this.config = config;
    this.width = function(){
        return jQuery(window).width();
    }
    this.breakpoint = function(min,max){
        this.min = min;
        this.max = max;
        this.outside = false;
        this.inside = false;
        this.triggeredOut = false;
        this.triggeredIn = false;
        this.enter = function(callback){
            var context = this;
            jQuery(window).on('resize',function(){
                if(context.min<context.width()&&context.max>context.width()){
                    if(!context.triggeredIn){
                        jQuery(document).ready(function(){callback(context.min,context.max)});
                        context.inside = true; //browser width has entered breakpoint
                        context.outside = false; //browser has left another breakpoint
                        context.triggeredIn = true; //triggered event for breakpoint
                        context.triggeredOut = false; //be ready to trigger leave event
                    }
                }else{
                    context.inside = false; //browser width is not within breakpoint
                    context.outside = true; //brower width is outside of breakpoint
                }
            });
            if(context.min<context.width()&&context.max>context.width()){
                jQuery(document).ready(function(){callback(context.min,context.max)});
                context.inside = true;
                context.outside = false;
                context.triggeredIn = true;
                context.triggeredOut = false;
            }else{
                context.inside = false;
                context.outside = true;
                context.triggeredOut = true;
                context.triggeredIn = false;
            }
            return this;
        }
        this.leave = function(callback){
            var context = this;
            jQuery(window).on('resize',function(){
                if(context.outside&&!context.triggeredOut){
                    jQuery(document).ready(function(){callback(context.min,context.max)});
                    context.triggeredIn = false;
                    context.triggeredOut = true;
                }
            });     
            return this;
        }
        return this;
    }
    return this;
}

โดยทั่วไปคุณใช้มันแบบนี้

ResJS()
    .breakpoint(0,600)
    .enter(function(min,max){
        console.log(min,max,'enter');
    })
    .leave(function(min,max){
        console.log(min,max,'leave');
    });

จุดพักมีพารามิเตอร์ต่ำสุด / สูงสุดสำหรับความกว้างจากนั้นฟังก์ชั่นที่ถูกล่ามโซ่สำหรับการเข้าและออกด้วยการโทรกลับเพื่อเรียกใช้รหัส JS บางส่วน

ฉันไม่สามารถอธิบายรายละเอียดเกี่ยวกับวิธีการทำงานได้อย่างที่ฉันเคยทำเมื่อนานมาแล้ว แต่คุณสามารถใช้งานได้ฟรีหากมันจะช่วยได้ สิ่งนี้สามารถใช้เพื่อโหลดโมดูลผ่าน ajax ตามวิวพอร์ต ฉันเชื่อว่า com_ajax ของ joomla สามารถใช้กับสิ่งนี้เพื่อสร้างคุณสมบัติที่ยอดเยี่ยมจริงๆ


1
ดูเหมือนว่าปริศนาชิ้นสำคัญและมีความเป็นไปได้ที่น่าสนใจขอขอบคุณสำหรับคำตอบและโดยเฉพาะอย่างยิ่งสำหรับการโพสต์โค้ด
NivF007

1
คำตอบที่ดีที่สุดคือเพื่อนร่วมงานของฉันนี่เป็นความคิดของฉันไม่มากก็น้อย: P
Jordan Ramstad

3

โซลูชันอื่น:

คุณสามารถใช้การตรวจจับอุปกรณ์ฝั่งเซิร์ฟเวอร์เช่นนี้: http://mobiledetect.net/ที่นี่ปลั๊กอิน Joomla http://www.yagendoo.com/en/blog/free-mobile-detection-plugin-for-joomla.htmlจากนั้นขยาย joomla / templates / yourtemplate / html / modules.php ด้วยสไตล์ mod_chrome ของคุณเอง จากนั้นคุณสามารถเขียน php ได้มากหากคำสั่งที่คุณต้องการสำหรับอุปกรณ์หรือความละเอียดใด ๆ


3

หากคุณต้องการเพิ่มความเร็วประสิทธิภาพอย่าโหลดโมดูลที่ไม่จำเป็น หากไม่จำเป็นบนหน้าจอขนาดเล็กก็ไม่จำเป็นบนหน้าจอขนาดใหญ่

ผู้ที่มีอุปกรณ์แสดงผลขนาดใหญ่ก็ต้องการเว็บไซต์ที่รวดเร็วซึ่งไม่โหลด cruft ที่ไม่จำเป็น คุณกำลังทำข้อสันนิษฐานที่ผิดพลาดที่หน้าจอขนาดใหญ่มีแบนด์วิดท์มากกว่า พวกเขาทำไม่ได้

เป็นนักออกแบบที่ดีและมอบประสบการณ์การใช้งานเว็บไซต์ที่ดีที่สุดให้กับผู้ใช้ทุกคนโดยไม่คำนึงถึงขนาดหน้าจอ


2

ฉันขอแนะนำให้เบราว์เซอร์ดมกลิ่นเป็นวิธีที่ผิดไปที่นี่ หากคุณต้องการโหลดเฉพาะโมดูลตามความกว้างของหน้าจอจริงๆคุณต้องใช้งานจาวาสคริปต์ซึ่งจะเรียกใช้โมดูลโดย AJAX (com_ajax) โปรดทราบว่าอาจมีผลตอบแทนในแง่ของการเพิ่มประสิทธิภาพกลไกค้นหาสำหรับเนื้อหาที่โหลดโดย AJAX


2

ฉันมักใช้ css @media เพื่อทำให้สิ่งนี้เกิดขึ้น ทำให้ง่ายในการซ่อนสิ่งต่าง ๆ ขึ้นอยู่กับขนาดหน้าจอและให้พวกมันแยกวิเคราะห์ในบางครั้งเมื่อแท็บเล็ตแนวนอนกว้างพอที่จะแสดงและความกว้างแนวตั้งไม่ได้ นี่คือตัวอย่าง:

@media (max-width:699px) {
    #moduleid, .modulewrapperclass {display:none}
}

ฉันมักจะใช้สิ่งนี้เพื่อซ่อนตำแหน่งโมดูลทั้งหมดดังนั้นฉันจึงเลือกตัวเลือก css ไว้บน wrapper ของตำแหน่งนั้น (หรือตำแหน่งในเทมเพลตบางตัว)


ขอบคุณสำหรับคำตอบ. ปัญหาเกี่ยวกับวิธีสอบถามสื่อ CSS คือคุณยังคงดำเนินการโมดูล (แม้ว่าคุณจะเลือกที่จะไม่แสดง) วิธีการแก้ปัญหาที่ฉันกำลังมองหาจะไม่ดำเนินการโมดูลเว้นแต่จะปรากฏขึ้น
NivF007

อย่างที่คนอื่นพูดกันนั่นอาจไม่ใช่ความคิดที่ดีที่สุดสำหรับคนที่เปลี่ยนขนาดวิวพอร์ตหลังจากโหลดหน้าเว็บรวมถึงแท็บเล็ตแนวนอน ไม่กี่ร้อยวินาทีก็ใช้เวลาเซิร์ฟเวอร์ในการแยกโมดูลนี้จะไม่สำคัญมากและเนื่องจากมันจะแสดง: ไม่มีบนอุปกรณ์ขนาดเล็กที่คุณไม่แสดงมันจึงไม่เสียเวลาทั้งสอง - แต่ถ้าคุณไม่ต้องการโหลดมันจริงๆแล้ว Advanced Module Manager อาจเป็นวิธีที่จะเชื่อมโยงกับคำตอบอื่น
ผู้เบิกทาง

1

คุณสามารถโหลดได้ตามต้องการโดยใช้จาวาสคริปต์ที่เรียก com_ajax และส่งกลับเฉพาะโมดูลสำหรับขนาดปัจจุบัน


0

คุณสามารถใช้ส่วนต่อท้ายโมดูลร่วมกับแบบสอบถามสื่อ แม่แบบเฟรมเวิร์กหลายตัวมีสิ่งนี้อยู่แล้วภายในซึ่งคุณสามารถเพิ่มคลาสของ "โทรศัพท์ที่ซ่อนอยู่" เพื่อไม่ให้พวกเขาแสดงบนมือถือ พวกเขาเรียกพวกเขาเรียน CSS Helper:

GANTRY: http://www.gantry-framework.org/documentation/joomla/advanced/responsive_grid_system.md

WARP: http://www.yootheme.com/blog/2012/06/12/warp-gets-responsive

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.